*이 글은 Operating Systems: Three Easy Pieces(운영체제 아주 쉬운 세 가지 이야기)를 바탕으로 작성되었습니다. 첨부한 모든 그림은 해당 도서에서 가져온 자료입니다. 내용 중 잘못된 부분이 있다면 알려주세요 :)
우리는 여러 프로그램을 동시에 실행하길 원한다.
이를 위한 OS의 핵심 개념이 process, 실행 중인 program이라는 것을 지난 글에서 알아보았다.
OS는 CPU를 time-sharing하여, 실행 중인 process를 다른 process로 scheduling하여 context switch함으로 여러 프로그램이 동시에 실행하는 환상을 만들어준다고 했었다.
그럼 어떻게 CPU time-sharing을 효율적으로 할 수 있을까?
- 시스템에 오버헤드 없이 구현할 수 있을까?
- CPU control을 유지하며 실행시킬 수 있을까?
🧐 Limited Direct Execution
프로그램을 CPU 상에서 그냥 직접 실행하는 것이다.
자, 위 과정에는 문제가 있다.
- 프로그램 실행 시, OS를 건들지 않는다는 보장있나?
- 프로그램 실행 시, OS가 어떻게 control할 수 있나?
즉, time sharing을 어떻게 구현할 수 있을까?
위 단계처럼 프로그램 실행에 제한을 두지 않으면, OS의 존재 이유가 무엇인가.
그럼 이 문제를 해결해보자
🧐 문제1. 프로그램 실행 시, OS를 건들지 않는다는 보장있나?
직접 실행의 장점은 프로그램이 CPU에서 실행되기 때문에, 빠르다는 것이다.
하지만, 프로세스가 restricted operation을 수행한다면?
(예를 들어, 디스크 입출력 요청, CPU나 메모리 추가 자원 할당)
OS는 이를 막기 위해, User mode & Kernel mode를 도입했다.
- User mode: 사용자 모드로, 하드웨어 자원에 접근에 제한이 있다.
- Kernel mode: 커널 모드로, 모든 자원에 접근 권한이 있으며 OS의 중요한 코드들이 실행된다.
그렇다면 User mode의 사용자는 restricted operation 절대 실행할 수 없을까?
이를 위해 System call을 제공한다.
- System call: 자신의 주요 기능을 사용자 프로그램에게 제공한다. (Interface만 열어줌)
- 시스템콜을 실행하기 위해 program은 trap instruction을 실행한다.
- trap instruction은 kernel로 jump하며, kernel mode로 변환해준다.
- 완료 시, OS는 return-from-trap instruction을 호출한다.
- return-from-trap은 user program으로 되돌아가며, user mode로 돌아간다.
자세한 과정으로 살펴보자.
전체적인 과정은 아래와 같다.
하나하나 살펴보자
- 커널은 부팅 시에 trap table을 만들고, 이를 이용하여 시스템을 통제한다.
- 현재 커널 모드 이기 때문에, 하드웨어를 자유롭게 제어할 수 있다.
- 초기 OS는 하드웨어에게 예외 사건이 생길 때, 특정 명령어로 하드웨에에게 trap handler의 주소를 알려준다.
- 하드웨어는 trap handler의 주소를 기억한다.
🧐 문제2. 프로그램 실행 시, OS가 어떻게 control할 수 있나?
OS는 실행 중인 프로세스를 계속 실행할 것인지, 다른 프로세스를 실행할 것인지 결정해야한다.
- 협조적인 방법은 yield같은 system call을 계속 기다리는 것이다.
하지만, 이 방법은 너무나 이상적.... 프로그램이 무한으로 돌 수도 있다. - 비협조적인 방법은 OS가 제어권을 갖는 것이다.
OS가 통제권을 갖는 방법은 뭘까?
timer interrupt를 이용하는 것이다.
- timer interrupt
- 타이머 장치는 주기적으로 interrupt를 발생한다.
- interrupt 발생 시, OS의 interrupt handler가 실행된다.
- OS는 CPU 제어권을 다시 얻게 된다.
🧐 Context Switch
OS가 제어권을 얻으면 계속 process를 실행할 것인지, 다른 process를 실행할 것인지 결정해야한다.
이 결정을 scheduler가 한다.
다른 프로세스를 실행하기로 결정되면, OS는 context switch를 실행한다.
- Context switch
- 현재 실행 중인 프로세스의 레지스터 값을 커널 스택에 저장하고
- 실행될 프로세스의 커널 스택으로부터 레지스터 값을 가져온다.
CPU 가상화의 핵심
time sharing, context switch에 대해 자세히 알아보았다.
'기본 > 운영체제' 카테고리의 다른 글
[OS] 메모리 가상화(Memory Virtualization): 6. Paging: TLB (0) | 2024.05.25 |
---|---|
[OS] CPU 가상화 (CPU Virtualization): 1. 프로세스란 (1) | 2024.04.20 |
[OS] 메모리 가상화(Memory Virtualization): 5. Paging: 개요 (1) | 2024.04.20 |
[OS] 메모리 가상화(Memory Virtualization): 4. Free-Space Management (0) | 2024.04.19 |
[OS] 메모리 가상화 (Memory Virtualization): 3. Segmentation (1) | 2024.04.12 |