상세 컨텐츠

본문 제목

[운영체제] 운영체제의 역사와 발전

자료실/컴퓨터 공부

by 깔깔앵무 2020. 4. 8. 00:33

본문

반응형

이번 포스팅은 운영체제의 태동과 발전에 대해 정리해보고자 한다.

 

 

<운영체제란?>

 

우선, 운영체제란

사용자 관점에서의 편의성자원 할당자로서 자원 활용의 효율성을 추구하기 위해

응용 프로그램과 하드웨어 사이의 중재 역할을 하는 시스템 소프트웨어를 말한다.

 

OS(Operating System)이라고도 한다.

 

 

운영체제는 앞서 말한 편의성과 효율성을 추구함과 동시에 다양한 입출력 장치의 운영 및 제어의 일관성 또한 추구한다.

 

이것이 운영체제의 존재 목적이고, 운영체제의 태동과 발전은 이런 목적을 달성하기 위해 진행되어왔다.

 

 

 

<운영체제의 역사>

 

 

0. 운영체제가 없던 시절

 

 

카드 천공기(왼쪽 위) 천공 카드(왼쪽 아래) 프로그램 드럼(오른쪽 위) 자기 테이프(오른쪽 아래)

 

운영체제가 없던 시절엔 프로그래머는 기계어 프로그램을 주로 자기 테이프(Tape)나 천공 카드(Punch Card)에 기록했다. (일일이 구멍을 뚫어 기록했기 때문에 상대주소가 아닌 절대주소만 사용되었다.)

 

당시 컴퓨터는 매우 귀했다. 그래서 프로그래머는 저렇게 자신이 만든 프로그램을 컴파일 하기 위해서 Sign-UP Sheet(예약 시트)에 원하는 시간을 적어 컴퓨터 사용 예약을 잡아야했다.

 

이렇게 예약 시간을 잡고 컴퓨터를 사용하려고 해도 프로그램의 연산을 제외한 모든 작업

 

  • 프로그램이 담긴 천공카드를 카드리더로 읽어 메모리에 적재하기
  • 컴파일 프로그램이 담긴 천공 카드도 읽혀 메모리에 적재된 작업 프로그램 컴파일 하기
  • 콘솔을 통한 프로그램 수행/디버깅 하기
  • 카드덱 형태의 라이브러리 사용하기

들을 프로그래머가 직접 콘솔이나 스위치를 이용하여 수행했다.

 

이렇게 각 프로그래머 마다 예약을 잡아 프로그램을 컴파일 하기까지 대기 시간이 발생하기 때문에 활용도가 떨어졌다.

또한 테이프나 천공 카드로 프로그램을 적재하는 방식이라 준비 시간도 오래 걸렸다.

 

 

이런 문제점을 해결하기 위해 효율성을 개선하고자 초기 일괄 처리 시스템이 등장했다.

 

 

 

1. 초기 일괄 처리 시스템

 

 

프로그래머들이 각자 따로따로 컴퓨터를 사용하려 하니 대기시간이 길어지고, 효율성이 떨어지니 비슷한 작업을 모두 한꺼번에 처리하면 되지 않을까?

 

이런 생각에 이들은 운영자(Operator)를 고용하여 사용자의 작업을 전문적으로 대행하기 시작했다.

 

운영자는 사용자들이 요구하는 비슷한 작업들을 일괄적으로 한꺼번에 처리했고

비슷한 작업을 연속적으로 처리하여 컴퓨터가 멈춰있는 시간을 줄여 효율성을 증가시켰다.

 

컴퓨터도 위성 컴퓨터(카드 리더기에 해당)와 주컴퓨터(CPU에 해당)로 분리하여, 위성컴퓨터에선 카드 입력과 결과 출력만을 담당했고, 주컴퓨터에선 연산만을 담당해 같은 작업만 시켜 그 효율성을 증가시켰다.

 

이렇게 운영자가 비슷한 작업들을 일괄적(Batch)으로 처리했기에

 

일괄 처리 시스템(Batch Processing System)이라고 한다.

 

 

 

초기 일괄 처리시스템 예시도

 

초기 일괄 처리 시스템으로 기존의 떨어지던 효율성을 개선했지만, 문제점이 하나 있었다.

 

바로 운영자가 사람이란 것이다.

 

운영자는 날고 기어봐야 사람이기 때문에 피곤해질 수도 있고, 병에 걸릴 수도 있다.

그로 인해 운영자가 자리를 비우게 되면 관리인이 없으니 컴퓨터를 사용할 수가 없고, 그게 아니더라도 운영자의 역량에 따라 작업의 효율성이 떨어질 수밖에 없었다.

 

이런 문제점을 타파하고자 고안 된 것이 '일괄 처리 시스템'이다.

 

 

 

2. 일괄 처리 시스템

 

운영자(사람)를 대체 하기 위해 고안 된 것이 '일괄 처리 시스템'이다.

 

운영자를 대신하기 위해 '채널', '버퍼', '인터럽트'란 개념이 도입되었고, 이는 훗날에도 계속 사용하게 된다.

 

일괄 처리 시스템


 

-채널-

 

컴퓨터의 CPU는 한번에 하나의 업무를 차례대로 처리하기에

주변 장치의 동작이 끝나야만 비로소 작업을 계속할 수 있다.

 

그로 인해 CPU는 주변 장치의 느린 속도 때문에 충분히 성능을 발휘하지 못하게 되는데, 이런 일이 없도록 주변 장치를 별도의 장치에서 조종할 수 있게 했는데, 이것이 바로 '채널'이다.

 

시스템 구성요소 중 하나로 명령어, 레지스터 및 입출력 제어장치로 구성되며, CPU와 함께 메모리를 공유한다.

 

CPU로부터 명령을 받아 CPU와 독립적으로 입출력을 실행함으로서 CPU의 효율을 증진 시켜준다.

(단, 메모리 사이클 경쟁 제어가 필요함)

 


 

-버퍼-

 

데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역을 말한다.

 

CPU와 채널 입출력의 병렬 수행을 위해 데이터 버퍼를 사용한다.

 

이로 인해 연산하는 동안 읽거나 쓰는 것이 가능하게 되어 입출력 대기시간을 없앴다.

 


 

-인터럽트-

 

사용자 프로그램이 아니라 하드웨어에 의하여 자동으로 메모리 특정부분에 있는 함수 (ISR : Interrupt Service Routine)를 호출하는 개념을 의미한다.

 

입출력의 완료와 예외동작 처리 (파일 종료, 테이프 끝, 패리티 오류 등)를 담당한다.

 

채널을 통한 입출력 버퍼링을 CPU와는 독립적으로 수행토록 하는 핵심 수단이다.

 


 

-상주모니터-

 

상주 모니터 그림

작업에서 다음 작업으로 넘어가는 전이 기간 동안에는 시스템이 대기 상태(유후 상태)에 놓이게 되는데, 

이러한 상태를 없애기 위한 방안으로 한 프로그램에서 다음 프로그램으로 자동적으로 넘어가도록 도와주는 상주모니터라는 개념이 출현했다.

 

시스템에 대한 제어권을 상주모니터가 갖고 있다가 어떤 프로그램이 주기억 장치에 적재 될 시에 시스템 제어권을 넘기게 되는 형식이다.

 

모니터는 주기억 장치 내에 항상 상주하고 있기에 상주모니터라고 부른다.

 

 

<상주 모니터에 의한 일괄처리 시스템의 작업 과정>

 

1. 프로그래머는 상주모니터에게 작업 제어카드를 전달

 

2. 상주 모니터는 작업 제어 카드가 지시하는 대로 자동 작업 순서화를 제공

 

3. 작업 제어 카드가 하나의 프로그램이 실행될 것이라는 것을 나타내면,

상주모니터는 프로그램을 기억장치에 적재하고 제어를 프로그램으로 넘김

 

4. 프로그램이 수행을 완료하면 제어는 상주모니터로 복귀

 

5. 상주 모니터는 다음 작업 제어 카드를 읽고 적합한 프로그램을 적재하는 일 등을 수행

 

6. 모든 작업 제어 카드가 작업으로 번역될 때까지 이러한 일은 반복되며, 상주모니터는 자동적으로 다음 작업을 계속 수행함. 

 

 

이렇게 하여 컴퓨터의 운영을 좀더 자동화시키게 된다.

 

 

 

<상주모니터 보호의 필요성>

 

하지만 잘못된 사용자 프로그램이 상주모니터 영역에 접근하여 덮어쓰는 일이 빈번히 발생함에 따라 상주모니터 보호의 필요성이 대두되었다.

 

 

그로 인해

 

모든 프로그램이 입출력을 직접하지 않고 상주모니터의 루틴을 호출하도록 하고,

(이로 인해 시스템 콜이 태동하였다)

 

미리 작성된 테이블에 기록된 허용치를 참조하여 각 연상(instruction) 수행 시 메모리 접근 범위를 제한했다.

 


 

 

이렇게 위 개념들으로 입출력 대기시간을 없애 효율성을 개선했다.

하나의 작업이 CPU를 독점하므로 작업당 처리 속도도 빨랐다.

 

그로 인해 사용자와의 대화가 필요하지 않은 CPU-bound 응용 프로그램 수행에 적합했다

ex) 수치 계산, 대용량 데이터 처리 등

 

하지만 단점이 있었는데, 작업을 일괄적으로 처리하기에 대화형 응용 프로그램에는 적합하지 못했다.

 

가령 YES/NO를 계속 입력 받아야하는 프로그램을 구동했다고 치면, 답변이 올때까지 프로그램은 멈춰있을 것이고,

CPU는 현재 진행중인 작업이 다 끝날때까지 다음 작업으로 넘어가지 않을 것이다.

 

즉, 다른 프로그램을 돌리지도 못하고 발이 묶이는 것이다.

 

 

이런 문제점을 해결하기 위해 등장한 것이 다중 프로그래밍 시스템이다.

 

 

 

 

3. 다중 프로그래밍

 

다중 프로그래밍은 한 프로그램이 입출력을 하는 동안 다른 프로그램을 선정하여 CPU가 실행하는 방식을 말한다.

 

입출력 중 다른 프로그램의 프로세스를 처리하게 하여 대기 시간을 줄이고 CPU의 효율성을 극대화 시켰다.

 

여러 개의 작업을 준비상태에 두고 관리하며, 어느 한 작업을 실행할 작업으로 장치를 선정하기 위해 기억장치 관리기법이나 CPU 스케줄링 기법을 필요로 한다.

 

또한, 디스크를 이용한 버퍼링(Buffering)과 스풀링(Spooling)으로 입출력과 CPU 수행의 중복 정도를 높일 수 있게 됐다.

 

 

 

이렇게 다중 프로그래밍으로 여러 프로그램을 한 CPU로 끊임없이 굴릴 수 있게 되었지만 단점이 하나 있었다.

 

만일 한 프로그램이 버그가 있어 무한 루프가 걸리게 된다면, 입출력 요구가 일어나지 않아 CPU 스케줄링도 일어나지 않게 되는 것이다. 이로 인해 다른 프로그램도 동작하지 못하는 등 프로그램 간 간섭이 생기는 문제점이 있었다.

 

이 문제점을 해결하기 위해 등장 한 개념이 바로 '시분할 시스템'이다.

 

 

 

 

4. 시분할 시스템

 

 

다중 프로그래밍은 무한 루프에 걸려 입출력 요구가 발생되지 않는 점에서 문제점이 발생했다.

 

그렇다면 일정 주기마다 계속 입출력 요구를 시키면(CPU 스케줄링을 하면) 무한 루프에 걸려도 다른 프로그램으로 넘어가 동작할 수 있지 않을까?

 

 

이런 생각에서 착안해 시분할 시스템에선 '타임 슬라이스(Time Slice)'란 개념을 도입했다.

 

시간(Time)을 분할(Slice)해서 일정 시간 간격마다 스케줄링을 무조건 시행하게 하는 것이다.

 

이렇게 하여 사용자와의 대화성을 증진시키게 되었고, 결과적으로 효율성에 편의성까지 증진시키는 효과를 가져왔다.

 

여러 사용자가 개인용 모니터를 통하여 한 시스템에 동시에 연결하여 동시 사용이 가능해졌다.

 

또한 가상 메모리의 적용으로 여러 프로그램의 동시 적재로 인한 메모리 부족을 개선!

실제 메모리보다 더 큰 프로그램의 수행도 가능해졌다.

 

1960년 MIT의 CTSS가 시초이며, 하드웨어 여건 부족으로 1970년대에 최초로 상용화되어 현재까지 운영체제의 기본적인 체계로 자리잡게 되었다.

 

 

 

반응형

관련글 더보기