프로세스(Process) vs 쓰레드(Thread)
🐾 Process
- 실행중인 프로그램
- 운영체제로부터 자원을 할당받아 실행
- 코드, 데이터, 스택, 힙 메모리 영역 공인
🐾 Thread
- 프로세스의 독립적인 실행 단위
- 프로세스 안에서 프로세스로부터 자원을 받아 실행
- 프로세스의 코드, 데이터, 힙 메모리 영역 공유
- 개별적인 스택, PC 등을 가짐
👉 쓰레드가 개별적인 스택을 가지는 이유
- 스택에는 함수 호출 시의 전달인자, 지역 변수, 되돌아갈 주소 등을 저장
- 독립적인 스택을 갖는 것은 독립적인 함수 호출이 가능하고 독립적인 실행 흐름을 추가할 수 있다는 것을 의미
👉 쓰레드마다 독립적인 PC 레지스터를 가지는 이유
- 쓰레드는 CPU를 할당받고, 반납하고를 반복
- 이전까지의 수행 내역을 기억하기 위해 독립적인 PC 사용
👉 쓰레드가 fork와 비교하여 가지는 장점
- copy를 하지 않기 때문에 사이즈가 작다.
- 전역 변수를 공유하기 때문에 그 자체로 프로그램을 유용하게 쓸 수 있다.
멀티 프로세싱 (Multi-Processing) vs 멀티 쓰레딩 (Multi-Threading)
🐾 멀티 프로세싱
- 다수의 프로세서(CPU)가 여러 작업을 동시에 처리하는 것 (병렬 처리)
- Pipe나 Shared Memory가 있어야 데이터를 주고 받을 수 있음
- 많은 메모리 공간을 차지
- IPC라는 별도 매커니즘을 사용
- 프로세스 간의 통신 비용/문맥 교환 비용이 큼
- 안전성: 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행
✏️ IPC (Inter Process Communication)
프로세스 간의 통신을 하는 것으로 pipe, 공유 메모리(shared memory, shmem), 소켓 등을 통해서 구현
👉 멀티 프로세스의 문제점
- 메모리 영역을 duplicate 함으로써 메모리 공간을 낭비하게 되고, 데이터를 공유하지 않음으로써 우수한 소프트웨어를 구현하기 어렵다.
🐾 멀티 쓰레딩
- 하나의 프로세스에 여러 쓰레드로 자원을 공유하며 작업을 나누어 수행하는 것
- 쓰레드 간은 데이터/힙 영역을 공유하므로 Shared Memory가 없어도 데이터를 주고 받을 수 있음
- 적은 메모리 공간을 차지
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소함으로서 자원을 효율적으로 관리
- 쓰레드 간의 통신 비용과 문맥 교환 비용이 적음
- 하나의 쓰레드의 비정상적인 활동은 전체 쓰레드에 영향을 끼칠 수 있음
👉 멀티 쓰레드의 장점
- 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 더욱 효율적이다.
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- Context Switching시, 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 더 빠르다.
-> 쓰레드는 Stack 영역만 초기화하면 되기 때문에
- 쓰레드는 프로세스 내의 메모리를 공유하기 때문에 데이터 전달이 간단하므로 IPC에 비해 비용이 적고 더 빠르다.
-> 쓰레드는 프로세스의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에
👉 멀티 쓰레드의 단점