본문 바로가기

운영체제

02. 운영체제 - CPU Virtualization (1)

CPU Virtualization - The Abstraction :  The Process

운영체제는 많은 수의 virtual CPU가 존재하는 것과 같은 착각을 줄 수 있다. 이것은 Time sharing을 통해 이루어진다.

  • Time Sharing : 한 프로세스를 돌리고, 잠깐 멈춰두고 다른 프로세스를 돌리고,, 반복
  • 근데 이렇게하면 CPU에서 돌릴 프로세스를 바꿀 때 발생하는 context swiching에 의한 오버헤드가 있음..

Process

프로세스는 실행되고 있는 프로그램이다.

프로세스의 구성요소는 다음과 같다.

  • CPU state (레지스터)
    • Program counter 
    • Stack pointer
    • General registers
  • Memory (address space)
    • instructions
    • data section

CPU abstraction

  • IR (Instruction Register) : instruction이 불려와서 저장되는 레지스터
  • eip (Instruction pointer, IP) : 다음 instruction을 가리키는 포인터

메모리의 한 부분에는 수행될 프로그램의 instruction들이 저장되어있다.

eip가 가리키는 메모리주소에서 다음 instruction을 가져와 IR에 저장하고 해당 instruction을 수행하는 방식으로 프로그램이 실행된다. 

Process API

OS에서 제공되는 Process관련 API들은 다음과 같다.

  • Create : 프로그램을 실행시키기 위한 새로운 프로세스 생성
  • Destroy : 프로세스를 중단
  • Wait : 프로세스가 실행을 중단하기를 기다림
  • Status : 프로세스에 관한 상태정보를 얻음

Process Creation

프로세스 생성과정에 대해 좀 더 자세히 알아보자

1. 메모리로 프로그램 코드를 load 해온다.

  • 프로그램은 처음에 executable 형식으로 디스크에 저장되어있음.
  • OS는 프로세스의 로딩을 lazy하게 수행 (프로그램 수행 중 실제로 필요해질때 읽어들임)

2. 프로그램의 Stack 을 할당한다.

  • 스택은 지역변수, 함수 파라미터, 리턴어드레스를 위한 것임
  • main함수의 argc, argv 인자를 통해 스택을 초기화함.

3. 프로그램의 Heap을 생성한다.

  • 명시적으로 요청된 동적할당 데이터를 위해 사용됨 (malloc, free)

4. 다른 초기화 작업들 수행한다.

  • I/O 설정 : 각 프로세스는 기본적으로 Standard input/output/error의 세가지 open file descriptor를 가짐

5. main()이라고 명시된 entry point부터 프로그램을 시작한다.

  • main의 첫 instruction이 시작되는 주소를 eip에 넣어주면 여기까지가 운영체제의 역할이고, 이후부터는 CPU의 컨트롤을 새롭게 생성된 프로세스에게 넘겨줌.

Process States

프로세스는 다음 세가지 상태 중 하나일 수 있다.

1. Running : 프로세스가 실제 CPU에서 돌고 있는 상태

2. Ready : 여러가지 이유에 의해 OS에 의해 스케줄링되지않아서 지금은 돌고있지 않지만 언제든 실행될 수 있는 상태

3. Blocked : I/O나 네트워크 등의 작업이 끝나지 않아 다음 instruction을 실행할 수 없는 상태

 

PCB (Process Control Block) : 운영체제가 프로세스를 표현한 구조체

  • OS가 각 프로세스에 관한 다양한 정보들을 담기 위해 사용하는 구조체 
  • 프로세스는 CPU state + 메모리 state 정보로 이루어지므로 해당 정보들을 PCB에 담아놔야한다.
  • 그래야 실행되던 프로세스를 잠깐 멈추고 schedule-out 시킨 후 나중에 다시 스케줄링을 통해 실행시키더라도, 하던 일을 그대로 이어나갈 수 있으니까

xv6 의 Proc 구조체(PCB)는 다음과 같다.

 

왼쪽 proc구조체의 mem 을 통해 메모리 상태를 저장해놓고, context 를 통해 CPU 상태를 저장할 수 있다.

그리고 Context는 오른쪽과 같은 구조체로 이루어져있으며, 프로세스의 상태를 복구시키는데 필요한 레지스터들이 저장되어있다.