버티의 블로그

[운영체제 #02] Processes 본문

전공 공부/운영체제

[운영체제 #02] Processes

ㅤ버티ㅤ 2024. 4. 4. 11:47
728x90

Stored Program Concept (좌 Memory, 우 CPU)

 

Process : 실행중인 프로그램을 가리키는 말, 반드시 순차적인 방식으로 진행된다.

  • 하나의 프로그램여러 프로세스가 될 수도 있다.
  • 위 그림의 stored-program concept를 따른다.
    • Stack : 임시 데이터(지역변수, 파라메터, return주소)등을 저장
    • Heap : 동적으로 할당된 메모리를 저장
    • Data : 전역 변수와 static 변수를 저장
    • Text : Binary 형태로 프로그램 코드를 저장

CPU : 여러 레지스터로 구성되어 있으며, 명령어 처리를 담당한다. 모두 binary 데이터로 구성되어 있다.

  • Program Counter : 다음 실행될 명령어의 주소를 저장
  • Instruction Register : 현재 실행중인 명령어의 주소를 저장

Process State

Diagram of Process State

  • New : 프로세스가 만들어진 상태
  • Ready : 프로세스가 CPU에게 할당되기를 기다리는 상태, 이때 프로세스는 실행 준비가 모두 완료된 상태다.
  • Running : 프로세스가 CPU를 차지하고 명령어를 실행하고 있는 상태
  • Waiting : 프로세스가 새로운 event(I/O) 발생 전까지 대기하는 상태, 이때 프로세스는 CPU에서 작동하지 않는다.
  • Terminated : 실행이 끝난 상태

프로세스들은 위 state diagram처럼 조건에 따라 state가 바뀐다. 아래는 state 변경 예시이다.

  • Ready → Running : CPU에 프로세스가 할당된 경우
  • Running → Ready : 시간이 초과되었을 경우 (Timeout Interrupt)
  • Running → Waiting : 사용자의 I/O작업이 필요해 기다려야 하는 경우
  • Waiting → Ready : 사용자가 I/O작업을 했을 시 (키보드 입력 등)

Process Control Block (PCB)

  • 현재 CPU 내 프로세스와 관련된 정보들을 메모리에 저장하는 일종의 자료구조이다.
  • Process state, PC, CPU 레지스터 등 모든 정보를 포함한다.
  • 이들은 실제 값이 아닌 복사해온 값이라고 생각하면 된다.

Ready and Wait Queues
Queueing Diagram

Process Scheduling

  • Ready Queue : Ready상태인 프로세스들을 대기시키는 큐
  • Wait Queues(Device queues) : 각각의 I/O(event)별로 대기시키는 큐들 (즉, 여러개일 수 있다.)
  • 실제로는 위 큐들에는 PCB의 형태로 이동한다.

CPU Switch From Process to Process

Context Switch

문맥교환(Context Switch)는 CPU가 다른 프로세스로 전환될 때, 이전 프로세스의 state저장하고, 새로운 프로세스의 state불러오는 과정이다. 여기서 말하는 context는 PCB를 뜻하므로 PCB를 switching하는 과정이라 이해하면 된다.

  • save state into PCB0 : P0에서 system call이 발생했으므로 P0의 상태를 PCB0에 저장하고 P0은 waiting이 된다.
  • reload state from PCB1 : 이제 PCB1을 reload하면서 P1이 ready가 되고 CPU에 할당되어 running이 된다.
  • save state into PCB1 : P1에서 system call이 발생했으므로 P1의 상태를 PCB1에 저장하고 P1은 waiting이 된다.
  • reload state from PCB0 : 아까 저장했던 PCB0을 reload하여 P0이 ready가 되고 CPU에 할당되고 running이 된다.

Process Creation and Termination

프로세스 생성은 4단계의 과정을 거친다.

  1. Create PCB within OS kernel : 생성된 프로세스를 관리하기 위해 PCB를 만든다.
  2. Allocate memory space : OS가 프로세스에 메모리 공간을 할당한다.
  3. Load binary program : 프로세스가 실행할 프로그램을 디스크에서 불러온다.
  4. Initialization of program : main 함수의 시작 주소를 PC에 저장하고 프로그램 작동이 시작된다.

Tree of Procsses in Linux

 

Process Identifier(pid)로 프로세스를 구분하고 관리하는데, 위와 같이 부모-자식 트리구조를 띄게 된다.

그래서 프로세스 생성에는 아래와 같이 3가지의 특징이 존재한다.

 

1) Resource sharing options

  • 부모가 사용하던 리소스 자식 프로세스와 공유할 수 있다.
  • 3가지 공유 옵션이 존재 :  모두 공유, 일부 공유, 공유X 

2) Execution options

  • 부모-자식 프로세스는 동시에 실행이 된다.
  • 자식 프로세스(some or all)가 끝나기 전까지 부모 프로세스는 기다린다.

3) Address-space possibilities

  • 운영체제마다 자식 프로세스가 주소 공간(Address-space)이 할당되는 방법이 아래와 같이 다르다.
  • 1) 자식 프로세스는 부모 프로세스의 프로그램 코드, 데이터 등을 똑같이 복제해서 사용 (Linux가 채택한 방법)
    이때 자식이 복제하면 부모와 내용은 동일하지만 주소와 리턴값은 다르다. 자식은 0을, 부모는 자식의 id를 리턴한다.
  • 2) 자식 프로세스는 별도의 모듈에서 새로운 프로그램을 가져와서 사용 (Window가 채택한 방법)

또한 프로세스 생성에서 사용하는 3가지의 System calls이 있다.

  • fork() : 새로운 프로세스를 생성, linux 기준 부모 프로세스를 복제해서 새로운 프로세스를 만든다.
  • exec() : fork 이후 load module에 있는 새로운 프로그램을 자식 프로세스에 오버라이팅 한다. fork와 같이 새로운 프로세스를 만드는것이 아니므로, id가 바뀌지 않는다. 즉 역할만 바뀐 것이다.
  • wait() : 부모 프로세스가 자식 프로세스의 종료를 대기하도록 한다. 대게 리턴값으로 종료상태를 판단하고 자식 프로세스가 종료되면 자식이 사용하던 리소스를 OS가 회수할 수 있게 한다.

마지막으로 exit() system call이 호출되면 프로세스가 종료되는데, 만약 부모 프로세스가 wait하지 않고 자식 프로세스가 종료되면, 자식 프로세스는 회수가 제대로 되지 않아 좀비 상태(Zombie)가 되고, 부모 프로세스가 먼저 종료되면, 자식 프로세스는 고아 상태(Orphan)가 된다. Orphan 상태의 프로세스는 트리의 root 프로세스(init)의 자식으로 이전된다.

 

Example Code

 

이 코드에서 fork()는 부모 프로세스에서 복제하여 새로운 프로세스를 만드는 system call이라 생각하고, 부모 프로세스 id는 100, 새로 만들어진 자식 프로세스 id는 101이라고 가정하자,

  • Line 5~6 : fork()를 하면 부모 프로세스에서는 자식 프로세스의 id를, 자식 프로세스0을 return하여 num1이 총 2개가 생성된다. 더 자세히 말하자면, 부모 프로세스의 num1에는 자식 프로세스 id인 101이 저장되고, 자식 프로세스의 num1에는 0이 저장된다. 따라서 Line 6에서는 "fork 반환값 = 101\n", "fork 반환값 = 0\n" 이렇게 2번 출력될 것이다.
  • Line 7~9 : 이에 따라 이 라인들은 부모 프로세스(id=100)에서만 실행될 것이고 wait()을 하게 된다.
  • Line 10~13 : 여기는 반대로 자식 프로세스(id=101)에서만 실행될 것이고, 12번 라인에서 execlp("/bin/ls", "ls", NULL);가 있는데, 이 코드는 현재 프로세스를 "/bln/ls" 프로그램으로 오버라이팅한다는 의미이다. 따라서 execlp 호출 이후의 코드인 Line 13은 실행되지 않는다.