본문 바로가기

OS

[OS] 프로세스와 스레드

 

#1. 프로세스(Process)란?

 

프로세스는 실행 중인 프로그램을 의미하고 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적 존재이다. 


프로세스 제어 블록 (Process Control Block, PCB)

PCB는 테이블 모양의 자료구조를 가지고 있고 프로세스가 하나가 만들어진다는 것은 곧, 그 프로세스에 대한 모든 것을 표현하는 PCB 하나가 만들어진다는 말과 같다.

운영체제가 프로세스를 관리한다는 것은 바로 해당 PCB에 대한 다양한 행동으로 이해하면 되며, 프로세스의 수가 많음을 감안할 때 PCB에 대한 작업은 매우 빈번할 일이라서 PCB는 기본적으로 메모리에 저장시킨다.

프로세스 제어 블록(PCB)

PCB에 저장되는 정보들은 운영체제마다 조금씩 차이는 있지만 일반적으로 다음과 같은 정보들을 저장한다.

  • 프로세스 번호(PID) : 프로세스의 고유한 정수번호, 다른 프로세스와의 구별
  • 프로세스의 상태 : 준비 실행, 대기, 보류 등의 상태를 나타냄
  • 프로세스 우선순위 : 스케줄링을 할 때 사용되는 우선순위
  • 프로그램 카운터 값 : 다음에 실행될 명령어의 주소 값을 가짐
  • 메모리 포인터 : 프로그램 데이터가 저장되어 있는 메모리 블록 위치, 공유되는 메모리 블록을 에 포인터를 포함
  • 문맥 데이터 : 문맥교환 시에 CPU 레지스터 값들을 저장하는 영역
  • 할당받은 자원들에 대한 목록 : 개방한 파일 등 할당받은 자원들의 정보
  • 계정 정보 : CPU를 사용한 시간 등의 정보
  • 입출력 정보 : 진행 중인 입출력 요구 등의 정보

프로세스의 상태(Process State)와 변화

 

프로세스 상태도

  • 생성 상태(Created, new) : 사용자 요청이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어지는 상태
  • 준비 상태(ready) : CPU를 할당받기 위해 기다리고 있는 상태
  • 실행 상태(running) : CPU를 할당받아 실행 중인 상태, 이때 CPU를 할당하는 것을 Dispatch라 함
  • 대기 상태(waiting) : 프로세스가 실행되다가 입출력 처리를 요청하거나 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다리면서 대기하는 상태
  • 종료 상태(terminate) : 프로세스가 종료될 때 잠시 거치는 상태, 프로세스는 할당되었던 모든 자원들이 회수, PCB만 커널에 남아있는 상태
  • 보류 상태(suspension) : 생성된 프로세스가 바로 메모리를 받지 못할 때나 준비 또는 실행 상태에서 메모리를 잃게 될 때를 위해 필요하다.

#2. 스레드(Thread)란?

 

하는 일은 서로 다르지만 관련 있는 작은 일들이 모여 하나의 프로세스가 된다. 이때 큰 틀은 프로세스가 되고 작은 일 하나하나는 스레드가 된다.

프로세스는 부여된 자원의 소유자로서, 스레드는 스케줄링의 단위로서 존재하게 된다. 한 프로세스에 속한 각각의 스레드들은 프로세스가 가지는 자원을 공유하면서 자신의 실행 환경, 즉 프로그램 카운터로 표현되는 현재의 실행 위치과 스택, 레지스터 값들을 따로 가지게 된다.

단일 스레드와 다중 스레드


스레드의 상태와 동기화(Synchronization)

프로세스와 마찬가지로 스레드 역시 실행, 준비, 대기와 같은 상태를 가지며, 다만 보류는 프로세스 레벨의 개념이므로 스레드에서는 필요 없는 상태이다.

스레드의 상태 변화

대기는 레지스터 값, 프로그램 카운터, 스택 포인터 등의 보관이 요구되며, 스레드의 종료는 해당 스레드의 레지스터 값들과 스택을 없애게 된다. 

한 프로세스내의 스레드들은 그 프로세스의 주소 공간과 자원들을 공유한다는 사실은 특정 스레드가 변경시킨 내용이 다른 스레드에 바로 영향을 미친다는 것을 말한다. 따라서 오류를 야기할 수 있는 상호 간의 간섭이나 데이터의 파괴 등을 방지하기 위한 스레드 실행의 동기화가 요구된다.


스레드의 장점

단일 프로세스에서 다중 스레드의 수행

  • 다중 스레드 프로그램은 그것의 일부가 블록 되어도 나머지 부분은 계속 실행될 수 있다.
  • 같은 프로세스의 스레드는 메모리와 그 밖에 프로세스의 자원을 공유한다. 스레드는 같은 주소 공간을 공유하므로 스레드 간 통신이 용이하다.
  • 프로세스마다 메모리와 자원을 할당하면 많은 오버헤드가 발생한다. 그러나 프로세스 내의 스레드는 자원을 공유하므로 생산성 비용이 저렴하고 스레드 간에 문맥 교환이 용이하다.

스레드의 종류

스레드는 사용자 공간에 구현할 수 있고, 커널 공간에 구현할 수 있다. 또한 혼합하여 두 공간 모두에서 구현할 수 있다.

사용자 레벨 스레드(User Level Thread)

사용자 레베 스레드

  • 사용자 공간에서 스레드 라이브러리를 통해 제공한다.
  • 라이브러리는 커널의 지원 없이 스레드의 생성, 스케줄링, 관리를 제공한다. (커널 관여x)
  • 모드 변경 없이 스레드의 생성과 관리를 빠르게 할 수 있다.
  • 프로세스마다 자체적 스케줄링 알고리즘을 가질 수 있다. (운영체제가 정한 스케줄링 따를 필요x)
  • 커널이 스레드를 보지 못하기 때문에 같은 프로세스에 속한 스레드들이 서로 다른 CPU를 할당받아 동시에 실행될 수가 없는 경우가 생김

커널 레벨 스레드(Kernel Level Thread)

 

커널 레벨 스레드

  • 운영체제가 직접 지원한다.
  • 커널이 스레드의 생성, 스케줄링, 관리를 담당한다.
  • 모드 변경이 필요하기 때문에 스레드의 생성과 관리가 사용자 스레드보다 느리다.
  • 하나의 스레드가 블록 되어도 같은 프로세스에 있는 다른 스레드를 계속 실행할 수 있다.

다중 스레드 모델

다대일 모델

  • 여러 사용자 스레드를 하나의 커널 스레드로 매핑한다.
  • 스레드의 관리가 사용자 모드에서 이루어지므로 처리가 빠르다.
  • 하나의 스레드가 블록 되면 전체 프로세스가 블록 된다.
  • 다중 프로레스에서 다중 스레드가 동시에 수행될 수 없다.

일대일 모델

  • 각 사용자 스레드는 하나의 커널 스레드로 매핑된다.
  • 하나의 스레드가 블록 되어도 나머지 스레드는 계속 실행된다.
  • 다중 프로세서에서 동시에 수행될 수 있다.
  • 비용이 비싸다. 따라서 보통 스레드의 수를 제한한다.

다대다 모델

  • 여러 사용자 스레드를 동일 수 또는 그 이하의 수의 커널 스레드로 매핑한다.
  • 커널 스레드의 수는 응용 프로그램, 기계의 특성에 따라 제한될 수 있다.
  • 비용이 일대일 모델보다 저렴하고 다대일 모델과 달리 스레드의 동시 수행 가능

 

참고 자료

  • OS? Oh Yes!, 김주균 지음

'OS' 카테고리의 다른 글

[OS] 메모리 관리  (0) 2020.05.10
[OS] 교착 상태(Deadlock)  (0) 2020.05.09
[OS] 병행 프로세스와 동기화  (0) 2020.05.09
[OS] CPU 스케줄링(Scheduling)  (0) 2020.05.08
[OS] 운영체제란??  (0) 2020.05.08