프로세스는 실행 중인 프로그램을 의미하며, 스레드는 경량 프로세스를 의미한다.
스레드는 프로세스에 비해 더 적은 컴퓨터 자원을 필요로한다.
프로세스가 OS를 통해 자원을 할당 받는다면, 스레드는 프로세스를 통해 자원을 할당 받는다.
스레드는 프로세스 내부에서 메서드를 기준으로 한 실행 흐름을 분리한 것이다.
자바로 예를 들면 Thread 클래스의 run 메서드를 기준으로 실행 흐름이 분리되어 자원을 할당 받아 수행되는 것이다.
멀티 프로세스와 멀티 스레드는 다중 코어 환경에서 컴퓨터 자원을 효율적으로 사용할 수 있는 환경을 보장한다.
멀티 프로세스와 멀티 스레드를 아래 3가지 관점에서 비교 해보도록 하겠다.
- 자원 관리
- 컨텍스트 스위칭
- 병렬성과 동시성
자원 관리

멀티 프로세스 환경에서는 위와 같이 프로세스 마다 독립된 Code, Data, Stack, Heap 영역을 할당 받는다.
그림에는 포함 되지 않았지만 program counter 값 또한 프로세스마다 갖는다.

반면, 멀티 스레드 환경에서는 Stack과 program counter 영역만 별도로 할당 받고 나머지 영역의 자원은 공유한다.
멀티 프로세스의 자원관리
멀티 프로세스는 프로세스마다 모든 영역을 할당 받기에 메모리 공간을 많이 필요로 하는 단점이 있다.
하지만 프로세스마다 독립적으로 모든 영역을 할당 받는다는 것은 병렬 작업에서 서로 공유하는 자원이 없으므로 안전하다는 것을 의미한다.
물론, 공유하는 자원이 없을 때 얘기이며, 공유 자원이 존재한다면 shared memory, messaging passing와 같은 프로세스간 통신(IPC)을 위한 복잡한 구현을 필요로 할 수 있다.
멀티 스레드의 자원관리
스레드는 스택 영역과 프로그램 카운터만 별도로 할당 받고 나머지 공간은 공유하여 사용할 수 있으니 메모리 관리 측면에서 효율을 얻을 수 있다.
또한 자원 공유를 하는데 있어 프로세스 내부에 있는 자원에 접근하므로 복잡한 IPC를 고려하지 않아도 된다.
다만, 공유 자원에 대해 여러 스레드가 접근하여 변경할 수 있어 동시성 문제가 발생할 수 있다.
모든 자원을 독립적으로 할당하는 프로세스에 비해 안정성이 떨어질 수 있다.
멀티스레드 프로그램 개발자는 이에대한 문제를 직접 해결해야 한다.
컨텍스트 스위칭
이부분을 이해하기 위해서는 프로세스 상태, PCB, 컨텍스트 스위칭에 대한 배경지식이 필요하다.
해당 내용에 대해 모르고 있다면 아래글을 통해 참고하자.
https://developer111.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A42
먼저 PCB와 TCB에 대해 알아보자.

프로세스의 컨텍스트 스위칭에 사용되는 문맥정보를 PCB라고 하고,
스레드 컨텍스트 스위칭에 사용되는 문맥정보를 TCB라고 한다.
위의 그림에서처럼 TCB는 PCB의 일부로 PCB 안에 존재한다.

TCB는 PCB에 비해 가볍기에 Context Switching 처리 또한 빠르다.
프로세스의 Context Switching은 code, data, heap 영역의 정보 또한 저장하고 있어야하지만,
TCB의 경우 stack과 간단한 레지스터 정보만 저장하기에 가벼운 자료구조를 통해 더 빨리 읽고 쓸 수 있다.
병렬성과 동시성
병렬설과 동시성은 다른 뜻이다.
병렬성은 동시 작업 수행을 의미하고,
동시성은 CPU의 시분할 작업을 통해 마치 동시에 작업을 수행하는 것처럼 보여지는 것을 의미한다.
완전한 병렬성을 위해서는 CPU의 코어 수에 작업 수를 맞춰야한다.
CPU의 각 코어가 하나의 프로세스를 처리하는 방식으로 동시 작업을 수행하게 할 수 있다.
반면, 동시성은 코어 하나가 여러개의 작업을 시분할을 통해 동시에 수행되는 것처럼 보이게한다.
병렬성과 동시성은 멀티 프로세스와 멀티 스레드 모두에 존재하는 개념이다.
컴퓨터 입장에서 병렬성과 동시성의 차이는 CPU 코어가 하나의 작업을 하는지 여러 작업을 하는지 차이이다.
이는 멀티 프로세스와 멀티스레드를 선택하는 기준이 될 수 있다.
CPU의 연산 작업이 많다면 CPU 코어 하나에 여러 작업을 맡겨도 성능 향상을 기대하기 어렵다.
반면 CPU 연산 작업 보다 IO와 같이 다른 작업이 많다면 코어 하나에 여러 작업을 맡긴다면 성능 향상을 기대할 수 있다.
따라서 CPU 연산 작업이 많은 프로세스의 경우 멀티 프로세스를 통해 병렬성을 확보하고,
CPU 연산 작업이 적은 프로세스는 멀티 스레드를 통해 코어 하나에 많은 작업을 할당하도록 하여 동시성을 통해 성능 향상을 기대할 수 있다.
물론, 멀티 스레드에서도 병렬성을 확보할 수 있으니 병렬성과 동시성을 모두 확보할 수 있다.
웹 프로그래밍의 경우 클라이언트와 통신, DB와 통신에서 IO 작업이 빈번하게 발생한다.
이런 환경에서 멀티 스레드 기반 프로그램을 선택하는 것이 성능향상에 도움이 될 수 있다.
(허나, 요즘은 비동기 프로그래밍을 통해 싱글 스레드 기반 멀티 프로세스를 웹프로그래밍에서도 많이 적용함.
사용해보지 않아 설명은 생략하겠다.)
'OS & Network > OS' 카테고리의 다른 글
동시성 문제[2] - Mutex, Semaphore, Monitor(동기화 도구) (0) | 2024.07.28 |
---|---|
동시성 문제[1] - 동시성 문제의 원인과 해결법 (0) | 2024.07.28 |
프로세스[1] - 프로세스란, PCB와 Context Switch (0) | 2024.07.25 |
메모리[2] - 페이징, 가상메모리 (0) | 2024.07.25 |
메모리[1] - 메모리 주소 할당 (0) | 2024.07.20 |