[OS] Day2

Process State

OS가 프로세스를 관리하는 과정에서 프로세스에는 5가지 상태가 존재한다.

 

 

New: 프로세스가 생성됐을 때의 상태

Ready: 프로세스가 프로세서에게 선택될 때까지 큐에서 기다리고 있는 상태

Running: 프로세서에 선택되어 명령을 수행하고 있는 상태

Waiting: I/O Event가 발생해서 I/O가 끝날 때까지 기다리고 있는 상태

Terminated: 프로세스가 종료된 상태

 

 

PCB (=TCB)

OS가 프로세스를 관리하기 위해 Process(=Task) Control Block이라는 구조체(=클래스)를 만들어서 각 프로세스가 가져야하는 모든 정보를 저장한다.

 

PCB가 가지고 있는 주요 정보

Process State: 프로세스의 현재 상태

Program Counter (PC)

  • 프로세스가 명령어를 실행할 때 메모리에서 명령어를 IR(Instruction Register)에 fecth해서 CPU에서 실행한다.
  • 이때 현재 실행 중인 명령어를 실행하고 그 다음 실행할 명령어의 주소를 가리키는 장치가 PC이다.

CPU Registers: 문맥(Context)에 대한 정보를 가지고 있다.

Scheduling Information: CPU 자원을 주고받기 위한 정보

Memory Management Information: 메모리를 얼마나 사용하고 있는지

Accounting Information: 어떤 유저가 생성한 프로세스인지

I/O status Information: 어떤 파일을 오픈했는지

 

 

프로세스와 스레드

예전의 프로세스는 Single thread of execution 방식 즉 하나의 실행 흐름을 가졌다.(여기서 thread는 실행흐름을 뜻한다)

하지만 시간이 지남에 따라 하나의 프로세스가 여러 개의 실행 흐름을 필요로 했고, 그에 따라 스레드라는 작업단위가 생겼다.

스레드는 프로세스 보다 가벼운 리소스를 가져 멀티 프로세싱을 하는 것 보다 멀티 스레딩이 더 자원을 효율적으로 사용할 수 있다.

 

멀티 프로그래밍

CPU라는 비싼 자원이 놀지 않도록 최대한으로 사용한다.

 

Time Sharing

CPU core를 프로세스에 따라 빈번하게 스위칭하는 방법

 

Scheduling Queues

언제 어떤 프로세스에 CPU 리소스를 할당할 지 정하는 것이 스케줄링이고, 스케줄링 된 프로세스가 할당을 기다리고 있는 곳이 Ready Queue이다. I/O가 발생하면 Wating Queue에서 대기한다.

Queueing Diagram

Context Switch

Scheduling을 통해 여러 프로세스 간 Time Sharing을 하기 위해서는 Context Switch를 통해 cpu할당을 빠르게 계속해서 바꿔주어야한다.

문맥이란 프로세스가 사용되고 있는 상태로 PCB 안에 정보가 들어있다.

Interrupt가 발생하면, 현재 진행중이었던 내용을 저장하고(PC 정보) Interrupt를 처리하고나서 다시 CPU를 획득했을 때 저장했던 context를 복원한다.

위 사진을 보면 PCB0의 정보를 저장한 다음 PCB1으로 CPU를 할당한다. 이때 Interrupt 또는 System call을 발생시켜 PCB1의 작업을 처리하고 다시 PCB1의 정보를 저장한 다음 PCB0으로 돌아와서 전에 저장된 상태를 복원한다. 이 과정이 Context switch이다.

 

Process Operation

OS는 프로세스를 생성하고 종료시키는 기능을 제공한다. => 개발자가 아닌 일반 사용자가 직접 프로세스를 생성할 일이 없다.

프로세스가 또 다른 프로세스를 생성할 수 있다. 다른 프로세스를 생성하는 프로세스가 부모 프로세스, 생성된 프로세스가 자식 프로세스이다. (System call 라이브러리인 fork()를 사용)

Process를 생성했을 때 두 가지 실행 방법이 있다.

  1. 동시에 프로세스를 실행한다.
  2. 자식 프로세스가 종료될 때까지 부모가 wait 한다.

address-space 측면에서도 두 가지 방법이 있다.

  1. 부모 프로세스를 복제하는 방법 (같은 내용을 실행한다면 PCB만 다르게 가지고있으면 됨)
  2. 새로운 프로세스를 로드하는 방법

 

Orphan Process & Zombie Process

고아 프로세스

부모 프로세스가 자식 프로세스보다 먼저 종료되면 자식 프로세스는 고아가 된다.

고아가 된 프로세스는 관리가 어려워지며, 이를 해결하기 위해 커널이 고아 프로세스의 부모 프로세스를 init 프로세스(=pid 1)로 바꿔준다.

 

좀비 프로세스

부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않으면, 자식 프로세스는 작업을 다 마친채로 아무것도 하지 않는 좀비 상태가 된다.

좀비 프로세스가 되면 사용하지 않는 프로세스가 계속 쌓이므로 리소스가 낭비된다. 따라서 wait를 호출해서 종료상태를 회수해줘야한다.

 

 

'개념 정리 > OS' 카테고리의 다른 글

[OS]Day6  (0) 2023.08.16
[OS]Day5  (0) 2023.08.14
[OS]Day4  (0) 2023.08.10
[OS] Day3  (0) 2023.08.09
[OS] Day 1  (0) 2023.08.08