프로세스 vs 스레드
프로세스 (Process)
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
(프로그램은 어떤 작업을 위해 실행할 수 있는 파일을 의미하며, 실행 전에는 보조기억장치에 있다가 메모리에 적재하고 실행하는 순간 프로그램은 프로세스가 된다.)
= 운영체제로부터 시스템 자원을 할당받는 작업의 단위
= 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
프로세스가 할당받는 시스템 자원
- CPU 시간
- 운영되기 위해 필요한 주소 공간
- 독립된 메모리 영역 (Code, Data, Stack, Heap 의 구조로 이루어짐)

i. 코드영역
- 텍스트 영역이라고도 하며, 실행할 수 있는 코드가 저장된다.
- 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에, 쓰기가 금지된 read-only 공간이다.
ii. 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장된다. (ex. 전역 변수)
코드영역과 데이터 영역은 크기가 변하지 않는 고정된 영역이라는 점에서, 정적 할당 영역이라고 부른다.
iii. 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장공간이다.
- 힙 영역에 메모리 공간을 할당했다면, 언젠가는 해당 공간을 반환해야 한다. 그렇지 않는 경우, 할당된 힙 영역은 메모리 내에 계속 남아 메모리 낭비를 초래한다. (=메모리 누수)
iv. 스택 영역
- 데이터를 일시적으로 저장하는 공간이다. (ex. 매개변수, 지역변수 등 일시적으로 사용할 데이터)
- 일시적으로 저장할 데이터는 스택 영역에 PUSH 되고, 더 이상 필요하지 않은 데이터는 POP 되어 스택 영역에서 사라진다.
힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있다는 점에서, 동적 할당 영역이라고 부른다.
프로세스의 특징
- 기본적으로 프로세스 당 최소 1개의 스레드(메인 스레드)를 갖는다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면, 프로세스 간 통신(IPC: inter-process communication)을 사용해야 한다.
스레드 (Thread)
프로세스 내에서 실행되는 여러 흐름의 단위를 의미한다.
즉, 프로세스의 특정한 수행 경로로, 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
스레드의 특징

- 스레드는 프로세스 내에서 Code, Data, Heap 영역은 공유하며, Stack 영역만 각각 따로 할당받는다.
- 같은 프로세스 내 여러 스레드들은 같은 힙 공간을 공유한다. (프로세스는 다른 프로세스 메모리에 직접 접근 X)
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
멀티 프로세스 vs 멀티 스레드
멀티 프로세스
하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술이다.

- 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성하여, 다중 프로세스를 구성하는 구조이다.
- 각각의 고유한 PID (Process ID)를 통해, 부모 프로세스와 자식 프로세스 간 제어 및 통신이 가능하다.
- 통신이 가능하지만, 부모 프로세스와 자식 프로세스는 독립적으로 실행되며, 독립적인 메모리 공간을 가지고 있어 서로 다른 작업을 수행한다.
- 예시) 각기 다른 사이트 실행하고 있는 각 브라우저 탭
멀티 프로세스의 장점
1. 프로그램 안전성
하나의 프로세스가 비정상적으로 종료되어도, 다른 프로세스에 영향을 주지 않기 때문에 프로그램 전체의 안전성을 확보할 수 있다.
2. 시스템 확장성
새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지 않기 때문에, 시스템의 규모를 쉽게 확장할 수 있다.
멀티 프로세스의 단점
1. Context Switching 오버헤드
※ Context Swithching 이란, CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면 이전에 보관하고 있던 프로세스의 상태를 복구하는 작업이다.
CPU는 다음 프로세스의 정보를 불러오기 위해 CPU 캐시에 있는 내용을 모두 초기화하고, 새로운 프로세스 정보를 CPU캐시에 적재하므로, 빈번한 Context Switching 작업으로 인해 비용 오버헤드가 발생할 수 있다.
2. 자원 공유 비효율성
각 프로세스가 독립적인 메모리 공간을 가지므로, 결과적으로 메모리 사용량이 증가한다.
각 프로세스 간 자원 공유가 필요한 경우, 프로세스 사이의 어렵고 복잡한 통신 기법인 IPC를 사용해야 한다.
멀티 스레드
하나의 프로세스 안에 여러 개의 스레드가 있는 것을 말한다.

- 멀티 스레드를 통해, 하나의 프로그램에서 두가지 이상의 동작을 동시에 처리할 수 있게 된다.
- 예시) 웹 브라우저 단일 탭 내에서, 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리
멀티 스레드의 장점
1. 프로세스보다 용량이 가볍다.
스레드는 프로세스 내에서 생성되기 때문에, 스레드의 실행 환경을 설정하는 작업이 매우 간단하여 생성 및 종료가 빠르다.
서로 자원을 공유할 수 있기 /대문에, 기본적으로 내장되어 있는 데이터 용량이 프로세스보다 작다.
2. 자원의 효율성

하나의 프로세스 내에서 여러 개의 스레드가 생성되기 때문에, heap 영역과 같은 공유 메모리에 대해 스레드 간 자원 공유가 가능하다. 따라서, IPC를 사용하지 않고도 데이터를 공유할 수 있기 때문에, 자원의 효율적인 활용이 가능하여 시스템 자원 소모가 줄어든다.
3. Context Switching 비용 감소
스레드에도 Context Switching 오버헤드가 존재하지만, 프로세스에 비해 상대적으로 훨씬 낮다.
스레드 Context switching의 경우, 스레드 간 공유하는 자원을 제외한 스레드 정보만 교체하면 되므로 프로세스보다 스위칭 비용이 상대적으로 낮다.
4. 응답시간 단축
위의 자원 공유가 용이하고, context switching 오버헤드가 작다는 장점으로 인해, 멀티 프로세스 보다 응답 시간이 빠르다.
멀티 스레드의 단점
1. 안정성 문제
하나의 스레드에 문제가 발생하면, 다른 스레드들도 영향을 받아 전체 프로그램이 종료될 수 있다.
(이러한 부분은, 적절한 예외처리로 방지할 수 있다.)
2. 동기화로 인한 성능 저하
여러 개의 스레드가 공유 자원에 동시 접근하여 동시에 한 자원을 변경하는 위험이 있기 때문에, 스레드 간 동기화(synchornized)는 데이터 접근을 제어하기 위한 필수적인 기술이다.
즉, 동기화 작업은 자원에 대한 여러 스레드들의 접근을 순차적으로 통제하는 것으로, 동시 접근으로 인한 동시 수정과 같은 현상을 방지한다. 이는, 여러 스레드 접근을 제한하는 것이기 때문에, 병목 현상으로 성능이 저하될 가능성이 높다는 단점이 있다.
3. Context Switching 오버헤드
어쨋든 스레드 수가 많을수록 그만큼 Context switching이 많이 발생하여, 성능 저하로 이어질 수 있다.
4. 디버깅의 어려움
여러 개의 스레드가 동시에 실행되기 때문에, 각 스레드의 동작을 추적하기 어려울 수 있다.
References
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
'CS스터디' 카테고리의 다른 글
| [Web] OAuth의 개념, OAuth의 동작 메커니즘 (1) | 2024.03.18 |
|---|---|
| [자료구조/알고리즘] 인덱스의 개념, 인덱스 자료구조 (해시 테이블, B+ Tree) (1) | 2024.02.26 |
| [Web] Web Server와 WAS (0) | 2024.02.06 |
| [Web] Reflow와 Repaint, Reflow 최적화 (1) | 2024.02.05 |
| [Web] 렌더링 종류 (0) | 2024.02.04 |