오퍼레이팅 시스템 [4] - OS의 탄생과 변화
‘OS의 역할과 발전과정’
오퍼레이팅 시스템
지금까지는 운영체제를 이해하는데 필요한 기본적인 컴퓨터의 구조와 특징에 대해 다뤘다면, 지금부터는 본격적으로 OS에 대해 다루도록 하겠다.
OS의 목적
- 기계와 적용 프로그램의 Interface 역할을 하는 프로그램. 하드웨어의 복잡한 디테일을 개발자들이 보기쉽고 간편하게 만든다
- 가장 큰 목적은 프로세서에게 지시를 내려, 컴퓨터의 자원을 실행중인 프로그램들에게 동적으로 분배 (Dynamically allocate)해주는 것이다.
따라서 운영체제의 연구분야는 자동적으로 메모리, 프로세스, I/O 장치들의 스케쥴링과 관리에 집중된다.
- OS의 주 목적 3가지
- Covenence : 컴퓨터 사용에 있어서의 편의성
- Efficency : 컴퓨터 자원사용의 효율성
- Ability to evolve : 새로운 시스템 기능이 추가되었을때 서비스에 문제없이 적용, 테스트 해볼수 있는 능력
OS의 진화과정
운영체제는 몇가지 원인에 따라 계속해서 진화해 왔다.
- 새로운 종류의 H/W
- 새로운 서비스
- 수정
- 일반적으로 OS의 기능들이 H/W로 이동되고, S/W로 처리했던 기능들은 OS의 기능에 포함되어왔다.
1. SERIAL PROCESSING (순차처리)
- Serial Processing (1940후반~ 1950중반)
- OS가 존재하지 않았고, 사람이 Human Operater 로서 OS의 역할을 대신했다.
- 모든 작업이 순차적이었고 개발자들은 직접 H/W를 다뤘다.
- 문제점
- Human OS의 문제로 그당시 비싼 자원들을 효율적으로 사용하지 못했다.
- 작업간 전환 속도가 너무 느렸다.
- High setup time과 비효율적은 scheduling 으로 인해 사용자간 낭비되는 시간이 많았다. (사용 시간이 초과되면 데이터 손실)
2. SIMPLE BATCH SYSTEM
- 당시의 컴퓨터는 매우 비쌌으므로, 편의성 보다는 사용 효율을 극대화하는 것이 중요했다.
- 비슷한 일을 모아서 시키자!
- 비슷한 작업들을 한번에 batching 하면서 SETUP TIME의 감소.
- 자동 작업 순차실행
- 최초의 OS탄생
- FIRST BATCH OS : 특정 기능을 하는 Data들이 항상 메인메모리에 존재해야 한다는 것을 깨닫고, 이를 Resident Monitor라고 불렀다. (OS대신 monitor라는 명칭을 사용)
ex) Interrupt processing, Device driver, Job seqencing...
- 특정 작업이 실행되면, 제어권을 해당 작업에 넘겨주고, 작업이 마무리된 후 다시 Monitor에게 돌려준다.
- FIRST BATCH OS : 특정 기능을 하는 Data들이 항상 메인메모리에 존재해야 한다는 것을 깨닫고, 이를 Resident Monitor라고 불렀다. (OS대신 monitor라는 명칭을 사용)
- OS의 등장으로 인한 필요 조건들
- Memory Protection
- 유저영역에서 Memory 일부를 차지하는 Monitor 영역에 침범할 수 없도록한다.
- I/O protection(Privileged intructions)
- 유저 프로그램은 I/O에 직접 접근하지 못하고, 커널(모니터)에 요청해야한다.
- 해당 조건들은 DUAL MODE라는 개념을 만들어냈다.
- OS의 기능을 이용할 수 있는 Kernel Mode 와 기능이 제한적인 User Mode의 분리.
- CPU protection
- 하나의 작업이 무한루프 되는 등의 이유로 CPU를 계속 독점하는 경우 예방
- System Timer 의 개념을 도입해, 유저의 CPU 사용시간을 제한하였다.
- 이때 Timer 는 당연히 OS만 접근할 수 있도록 제한하여야 한다.
- Interrupts
- Interrupt를 보냄으로서 유저 프로그램을 중지하고 커널이 제어권을 돌려받을 수 있게함.
- I/O device controller
- 독립된 프로세서를 갖고있으며, I/O 과정이 끝나면, CPU에게 Interrput를 보내는 역할을 한다.
- I/O의 종류
- Synchronous I/O : I/O 과정이 끝나야 제어권이 프로그램에게 돌아와 수행가능하다.
- Asynchronous I/O : I/O 단계가 시작된 즉시 제어권이 다시 프로그램에게 돌아온다.
- Simple Batch System의 문제
- Automatic job sequencing 방식에도 불구하고, 프로세서의 작업에 비해서 I/O 장치의 속도가 매우 느리다.
이로인해 CPU가 종종 IDLE한 상태로 대기하게 된다.(Synchronous I/O의 경우)
- 멀티 프로그램의 필요성이 대두되었다.
3. Multiprogrammed Batch Systems
- CPU 효율을 최대로!
- Uni-Programming : 프로세서가 하나의 작업만을 하며, I/O 중에는 IDLE한 상태로 대기한다.
- Multi-Programming : 프로세서가 여러 작업을 수행하며, 하나의 작업이 I/O를 대기해야 하는경우, 다른 작업을 수행하는 방식으로 프로세서가 IDLE한 상태로 대기하는 시간을 단축한다. (=Multi Tasking)
- 필요조건
- Relocation
- 계속해서 실행되는 작업이 달라지므로, 프로그래머는 매번 어디에 필요한 DATA가 저장되어 있는지 알 수가없다. 따라서 각 작업에 필요한 DATA들의 메모리 위치를 계속해서 변경해주어 프로세서의 효율을 최대화 시킬수 있어야한다.
- Memory Protection
- 계속해서 DATA의 주소가 변경되므로 다른 작업의 주소를 침범하지 않게 보호하고 확인하는 과정의 필요성이 더욱 증가했다.
- MMU(Memory Management Unit)
- Adder, Comparator 등의 장치를 통해 프로그램에서 사용되는 Logical Address와 실제 메모리에 데이터가 저장되어 있는 Physical Address를 번역해주는 역할을 한다. 즉, 프로그램이 필요한 데이터에 접근할 수 있도록 해준다.
- 물론 MMU를 실행할때 Instruction이 실행되어서는 MMU를 통해 해당 주소에 접근할 수가 없으므로, 하드웨어로 구현해야 한다.
4. Time Sharing Systems
- 탄생배경
- 과거와 다르게 복잡해지는 OS의 역할에 Humman OS가 불가능해졌고, 하드웨어는 상대적으로 저렴해지며 인적자원은 상대적으로 비싸져 장치의 효율보다는 반응속도의 중요도가 올라갔다 (인간의 생산성 증가)
- 작동원리 : 모든 작업에 터미널을 제공하고, 정해진 시간동안 하나의 작업이 이루어지도록 한후, Process Switch하여 프로세서를 회수하고 Ready Queue에 있는 다음 작업을 실행시키는것.
- Preemption(선점) : 작업이 실행되고 있는 도중에, 다른작업이 우선적으로 CPU를 차지하는것.
ex) CTSS (1962), MULTICS (1965), UNIX (1970)
- Time slice and Preemption의 예시
- Time slice 마다 preemption이 일어나므로 모든 프로세스의 Response time(작업이 시작할때까지 걸리는 시간)은 감소하지만, Turnaround Time(작업이 시작되고 완전히 종료될때까지 걸리는 시간)은 언제나 감소하지는 않는다.
새로운 개념의 등장
- MultiProgramming 과 Time Sharing의 여러 조건들로 인해 OS에 새로운 개념들이 등장하기 시작했다.
- 프로세스
- 스케쥴링(Scheduling)과 자원관리
- Synchronization
- Memory management
- Resource Protection (=I/O protection)
- Process
- 현재 실행중인 프로그램. 실행가능한 프로그램, 프로그램에 필요한 DATA, 실행에 필요한 자원등의 정보의 3가지 요소로 구성되어있다.
세부내용은 다음장에서 다룬다.
- Scheduling and Resource Management
- short-term Scheduler
- OS가 ready Queue의 크기를 정하고, 메인메모리에 올라와 있는 프로세스들이 해당 큐에 대기하면, 특정 기준에 따라 다음에 실행될 프로세스를 정하는 시스템
- 모든 자원 할당과 스케쥴링은 몇가지 요소를 고려한다.
- 공정성(Fairness) : 모든 프로세스가 공평하게 자원에 접근할 수 있는것.
- 효울성(Efficiency) : Throuput을 최대화, Response Time을 최소화
- 우선권 (Differential responsiveness) : 요구사항에 따라 작업들을 분류하는것.
- 공정성과 효율성의 trade off 가 발생한다.
- Synchronization
- 프로그램들이 메모리를 같이 사용할때 발생하는 문제, 혹은 서로가 자원을 놓기를 기다리는 교착상태(Deadlock) 등에 관한 해결법
- Memory Management
- Virtual Memory
- 물리적으로(Physically) 메인메모리에 수용가능한 용량을 고려하지 않고, 조금더 논리적인(Logically) 시점에서 메모리 주소를 사용하는 방법.
- 분산적재, 부분적재
- 분산적재(Paging system)
- 여러조각으로 나눠서 메모리 공간을 효율적으로 사용하며 메인메모리에 저장하는 방식
- 부분적재 : 같은 프로그램의 데이터라도, 꼭 필요한 데이터(Pages)만 메인메모리에 올리고, 나머지는 Disk에 남겨두는것.
- 앞서다룬 MMU 가 Virtual Memory의 주소를 실제 Physical 주소로 변환시켜(부분적재로 인해 메모리뿐만이 아니라 Disk주소까지) 데이터에 접근할 수 있도록 한다.
- Resource Protection
- 앞서 말했던것처럼 유저레벨에서 해당 프로그램 외의 메모리 접근, I/O 접근을 막기위해서 User모드와 Kernel 모드로 분리하였다. 이때 두 모드를 전환하기 위해서는 System call 을 요청해야한다.
- System Call
- 프로세스가 커널모드의 서비스를 이용하기 위해 요청하는 것으로 application이 OS와 상호작용할 수 있도록 해준다.
나 이 자원이 필요해!
- 목적 : 시스템 자원을 보호, 무한루프 등의 버그유발 유저 프로그램의 차단, 무단으로 다른 자원에 접근하는 프로그램 차단
- 직접 프로세스를 통해 System call을 요청하기는 어렵지만, 지금은 library를 통해 쉽게 가능하다.
ex) 라이브러리 함수 printf -> I/O기능 write()
- 유저가 커널모드에 진입하기 위해서는
- Interrput
- Exception
- System call 의 3개중 최소 하나가 필요하다.