개발/운영체제

[운영체제] CPU_Virtualization

grulsuitg 2022. 8. 4. 22:52

1. 운영체제

컴퓨터의 자원들을 관리해 시스템이 정확하고 효율적으로 동작하도록 만들어주는 소프트웨어.

→ virtualization 을 이용해 !

 

  • Virtualization? 물리적 자원(CPU, Memory 등)을 가상의 형태로 변경해 프로그램에 메모리를 혼자사용하는 것처럼 느끼게 만들어 주는 것! 
    → Concurrency 문제가 발생한다.
  • System Call 을 이용해 운영체제랑 소통할 수 있다.

2. 프로세스

프로세스는 실행중인 프로그램.

  • CPU 상태(register) : PC, SP, registers...
  • Memory(address space) : instruction, data section 

프로세스를 만드는 과정

  1. 프로그램 코드를 메모리(프로세스의 address space)에 Load
    프로그램은 disk에 실행가능한 형태로 존재.
    Lazy Loading을 이용(실제 데이터를 사용할때 메모리에 로딩)
    • BSS : 초기화 되지 않은 값
    • Data : 초기화 된 값
  2. Stack 할당.
    local variable, parameter, return address 등을 위한 스택공간 할당.
  3. Heap 할당.
    동적 메모리 할당을 위한 공간.
  4. OS가 초기 task 수행
    Input/Output Setup
    프로세스는 기본적으로 세개의 fd(std input, output, error)를 가지게 됩니다.
  5. 프로그램 실행 !

프로세스의 상태

  • Running : 프로세서에서 동작중인 상태
  • Ready : 동작할 준비가 되어있지만 OS의 선택을 못 받은 상태
  • Blocked : disk I/O 같은 동작을 수행하고 있어 다른 프로세스들이 프로세서를 사용할 수 있도록 하는 상태

Process State Transition

이런 프로세스들을 관리하기 위해 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

  1. 레지스터 값을 kernel stack에 저장(PC, kernel stack pointer, 범용 register → Context)
  2. 커널 스택으로부터 실행할 프로세스의 context를 복구.
  3. 실행할 커널스택으로 Switch

그렇다면 만약 interrupt or trap handling 할 때 다른 interrupt가 발생하면 어떻게 해야할까?

OS는

  • Interrupt가 처리되는 동안 다른 Interrupt는 무시하기
  • Interrupt에 우선순위 주기
  • Lock 기법을 이용해 처리하기

같은 방법을 이용할 수 있습니다.

 

Reference

  • Operating Systems : Three Easy Pieces
  • Dev_Pingu