Process vs Thread
참고 자료
- 조성호 - 쉽게 배우는 운영체제 3장 프로세스와 스레드
0. 들어가며¶
운영체제의 첫 문서는 프로세스 vs 쓰레드
로 정했습니다.. 그만큼 중요하고 면접에도 자주나오는 질문입니다. 신입 개발자 면접을 보면 열번중에 다섯번 정도는 가볍게 물어보는 질문입니다. 물론 보통 여기서 멈추지 않고 멀티 쓰레드 프로그래밍 이란?
, 멀티 쓰레드 프로그래밍의 주의 사항
, 동시성 프로그래밍
... 등등 무시무시한 꼬리질문 들이 따라옵니다.
1. 프로세스¶
- 운영체제로 부터 시스템 자원을 할당 받는 작업의 단위
- 할당 받는 시스템 자원에는 CPU 타임, 메모리 영역(가상 메모리), 2차 메모리 등이 있습니다.
- 프로세스는 독립적인 가상 메모리 영역 (Virtual Memory Space) 을 가집니다.
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) 상태를 가지며 아래와 같은 상태 다이어그램을 가집니다.
- 이런 상태는 운영체제의 프로세스 스케쥴링에 의해 이루어집니다. 스케쥴링의 핵심은 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 영역에서는 각 쓰레드별 지역변수와 함수 콜스택 등을 관리합기위해 공유하지 않습니다.
1. 특징¶
- 스레드는 프로세스 내에서 각각 stack 만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작하는 실행 흐름, 프로세스 내의 주소 공간이나 자원들(힙공간) 등을 같은 프로세스 내에서 스레드 끼리 공유하며 실행된다.
2. 쓰레드 모델¶
쓰레드의 종류 (대표적인 것)
- 유저쓰레드 - 쓰레드 개념을 프로그래밍 레벨에서 추상화 한것
- 커널쓰레드 - OS 커널 레벨에서 생성되고 관리되는 쓰레드
- 쓰레드는 크게 유저 영역에서 실행되는 유저 쓰레드와 커널 영역에서 실행되는 커널 쓰레드로 구분됩니다.
- 유저 쓰레드가 실행되기 위해서는 항상 커널 쓰레드 와 연결되어 동작해야 합니다.
유저 쓰레드를 커널 쓰레드에 매핑 시키는 방법을 쓰레드 모델이라고 하며 크게 세가지 방법이 있습니다.
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
Created: December 27, 2022