Outdated/OS

[OS] 프로세스(process)와 스레드(thread)

해달 2020. 5. 6. 22:08

목차

  1. 프로그램

  2. 프로세스

  3. 스레드

  4. 멀티 프로세스 vs 멀티 스레드

  5. 참고자료


1. 프로그램

먼저 프로세스를 살펴보기 전에 프로그램(program)이 무엇인지 알아볼 필요가 있다. 본래 프로그램의 의미는 업무를 어떻게 수행할 건지에 관한 표였다. 다시 말해 어떤 작업을 하기 위해 해야할 일들을 순서대로 나열한 것이다. 컴퓨터에서의 프로그램의 의미도 비슷한데, 프로그램은 어떤 작업을 하기 위한 명령어 목록과 그에 필요한 데이터를 묶어 놓은 파일이며, 보조 기억장치에 저장되어 있다.

2. 프로세스

  1. 정의

프로세스(process)의 정의는 다양한데 본질적으로는 위에서 설명한 프로그램이 실제로 메모리에 적재 되어(loaded) 실행되고 있는 인스턴스(instance)를 말한다. 다르게 얘기하면 운영체제로부터 시스템 자원을 할당 받는 작업의 단위라고 할 수 있다. 프로세스는 운영체제의 스케줄러(scheduler)를 의해 선택되면 실행된다.*


* 이를 단기 혹은 CPU 스케줄링(short-term / CPU scheduling)이라고 한다. 대기 큐(ready queue)에 있는 프로세스를 하나 선택하는 것이다. 이외에 스와핑(swapping)을 담당하는 중기 스케줄링, 보조 메모리에서 프로세스를 선택하는 장기 혹은 잡 스케줄링(long-term / job scheduling)가 있다.


  1. 특징

프로세스는 각각 독립된 메모리 영역(코드, 데이터, 스택, 힙의 구조)과 주소 공간을 운영체제로부터 할당 받는다. 각각에 대해서 설명하자면 코드 영역은 프로그램 코드가, 데이터 영역은 전역 변수가,  스택은 임시 데이터가 저장되고, 힙은 프로세스가 실행되는 도중 동적으로 메모리가 할당될 수 있는 구역이다.


프로세스는 각각 독립된 영역이기에 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 만약 다른 프로세스의 자원에 접근하고 싶다면 파이프(pipe), 시그널(signal), 소켓(socket), RPC(remote procedure call) 등과 같은 프로세스 간 통신(IPC; Inter-Process Communication)*을 사용해야 한다.


* IPC에는 크게 메모리를 공유하는 방법(shared-memory method)과 메시지 전달(passing-message method)이 있다. 전자는 프로그래머가 제공하고, 후자는 운영체제가 제공한다.


  1. 상태

요즘의 운영체제는 시분할 시스템과 멀티프로그래밍을 지원한다. 다시 말해 여러 프로세스를 실행시킬 수 있다. 운영체제는 프로세스의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야 하는데 이를 위해 운영체제는 프로세스의 상태를 상태 전이(state transition)를 통해서 체계적으로 관리한다. 프로세스의 상태는 다음과 같다.


출처 : https://www.geeksforgeeks.org/states-of-a-process-in-operating-systems/


  • New 혹은 Create : 프로세스가 생성되기 위해 준비 된 상태로 아직 보조 메모리에 프로그램 형태로 존재한다.

  • Ready : 메인 메모리에 적재되어 프로세스에 의해 실행되기를 대기하는 상태다. 이 상태의 프로세스는 운영체제의 대기 큐에 존재한다.

  • Running : 프로세스가 프로세서에 의해서 실행되는 중이다.

  • Wait 혹은 Blocked : 입출력이나 임계 구역 접근과 같은 이벤트를 기다릴 때 상태다.

  • Terminated 또는 Completed : 프로세스가 실행 완료된 상태다. 프로세스 제어 블록이 삭제된다.

  • Suspend Ready : 다른 프로세스와 전환되어(swapped out) 다시 실행되기를 기다리는 상태다.

  • Suspend Blocked  또는 Suspend Wait : Suspend Ready와 비슷하나 프로세스가 입출력 연산 중이었거나 메인 메모리 공간의 부족으로 인해 보조 메모리로 옮겨간 상태다.


  1. 프로세스 제어 블록

프로세스 제어 블록(PCB; Process Control Block) 혹은 프로세스 기술자(process descriptor)는 프로세스의 정보를 담고 있는 자료구조다. 운영체제가 프로세스를 다룰 때 프로세스 제어 블록을 이용해서 다루게 된다. 여기에 담기는 정보는 운영체제별로 다르다. 일반적으로 아래와 같은 것들이 저장된다.


  • Process State : 프로세스의 상태로 아래에서 살펴본다.

  • Program Counter : 다음 명령어의 주소가 저장된다.

  • CPU Registers : 누산기, 인덱스 레지스터, 스택 포인터, 범용 레지스터 등 컴퓨터 구조에 따라 다르다.

  • CPU-Scheduling Information : 프로세스 우선순위, 스케쥴링 큐의 포인터 등을 일컫는다.

  • Memory-Management Information : 페이지 테이블, 세그먼트 테이블 등 메모리 시스템에 따라 다르다.

  • Accounting Information : CPU 시간의 총량, 실제 사용된 시간, 시간 제한 등에 대한 정보

  • I/O Status Information : 프로세스에 할당된 입출력 기기의 목록

3. 스레드

  1. 정의

스레드(thread)는 프로세스가 할당 받은 자원을 이용하는 실행 단위로 프로세스는 최소 한 개 이상의 스레드를 가진다. 이 스레드를 메인 스레드(main thread)라고 한다. 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드는 대부분의 현대 운영체제가 지원하고 있으며, 이와 관련된 주요 라이브러리로는 POSIX Pthreads, Windows threads, Java threads 가 있다.


  1. 특징

스레드는 앞서 살펴본 프로세스와 구조가 다르다. 프로세스 주소 공간 중 코드, 데이터, 힙은 스레드 간 공유되며 스택만이 스레드 별로 할당된다. 그래서 스레드 간에는 이 공유 메모리를 이용해 상호작용을 할 수 있다.


  1. 멀티스레드 모델

스레드는 크게 유저 레벨 스레드(user-level thread)와 커널 레벨 스레드(kernel-level thread)로 나뉜다. 커널 레벨 스레드는 운영체제 커널이 지원하고 관리하는 객체고, 반대로 유저 레벨 스레드는 유저 라이브러리가 제공하는 객체다. 보통 유저 레벨 스레드가 커널 레벨 스레드보다 생성과 관리가 빠른데, 커널 간 간섭이 없기 때문이다. 


유저 레벨 스레드와 커널 레벨 스레드의 연결 형태에 따라 3가지 모델로 구분하는데 다대일(many to one) 모델은 하나의 커널 스레드에 여러 유저 스레드가 연결된 것이고, 일대일(one to one)모델은 각 유저 스레드가 각 하나의 커널 스레드와 대응되는 형태고, 다대다(many to many)모델은 많은 유저 스레드가 적거나 같은 수의 커널 스레드로 다중화 되어 있는 형태다.

왼쪽부터 다대일, 일대일, 다대다 모델

(출처 : Operating System Concepts Essential)


  1. 프로세스와의 차이점

프로세스와 차이점을 살펴보자면 아래와 같다.


차이점

프로세스

스레드

정의

실행중인 프로그램

프로세스의 실행 단위

생성 / 종료 시간

많은 시간 소요

적은 시간 소요

컨텍스트 전환

많은 시간 소요

적은 시간 소요

상호작용

IPC 사용

공유 메모리 사용

자원 소모

많음

적음

독립성

각각 독립적

스택만 독립적이고 이외에는 공유

4. 멀티프로세스 vs 멀티스레드

  1. 컨텍스트 전환

컨텍스트 전환(context switch)은 다른 프로세스의 수행을 위해 실행되고 있는 프로세스의 현재 상태를 저장하는 절차를 의미한다. 다시 말해, 실행되고 있던 프로세스의 내용을 프로세스 제어 블록에 저장하고 다른 프로세스의 컨텍스트를 그 프로세스의 제어 블록으로부터 불러와 실행하는 것이다. 컨텍스트 전환 시간은 하드웨어에 지원에 따라 크게 달라지기 때문에 시스템마다 다르며, 컨텍스트 전환이 일어나는 동안은 아무런 작업이 수행되지 않아 순수한 오버헤드(overhead)다.


  1. 멀티프로세스와 멀티스레드

프로그램을 구현할 때 연산량 증가, 모듈화, 편의성 등의 이유로 하나의 작업을 여러 개의 프로세스로 구성하거나 여러 개의 스레드로 구성한다. 전자를 멀티프로세스(multi-process) 후자를  멀티스레드(multi-thread)라고 한다. 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하나 멀티 스레딩을 기본으로 하고 있다.


각각은 장점은 각각의 단점이 되는데, 이는 프로세스와 스레드의 차이점에서 기인한다. 즉, 멀티프로세스는 시스템 자원을 많이 사용하고 프로세스 간 통신이 어려운 반면 여러 개의 프로세스 중 하나에 문제가 발생하면 그 문제가 다른 프로세스로 확산이 되지 않지만*, 멀티스레드는 시스템 자원은 적게 소모하고 스레드 간 통신은 쉽지만 반면 공유 메모리의 동기화가 문제가 된다. 


* 하지만 좀비 프로세스(zombie process), 고아 프로세스(orphan process) 문제가 남아있다. 전자는 자식 프로세스가 종료되었으나 부모 프로세스가 자식의 종료 상태를 회수하지 않은 경우고, 후자는 부모가 자식보다 먼저 종료되는 경우다.

5. 참고자료