[운영체제] CPU_Virtualization
1. 운영체제
컴퓨터의 자원들을 관리해 시스템이 정확하고 효율적으로 동작하도록 만들어주는 소프트웨어.
→ virtualization 을 이용해 !
- Virtualization? 물리적 자원(CPU, Memory 등)을 가상의 형태로 변경해 프로그램에 메모리를 혼자사용하는 것처럼 느끼게 만들어 주는 것!
→ Concurrency 문제가 발생한다. - System Call 을 이용해 운영체제랑 소통할 수 있다.
2. 프로세스
프로세스는 실행중인 프로그램.
- CPU 상태(register) : PC, SP, registers...
- Memory(address space) : instruction, data section
프로세스를 만드는 과정
- 프로그램 코드를 메모리(프로세스의 address space)에 Load
프로그램은 disk에 실행가능한 형태로 존재.
Lazy Loading을 이용(실제 데이터를 사용할때 메모리에 로딩)- BSS : 초기화 되지 않은 값
- Data : 초기화 된 값
- Stack 할당.
local variable, parameter, return address 등을 위한 스택공간 할당. - Heap 할당.
동적 메모리 할당을 위한 공간. - OS가 초기 task 수행
Input/Output Setup
프로세스는 기본적으로 세개의 fd(std input, output, error)를 가지게 됩니다. - 프로그램 실행 !
프로세스의 상태
- Running : 프로세서에서 동작중인 상태
- Ready : 동작할 준비가 되어있지만 OS의 선택을 못 받은 상태
- Blocked : disk I/O 같은 동작을 수행하고 있어 다른 프로세스들이 프로세서를 사용할 수 있도록 하는 상태

이런 프로세스들을 관리하기 위해 PCB(Process Control Block)을 이용
메타데이터, 메모리 정보 등을 저장.
3. System Call
fork() - 메모리 상태, 레지스터 , PC 가 똑같은 프로세스를 새롭게 만드는 것.
exec() - 다른 프로그램을 실행시키는 작업
wait() - child 프로세스가 종료될 때까지 기다리는 작업
4. Limited Direct Execution
그렇다면 어떻게 Virtualization을 수행할 수 있을까?
→ Time Sharing을 통해서
- Performance - 오버헤드 없이 구현하는 방법
- Control - CPU에 대한 제어를 유지하면서 실행시키는 방법
이 두가지를 고려해서 수행해야 합니다.
Direct Execution - 한 번 프로그램이 실행되면 종료될 때 까지 프로그램이 실행 되는 것.
→ 원하는 Virtualization을 수행할 수 없습니다.
그래서 몇가지 문제상황을 해결해 Virtualization을 수행할 수 있습니다.
1. Restricted Operation
- User mode : 하드웨어 리소스에 대한 접근 권한이 없는 상태
- Kernel mode : OS가 실행되어 리소스에 대한 접근이 가능한 상태
위와 같이 두 가지 모드로 프로세스의 상태를 나눠 Dist I/O나 메모리 요청같은 작업을 수행합니다.
유저 모드 일때 System Call(or Trap)을 이용해 커널모드를 호출해 원하는 작업을 수행합니다.
모든 작업이 수행된 후 OS는 Return-from-trap 명령으로 유저모드로 돌아옵니다.
OS는 예외나 인터럽트를 처리하기 위해 부팅할 때 IDT(Interrupt Descriptor Table)을 생성하고 IDTR이라는 레지스터를 이용해 이를 관리합니다.
2. Switching Between Process
OS가 제어권을 가져오기 위해서는 2가지 방법이 있습니다.
- Cooperative Approach : 시스템 콜을 기다리는 방법
- Non-Cooperative Approach : OS가 제어권을 가져오는 방법.
하지만 첫번째 방법은 프로세스가 System Call 없이 계속 수행된다면 OS가 제어권을 가져올 수 없습니다.
또한 프로세스가 무한루프같은 상태에 빠진다면 아무런 제어도 할 수 없게됩니다.
이를 방지하기 위해 두번째 방법 Timer interrupt를 이용합니다.
스케쥴러는 현재 프로세스를 계속 실행할지, 혹은 다른 프로세스로 전환할지를 결정해야합니다.
만약 바꾸기로 결정하였다면 context switch가 수행되어야 합니다.
Context Switch
- 레지스터 값을 kernel stack에 저장(PC, kernel stack pointer, 범용 register → Context)
- 커널 스택으로부터 실행할 프로세스의 context를 복구.
- 실행할 커널스택으로 Switch
그렇다면 만약 interrupt or trap handling 할 때 다른 interrupt가 발생하면 어떻게 해야할까?
OS는
- Interrupt가 처리되는 동안 다른 Interrupt는 무시하기
- Interrupt에 우선순위 주기
- Lock 기법을 이용해 처리하기
같은 방법을 이용할 수 있습니다.
Reference
- Operating Systems : Three Easy Pieces
- Dev_Pingu