CS/운영체제

[운영체제] 4. Limited Direct Execution

공영재 2023. 10. 2. 21:11

Reference - Operating Systems: Three Easy Pieces

 

 

https://pages.cs.wisc.edu/~remzi/OSTEP/

 

Operating Systems: Three Easy Pieces

Blog: Why Textbooks Should Be Free Quick: Free Book Chapters - Hardcover - Softcover (Lulu) - Softcover (Amazon) - Buy PDF - EU (Lulu) - Buy in India - Buy Stuff - Donate - For Teachers - Homework - Projects - News - Acknowledgements - Other Books Welcome

pages.cs.wisc.edu

 

CPU virtualization

 

이전 포스팅에서 CPU virtualization을 통해 여러 프로세스가 각각의 CPU를 가진 것처럼 동작한다고 했다.

이는 Time Sharing을 통해 가능하고, 그 과정에서 Context switch가 발생한다.

이를 알아보기 위해 Process State란 개념을 알아야한다.

 

Process State

위는 프로그램이 실행중일 때 running, 프로그램이 실행되지 않은 상태를 ready, I/O를 포함한 CPU, memory 밖에서의 모든 요청으로 인해 프로세스가 잠시 멈추는 상태를 blocked로 표현한 diagram이다.

그리고 프로세스 관리에 필요한 정보(process state, process ID, counter, context switch, ...)를 저장하는 PCB(process control block) 자료구조를 통해 OS가 프로세스를 관리한다. 참고로 PCB 자료구조는 커널 메모리 영역에 저장된다. 추후 자주 등장할 개념이니 기억해두자.

 

CPU를 virtualizing할 때 OS는 time sharing을 통해 물리적인 하나의 CPU를 여러 프로세스에서 공유하도록 한다.

이때 time sharing 과정에서, 두가지 중요한 문제가 있다. 제어권성능에 관한 issue다. 앞으로 차차 살펴보겠다.

 

Limited Direct Execution

 

Direct Execution이란 프로그램이 수행하면 종료될 때까지 수행하는 방법이다.

하지만 그렇게 된다면, 여러 프로세스를 동시에 수행해야하는 컴퓨터가 원활하게 동작할 수 있을까?

프로그램 실행 중 디스크에 대한 I/O 요청이 들어왔을 때 해당 프로세스로 전환할 수 없어 문제가 발생할 것이다.

만약 프로세스가 무한루프에 걸려 끝나지 않는다면, 제어권을 OS가 가져갈 수 없어 컴퓨터가 무용지물이 될 것이다.

이러한 문제들을 방지하기 위해 Direct Execution에 제한을 걸어 CPU를 Virtualizing할 수 있다.

그 제한은 바로 "system call"과 "Timer interrupt"다.

 

System Call

 

System Call이란 유저 모드와 커널 모드를 나눠, 프로세스가 컴퓨터의 자원에 마음대로 접근할 수 없도록 만든 것이다.

유저 모드에서 프로세스가 실행되다가 자원이 필요한 순간에 Trap 명령어를 실행하게 되면 OS의 관리 하에 kernel mode에 들어가 작업을 수행하고, 작업이 끝나면 OS가 return-from-trap 명령을 통해 유저 모드로 돌아오게 된다.

 

실제 프로세스의 실행과정을 살펴보면, 컴퓨터는 부팅 시 커널모드에서 trap table을 만든다. 그 뒤 프로세스를 생성하고, 유저 모드에서 main()을 수행하다 필요 시 syscall을 요청하여 trap을 통해 커널 모드로 들어가 필요한 작업을 수행하고 return-from-trap을 통해 유저 모드로 돌아오는 과정을 반복하다 작업이 끝나면 프로세스를 제거하게 된다.

 

위에서 언급했던 프로세스 하나에 대한 제어권은 이러한 방식으로 OS가 해결한다.

남은 문제인 여러 개의 프로세스를 동시에 실행할 때는 어떻게 해결해야할까?

 

Timer Interrupt

 

컴퓨터는 사람이 느낄 수 없는 짧은 시간동안 프로세스들을 스위칭하며 실행하는 방식으로 동시에 실행되는 것처럼 보이게 하는데, 이를 Time sharing 기법이라 한다. 이때, OS가 제어권을 통솔하며 어떤 프로세스를 먼저 수행할지 등을 정할 수 있어야 한다. OS가 제어권을 가져오기 위한 방법으로 2가지가 있다.

첫번째 방법은 프로세스가 서로 협력하는 방법이다. 프로세스가 syscall을 발생시키면 OS가 제어권을 가져가고, OS가 프로세스를 스케줄링한 뒤 다음 프로세스에게 제어를 넘긴다. 하지만 프로세스가 syscall을 발생시키지 않는다면 큰 문제가 생길 수 있다. 이를 방지하기 위해 컴퓨터는 두번째 방법인 Timer interrupt를 사용한다.

 

Timer interrupt란 trap처럼 소프트웨어적인 방식으로 동작하는 것이 아닌, 하드웨어적인 방식으로 일정시간마다 Interrupt를 발생시켜 OS에게 제어권을 주는 방법이다. CPU는 내부 클럭에 의해 동작하는데, 이 클럭이 일정한 주기를 지날때마다 interrupt를 발생시키도록 한 것이다. 하지만 이렇게 프로그램의 종류와 상관없이 일정시간마다 interrupt를 발생시켜 프로세스를 중단시키면, 진행중이던 프로세스의 정보를 기억해야 한다. 이때 필요한 방법론이 context switch다.

 

Context Switch

 

context란 프로세스에 대한 정보이며, 하드웨어 register의 집합이다. Context switch를 진행할 때 context를 저장하고 복구하는 작업이 필요한데, 두 가지를 각각 context save, context restore이라 한다. 이 데이터들은 위에서 말한 PCB 자료구조에 저장된다. 프로세스가 실행되다 timer interrupt가 발생하면 레지스터에 기존 프로세스의 context를 저장하고 다음 프로세스의 context를 복구한 뒤 실행하게 된다. 이러한 과정에서 overhead(간접비용)이 발생하게 되고, 이를 최적화하기 위한 여러 스케줄링 기법이 있다.