본문 바로가기

운영체제/기본

운영체제의 발전(2) - Multi-programmed Batch Monitor

운영체제의 발전(2) - Multi-programmed Batch Monitor


multi-programmed

- 컴퓨터가 한번에 한 개 이상의 active한 Job을 수행시킨다는 의미.

( active Job? 수행을 시작했지만 아직 종료되지 않은 프로그램 )


multi-programming

- 컴퓨터 시스템의 메인 메모리에 동시에 여러 개의 active job이 존재하는 것.


 OS

Job-1 

Job-2 

Job-3 

Job-4 

< main memory >


* degree of multi-programming

- the number of active job in main memory.


multi-programming을 이용하여 CPU가 Job-A를 수행하다가 synchronous I/O operation을 만나면 I/O channel(=I/O controller)에게 해당 I/O command를 전달하고 다른 Job-B를 수행함으로써 CPU utilization 향상을 꾀했음.


그러나, multi-programming에서는 아래와 같이 큰 3가지 문제가 존재했다.( 이 시기가 1960년대이다. )


(1) Memory Protection

- Job-1이 Job-2의 메모리 영역을 접근하여 메모리를 write하는 경우가 발생할 수 있다.

- 혹은 Job-1이 운영체제의 메모리 영역을 접근하여 메모리를 write하는 경우가 발생할 수 있다.

- 위와 같은 경우가 발생하면 program이 정상 동작 할 수 없기때문에 위 문제를 반드시 해결해야 했다.

어떻게? Job-1이 메모리 접근 연산을 수행할 때 해당 메모리가 Job-1에게 할당된 메모리 영역 내부인지 검사한다.


(2) Memory Relocation

- Job이 한 개만 있을땐 절대주소를 사용하여 프로그래밍했다.

- 그러나, multi-programming에서는 메인 메모리 어느 위치에 내가만든 job이 할당될 것인지 알 수 없기 때문에 절대주소로 프로그래밍할 수 없었다.

따라서, 프로그램이 임의의 주소에서도 수행될 수 있도록 바꾸어야 했다.

이 문제를 해결하기 위해 고안된것이 Base register, Bound register이다.



- 프로그래밍할때 사용한 주소(x)는 해당 Job의 Base register값에 더해져서 사용된다. ( Base register + x )

- 또한, 접근하고자 하는 메모리 영역(Base register + x)의 값이 Job1에게 할당된 메모리 영역인지 검사하기 위해 Base register + Bound register의 값과 비교한다.

* Bound register에는 Job-1에게 할당된 메모리 크기가 적혀져 있다.


결과적으로, CPU는 논리주소(Logical address)를 사용하지만 이를 MMU(Memory Management Unit)물리주소(Physical Address)로 변환해주며 Job1이 허가되지 않은 메모리를 접근하고 있는지를 검사한다.

즉, MMU를 통하여 (1) Memory Protection, (2)Memory Relocation을 해결했다.


이러한 MMU는 S/W로 구현하는 것이 바람직할까? 아니면 H/W로 구현하는 것이 바람직할까?

결론부터 이야기하면 MMU는 H/W로 구현하는 것이 맞다.

왜냐하면, (1) 주소변환을 S/W로 하게되면 매 instruction마다 성능저하가 일어난다. (2) MMU또한 코드이므로 메모리 어딘가에 있을 텐데 그 메모리를 접근하기 위한 또 다른 솔루션(memory protection, memory relocation을 해결하는 ..)이 필요하게 된다. 즉, 재귀적인 문제가 발생한다.

따라서, MMU는 하드웨어로 구현하는 것이 맞다.


운영체제(OS)입장에서 MMU는 transparent한가? 즉, MMU의 존재를 고려하지 않고 운영체제를 개발해도 되는 것일까?

정답은 아니다. 왜냐하면, Job-1에서 Job-2로 transition될 때 하드웨어가 가지고 있는 Base register값과 Bound register의 값을 Job-2에 맞는 정보로 업데이트 해줘야 하기 때문이다.


Base register값과 Bound register의 값은 운영체제 이외의 job도 값을 변경해도 되는 것일까?

정답은 아니다. 왜냐하면 다른 job이 Base register와 Bound register의 값을 이상한 값으로 바꿔버리면 프로그램들이 정상동작 할 수 없으므로 반드시 운영체제만 해당 레지스터 값을 변경하는 권한을 가져야 한다.

즉, Base register, Bound register의 값을 변경하는 명령은 "Privileged instruction"이다.


(3) Concurrent programming

- 여러 Job들이 동시에 수행되면 공유 자원이나 공유 데이터에 동시에 접근함으로써 생기는 문제를 해결할 필요가 있다.