본문으로 바로가기

[OS] 2. 프로세스 (Process)

category CS/Operating System 2019. 3. 29. 15:50

2. 프로세스 (Process)

  1. 프로세스의 개념
  2. 프로세스의 구성과 상태
  3. 프로세스와 스레드
  4. 프로세스 관리

 

1. 프로세스의 개념

1.1. 프로세스 (Process)

"Process is a program in execution."

프로그램과 프로세스의 차이는 명확하다.

프로그램 은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이기 때문에 생명이 없다. 이 프로그램가 메모리에 적재되면 생명이 있는 프로세스 가 된다. 즉, 프로세스란 실행중인 프로그램 을 뜻한다.

 

1.2. 멀티 프로세스

스마트폰으로 음악을 들으며, 네이버 검색을 하거나 카카오톡 메시지를 보는 것은 너무 당연한 일이다. 이처럼 우리는 동시에 여러 프로세스가 실행되는 것을 당연한 시대에 살고있다.

하지만, 여러개의 프로세스동시에 실행되는건 놀라운 일이다. 하나의 CPU(프로세서) 는 한 순간에 하나의 프로세스만 실행할 수 있기 때문이다.

프로세서가 동시에 실행될 수 있는 이유는 운영체제 가 아주 빠르게 프로세스를 교체하고 있기 때문이다. 우리는 이런 교체 과정이 아주 빠르기 때문에 동시에 여러 프로세스를 실행하고 있다고 느낄 수 있는 것이다.

 

 

2. 프로세스 구성 & 상태

2.1. 프로세스 구성

프로세스에 대한 정보는 프로세스 제어 블록(PCB, Process Control Block) 에 저장된다. 이 자료구조는 크게 아래와 같은 정보를 담고있다.

Process State

CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있다. 그런 프로세스의 상태를 저장한다.

PID(Process ID)

운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호이다

Scheduling Information

운영체제는 여러개의 프로세스를 동시에 실행하는 착각을 일으킨다. 운영체제가 여러 개의 프로세스의 실행 순서를 결정하는 것을 스케줄링이라 한다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.

PC(Program Counter)

CPU가 다음으로 실행할 명령어를 가리키는 값이다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값이다.

Register , Code, Data, Stack의 위치정보 , Open file descriptors, …

 

2.2. 프로세스 상태

운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때, 오류가 발생하지 않도록 관리한다. 이를 위해 프로세스는 프로세스의 상태를 실행(running) , 준비(ready) , 블록(blocked) 로 분류하여 관리한다

Running

  • CPU를 잡고 instruction을 수행하는 단계

Ready

  • CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
  • 프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당받는다. 이를 준비상태에서 실행샅애로 상태전이 된다고 한다. 이 과정을 디스패칭(dispatching) 이라고 하고 디스패처(dispatcher) 가 수행한다.

Blocked(wait, sleep)

  • CPU를 주어도 당장 instruction을 수행할 수 없는 단계
  • Process 자신이 요청한 event가 즉시 만족되지 않아 이를 기다리는 상태

 

2.3. 문맥 교환 (Context Switch)

CPU를 한 프로세서에서 다른 프로세서로 넘겨주는 과정을 뜻한다. CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음과 같은 과정을 수행한다.

  1. CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
  2. CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

 

 

3. 프로세스와 스레드

3.1. 스레드

"A thread is a basic unit of CPU utilization."

프로세스가 운영체제로부터 자원을 할당받는 작업의 단위 이고, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위 이다.

 

3.2. 스레드의 특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 스레드끼리 공유한다
  • 같은 프로세스 안에 있는 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리의 메모리에 직접 접근할 수 없다
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다

 

3.3. 멀티 스레드

멀티 프로세스로 처리할 수 있는 것을 굳이 멀티 스레드를 사용하는 이유는?

멀티 프로세스와 달리 멀티 스레드는 하나의 프로세스에서 여러개의 스레드를 생성해 요청을 처리하는 방식이다. 전자의 경우는 기존의 프로세스가 완전히 새로운 별개의 프로세스로 복사되어 생성되는 것이기 때문에 자원 소모가 많다. 하지만 후자의 경우는 근본적으로 하나의 프로세스이다. 하지만 여러개의 스레드가 생성되어 실행흐름만 달라진다. 따라서 아래와 같은 장점을 가지고 있다.


Resource Sharing

멀티 스레드는 코드, 데이터, 힙 영역을 공유하므로 프로세스 간 통신(IPC)보다 자원 공유에 대한 부담이 적다

Economy

멀티 프로세스는 CPU 제어권을 넘겨주는 문맥 교환(Context Switch)이 자주 일어지만, 멀티 스레드에서는 같은 메모리 영역을 공유하기 때문에 경제적이다


하지만 멀티 스레드는 같은 메모리 영역을 공유하기 때문에, 같은 공간에 동시에 접근한다는 문제가 발생할 수 있다. 이것을 임계영역에 접근한다고 표현하는데, 이를 방지하기 위해 뮤텍스세마포어를 이용할 수 있다.

 

3.4. 커널 레벨 스레드 vs 유저 레벨 스레드

커널 레벨 스레드

  • 가장 가벼운 커널 스케줄링 단위이다
  • 하나의 프로세스는 적어도 하나의 커널 스레드를 갖게 된다
  • 커널 영역에서 스레드 연산을 수행하게 된다
  • 커널이 스레드를 관리하기 때문에 커널에 종속적이다
  • 프로그래머의 요청에 따라 스레드를 생성하고 스케줄링하는 주체가 커널 이면 커널 레벨 스레드라고 한다

유저 레벨 스레드

  • 유저 영역에서 스레드 연산을 수행한다
  • 유저 영역에서 스레드 연산을 수행하기 때문에 운영체제에 투명하다
  • 커널에 의존적이지 않은 형태로 스레드의 기능을 제공하는 라이브러리 를 활용하는 방식이 사용자 레벨 스레드다

 

 

4. 프로세스 관리

4.1. 프로세스 간 통신 (IPC, InterProcess Communication)

Message Passing

프로세스 사이에 공유 변수를 일체 사용하지 않고, 커널을 통해 메시지를 전달함

Shared Memory

서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 방법

 

4.2. 프로세스 관련 시스템 콜

fork()

OS가 fort()를 호출한 부모 프로세스를 중단시키고 부모가 가지고 있던 context 들을 그대로 복사

exec()

fork()를 통해 부모 프로세스를 복사하여 가지고 있는 자식 프로세스에 덮어 씌움

wait()

자식 프로세스가 사용될 때 까지 대기시킴

exit()

프로세스가 마지막 명령을 수행한 후 OS에게 이를 알려줌

 

 

 


참고 자료