운영체제 1: 프로세스 스레드의 개념, 차이

프로세스 스레드

이번 글에서는 운영체제에서 가장 중요한 프로세스 스레드의 개념과 차이에 대하여 알아보겠습니다. 또한 프로세스의 상태, 생성 과정, 그리고 메모리 구조를 이해해보겠습니다.

 

프로세스와 스레드의 차이

process-thread
프로세스와 스레드의 관계 (이미지 출처: https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html)

 

프로세스 (Process):

프로세스 (Process)는 코드를 실행하기 위하여 운영체제(OS)로부터 시스템 자원을 할당받는 작업의 단위입니다. 이 때 할당 받는 것은 다음과 같습니다.

  • CPU 시간
  • 메모리

스레드 (Thread):

스레드 (Thread)는 프로세스 내에서 작업을 처리하는 단위입니다. 스레드는 프로세스 메모리 내에서 각각의 스택 (Stack) 메모리만 따로 할당받고, 코드 (Code), 데이터 (Data), 힙 (Heap) 메모리 영역은 다른 스레드와 공유합니다.

 

프로세스 생성 과정

프로세스는 다음과 같은 과정을 거쳐 생성됩니다.

  1. Process Control Block (PCB) 이 생성되어 메모리를 할당합니다.
  2. 운영체제 (OS)가 실행한 프로그램의 코드를 읽어들여, 프로세스에 할당된 메모리의 텍스트 (Text) 영역에 저장합니다.
  3. 초기화된 전역 변수 및 static 변수를 data 영역에 할당합니다.
  4. 힙 (Heap)과 스택 (Stack) 은 초기 메모리 주소 초기화합니다.
  5. PCB에 여러 정보가 기록되면 Ready Queue 에서 CPU 를 할당받을 때까지 대기합니다.

 

프로세스의 상태 (State)

프로세스는 다음과 같은 5가지 상태(state)를 가질 수 있습니다.

process-stage
프로세스의 5가지 상태(state). (이미지 출처: https://zetawiki.com/wiki/%ED%8C%8C%EC%9D%BC:Process-state.jpg)
  • New:
    • 프로세스가 처음 생성된 상태.
    • 디스크에서 메모리로 프로그램이 올라가서 실행을 준비합니다.
  • Terminated:
    • 수행 (execution) 이 종료된 상태.
  • Running:
    • 프로세서 (CPU) 를 배정 받아서 instructions 를 수행하는 상태.
  • Ready:
    • 프로세서 (CPU) 를 배정 받기를 기다리는 상태.
  • Waiting:
    • 특정 event 가 수행 완료되기를 기다리는 상태.
    • 특정 event 가 완료되기 전까지는 프로세서를 배정받아도 instrunction 을 수행할 수 없습니다.

 

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

pcb-diagram
PCB 의 구조

 

프로세스에서 관리할 필요가 있는 모든 정보는 프로세스 제어 블록 (Process Control Block, PCB) 에 저장됩니다. 다시 말하면, PCB 는 특정 프로세스를 관리할 때 필요한 모든 정보를 포함하는 운영체제 커널의 자료구조 입니다.

프로세스가 생성될 때 운영체제는 PCB 를 할당하며, 프로세스가 종료되면 PCB 는 할당 해제됩니다.

 

컨텍스트 스위칭 (Context Switching)

컨텍스트 스위칭 (Context Switching) 이란, 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 Task(프로세스, 스레드)의 상태를 저장하고 다음에 진행할 Task의 상태값을 읽어 레지스터에 적재하는 과정을 뜻합니다.

즉, 프로세스 A 가 이미 CPU를 사용 중일 때, 프로세스 B 가 해당 CPU를 사용하기 위해서 A 의 상태를 저장하고 B의 상태를 레지스터에 적재하는 과정을 말합니다.

프로세스간의 컨텍스트 스위칭 (Context switching) 에서는 프로세스의 상태를 PCB 에 저장합니다.

 

컨텍스트 스위칭 진행 과정

context-switching
컨텍스트 스위칭의 과정. (이미지 출처: : https://afteracademy.com/blog/what-is-context-switching-in-operating-system/)

  1. CPU가 Process P1 에서 Process P2 로 전환하면 시스템은 Process P1 의 상태를 Process P1 의 PCB 에 저장합니다.
  2. 대기열에서 Process P2 를 선택하고 Process P2 의 PCB 데이터를 복원합니다.
  3. PCB B 의 프로그램 카운터 (레지스터) 가 로드되어 선택한 프로세스에서 실행을 계속합니다.

 

프로세스의 메모리 구조

process-memory
프로세스 메모리는 동적 영역인 스택 (stack)과 힙 (heap), 정적 영역인 코드 (code, text)와 데이터 (data)로 나눠집니다. (이미지 출처: https://www.includehelp.com/operating-systems/memory-layout-of-a-process.aspx)

 

프로세스의 메모리는 동적 영역인 스택 (stack)과 힙 (heap), 정적 영역인 코드 (code, text)와 데이터 (data)로 나눠집니다.

1. 텍스트 (Text) 영역

텍스트 (Text) 영역은 실행할 프로그램의 코드가 저장되는 곳 입니다. “코드 (Code) 영역” 이라고 불리기도 합니다.

CPU는 텍스트 (Text) 영역에 저장된 명령어를 하나씩 가져와서 처리합니다.

 

2. 데이터 (Data) 영역

데이터 (Data) 영역은 전역 변수(global variables)와 정적 변수(static variables)가 저장되는 곳입니다. 

 

3. 스택(Stack) 영역

스택(Stack) 영역은 잠시 사용되고 사라지는 데이터를 저장되는 곳입니다. 이 때, 잠시 사용되고 사라지는 데이터는 지역 변수 (local variables), 매개 변수 (parameter), 리턴 주소 (return address) 등이 있습니다.

스택의 메모리는 함수 호출 (function call) 시 할당되고, 함수 리턴 (function return) 시 소멸됩니다.

스택의 메모리 사이즈는 컴파일 타임에 정해집니다.

 

4. 힙 (Heap) 영역

힙 (Heap) 영역은 메모리 주소 (address)에 의해서만 참조되고 사용되는 메모리 영역입니다.

힙의 메모리는 런타임에 사이즈가 결정됩니다.

힙 메모리를 너무 크게 잡는 것은 좋지 않을 수도 있습니다. 메모리 사이즈를 너무 크게 잡으면 가비지 콜렉션 (Garbage Collection, GC)가 오래걸릴 수 있기 때문입니다.

힙 영역을 가장 직관적으로 이해할 수 있는 예는 C언어에서 사용하는 malloc(), calloc() 함수 입니다. malloc(), calloc() 함수를 통해에 heap 메모리를 할당받을 수 있습니다.

단, 이 경우에는 free()를 통해 메모리를 반납해줘야 합니다. 메모리를 반납하지 않을 경우, 메모리 누수 (memory leak)가 생길 수 있기 때문입니다.

 

함께 읽으면 좋은 글

 

Reference

Leave a Comment