Skip to content

Process vs Thread

#os

참고 자료

0. 들어가며

운영체제의 첫 문서는 프로세스 vs 쓰레드 로 정했습니다.. 그만큼 중요하고 면접에도 자주나오는 질문입니다. 신입 개발자 면접을 보면 열번중에 다섯번 정도는 가볍게 물어보는 질문입니다. 물론 보통 여기서 멈추지 않고 멀티 쓰레드 프로그래밍 이란?, 멀티 쓰레드 프로그래밍의 주의 사항, 동시성 프로그래밍 ... 등등 무시무시한 꼬리질문 들이 따라옵니다.

1. 프로세스

  • 운영체제로 부터 시스템 자원을 할당 받는 작업의 단위
  • 할당 받는 시스템 자원에는 CPU 타임, 메모리 영역(가상 메모리), 2차 메모리 등이 있습니다.
  • 프로세스는 독립적인 가상 메모리 영역 (Virtual Memory Space) 을 가집니다.

images/process-memory.png

1. 특징

  • 각각 독립된 메모리 영역 (Code, Data, Stack, Heap의 구조)을 할당 받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 (IPC, inter-process communication)을 사용해야 한다.
    • e.g.) OS의 파이프, 소켓 등을 이용한 통신 방법 이용

2. 프로세스의 상태

  • 프로세스는 5가지 활성 상태 (NEW(CREATE), READY, RUNNING, BLOCKING(WAIT), TERMINATE) 와 두가지 대기 상태 (SUSPENDED READY, SUSPENDED BLOCKING) 상태를 가지며 아래와 같은 상태 다이어그램을 가집니다.

images/process-state-diagram.png

프로세스 상태 다이어그램
  • 이런 상태는 운영체제의 프로세스 스케쥴링에 의해 이루어집니다. 스케쥴링의 핵심은 Ready Queue 에서 실행될 프로세스를 선정하는 것입니다. 보통 프로세스의 우선순위를 바탕으로한 Multilevel Feedback Queue 방식이 활용되며 이외에도 다양한 스케쥴링 알고리즘이 있습니다.
  • 선정된 프로세스는 디스패처에 의해 CPU 자원을 할당받아 RUNNING 상태가 됩니다.

3. PCB

  • READY QUEUE 와 WAITING QUEUE 에서 관리되는 대상은 PCB (process Control Block) 입니다.
  • PCB의 자세한 구성 정보 - 링크

2. 쓰레드

  • 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 흐름의 단위
  • 같은 프로세스내의 쓰레드 간에는 가상 메모리 영역 (VMS) 을 공유합니다.
    • HEAP, CODE, DATA 영역은 공유하고 STACK 영역에서는 각 쓰레드별 지역변수와 함수 콜스택 등을 관리합기위해 공유하지 않습니다.

images/thread.png

1. 특징

  • 스레드는 프로세스 내에서 각각 stack 만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작하는 실행 흐름, 프로세스 내의 주소 공간이나 자원들(힙공간) 등을 같은 프로세스 내에서 스레드 끼리 공유하며 실행된다.

2. 쓰레드 모델

쓰레드의 종류 (대표적인 것)

  • 유저쓰레드 - 쓰레드 개념을 프로그래밍 레벨에서 추상화 한것
  • 커널쓰레드 - OS 커널 레벨에서 생성되고 관리되는 쓰레드


- 쓰레드는 크게 유저 영역에서 실행되는 유저 쓰레드와 커널 영역에서 실행되는 커널 쓰레드로 구분됩니다. - 유저 쓰레드가 실행되기 위해서는 항상 커널 쓰레드 와 연결되어 동작해야 합니다.


유저 쓰레드를 커널 쓰레드에 매핑 시키는 방법을 쓰레드 모델이라고 하며 크게 세가지 방법이 있습니다. images/thread-models.png

3. 자바 쓰레드

  • 일반 스레드와 거의 차이가 없으며, JVM 이 운영체제의 역할을 한다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재한다. (JVM 자체가 하나의 프로세스라는 의미)
  • 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
  • 자바에는 스레드 스케줄링은 전적으로 JVM에 의해 이루어 진다.
  • 모든 자바 앱은 하나 이상의 스레드를 포함한다.
    • 기본적으로 메모리 관리(gc) 스레드 같은 시스템 스레드와 하나의 main 스레드가 실행된다.
  • 자바의 쓰레드 모델은 직접 JVM에서 관리하는 것이 아니라 그 아래 단의 OS에 위임을 합니다. 그래서 특정 할 수는 없지만 자주 사용되는 window 나 Linux 에서는 플랫폼에서 지원하는 one-to-one 모델을 Solaris OS 에서는 many-to-many 모델을 사용한다고 합니다.

Last update: February 26, 2023
Created: December 27, 2022