쓰레드 (Thread)
: 운영체제가 프로세스 안에서 작업을 처리하는 더 작은 실행 단위
- 운영체제가 작업을 처리하는 단위는 프로세스 내의 쓰레드임
쓰레드 등장 이유
- 프로세스 단위 실행의 오버헤드와 느린 통신 문제를 해결하기 위해
⇒ 하나의 프로세스 안에서 여러 개의 쓰레드를 만들어서 작업 분산 - 사용자가 운영체제에게 작업을 요구하면, 그만큼 프로세스의 수가 늘어남
→ 프로세스가 생성되면 PCB가 생성되고, 메모리에 code, data, stack, heap 영역을 만들어줘야 함
→ 프로세스가 많아지면, 프로세스 수만큼 PCB, code, data, stack, heap 영역도 만들어줘야 하기 때문에 너무 무거워짐
쓰레드가 생겨난 배경 예시
- 웹 브라우저를 실행하면 프로세스 1개가 생성된다.
- 탭을 하나 더 열면 → 기존 프로세스를 복사해서 새로운 프로세스를 만든다.
- 탭을 20개 열면 → 프로세스 복사가 20번 일어나고, 각각의 PCB(Process Control Block), 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역이 20개씩 생긴다.
⇒ 결과적으로 웹 브라우저가 메모리를 많이 차지하게 된다.
- 탭을 하나 더 열면 → 기존 프로세스를 복사해서 새로운 프로세스를 만든다.
- 이 웹 브라우저의 탭들끼리 통신하려면 IPC(Inter Process Communication)를 써야 한다.
→ 하지만 IPC는 통신 비용이 크고 느리다.
⇒ 이 문제를 해결하기 위해 "쓰레드"가 등장했다. - 실제 웹 브라우저 예시
구글 크롬 프로세스 방식 탭 1개마다 프로세스 1개 생성됨
ex) 탭 100개 → 프로세스 100개 생성 → PCB, code, data, stack, heap 영역 100개 생성파이어폭스 쓰레드 방식 처음 4개의 탭까지만 프로세스 생성 → 추가적인 탭은 생성된 프로세스 내에 쓰레드를 추가하는 식
ex) 탭 100개 → 프로세스 4개 생성 + 이 4개의 프로세스 내에 100개의 쓰레드 존재
쓰레드 특징
- 프로세스 내에 존재
- 1개 이상의 쓰레드가 있을 수 있음
- 1개의 프로세스에 1개의 쓰레드가 있을 수 있고, 10개의 쓰레드가 있을 수도 있음
- 한 프로세스 내의 쓰레드들은 그 프로세스의 PCB, code, data, heap 영역을 공유함
→ 단, stack은 공유하지 않음!!! (쓰레드마다 하나씩 있음) - 쓰레드는 코드, 데이터, 힙 영역을 공유하기 때문에 메모리 사용량이 훨씬 적고, 탭 간 통신도 빠르다.
- 각 쓰레드는 쓰레드 ID를 가지고 있고, TCB(Thread Control Block)으로 관리됨
프로세스와 쓰레드의 장단점
프로세스
✅ 장점
- 안정성: 프로세스는 서로 독립적이므로, 하나의 프로세스에 문제가 있어도 다른 프로세스에 영향 없음
❌ 단점
- 오버헤드가 큼
→ 각각의 프로세스는 서로 고유한 자원을 갖고 있음
→ code, data, stack, heap 영역을 전부 따로 두고 있고, 프로세스 간의 통신을 하려면 IPC를 이용해야 함
⇒ 오버헤드가 크고, 속도가 느림
쓰레드
✅ 장점
- 오버헤드가 낮음
→ 한 프로세스 내에서 stack 영역을 제외한 모든 메모리 공간을 공유하기 때문 - 쓰레드 간 통신이 쉬움
→ 데이터 공유가 가능하기 때문
❌ 단점
- 안정성 낮음
→ 하나의 프로세스 내에 있기 때문에, 해당 프로세스에 문제가 생기면 모든 쓰레드가 영향을 받음 - 데이터가 공유되는 공간에서 문제가 생길 수 있음