CS - 4. 쓰레드와 쓰레드 풀
Sparta 내일배움캠프 학습으로, CS강의에 대한 공부를 위한 필기입니다.
01. 프로세스와 쓰레드
프로세스 : 프로그램을 실행해주는 주체 ex) 상가건물을 컴퓨터라고 한다면 치킨을 만드는 치킨집을 프로세스라고 볼 수 있음.
쓰레드 : 작업을 처리하는 주체 ex) 치킨집을 하는 집안에서 실제 업무를 분담에서 하는 직원을 쓰레드라고 볼 수 있음. -> 치킨 튀기는 직원, 주문받고 계산하는 직원, 서빙하고 설거지하는 직원 -> 치킨집 안의 공간과 재료를 같이 씀.(자원 공유)
1
2
3
📌 프로세스와 쓰레드
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
쓰레드 : 다른 쓰레드와 공간과 자원을 공유하면서 사용
1-1. 프로세스와 쓰레드의 차이점
- 프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
- 프로세스는 메모리 상에서 실행중인 프로그램, 쓰레드는 이 프로세스 안에서 실행되는 흐름 단위
- 프로세스는 최소 하나의 쓰레드 보유, 각각 별도의 주소 공간을 독립적으로 할당 받음
1
2
3
4
5
6
7
8
📌 프로세스 만으로 작업을 처리할 때 문제점
프로세스 생성에 큰 오버헤드 : 많은 시간 소요
프로세스 문맥교환(컨텍스트 스위칭)의 비효율성 : 오버헤드가 큼
프로세스 사이 통신 어려움 : 비용이 비싼 IPC 사용
IPC : 프로세스간 통신을 위한 메커니즘, 프로세스 간 데이터를 주
고 받기 위한 방법, Message Queue, Shared Meomory, Semaphore,
Socket 등 방법이 있음
- 쓰레드 : 다른 쓰레드와 공간과 자원을 공유하면서 사용
- 쓰레드는 프로세스 안에서 작업을 처리하는 주체
- 자원 중에 stack만 따로 할당받고 나머지 영역은 쓰레드끼리 서로 공유
1
2
3
4
5
6
📌 쓰레드가 해결한 문제
프로세스보다 크기가 작은 실행 단위 구현
프로세스의 생성 및 소멸에 따른 오버헤드 감소
쓰레드간 자원을 공유함으로써 빠른 문맥교환
프로세스들의 통신 시간, 방법 어려움 해소
💡 프로세스와 쓰레드 비교
- OS는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당함
- 각각 독립된 메모리 영역을 할당하므로 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없음.
- 쓰레드는 메모리를 서로 공유
- 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유
- 각각의 쓰레드는 별도의 stack을 가지고 있지만 Heap 메모리는 서로 읽고 쓸 수 있음. ex) 치킨집에서 각자 일하는 공간(Stack)이 있지만, 같이 보는 업무 가이드(Code)가 있고 주문도 같이 받고(Data), 손님이 오고가는 홀 공간도 같이 씀(Heap)
1
2
3
4
📌 결과 :
프로세스는 OS로부터 별도의 메모리 영역을 할당 받고,
쓰레드는 Stack만 개별적으로 할당 받고 나머지
Code/Data/Heap 부분은 공유해 서로 쓸 수 있게 됨.(공유자원)
1-2. 프로세스와 쓰레드의 주소공간
- ❗ 프로세스의 특징
- 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당 받음
- 코드 영역(code area) : 프로그래머가 작성한 프로그램이 저장되는 영역
- 데이터 영역(data area) : 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있음
- 스택 영역(stack area) : 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역변수 등이 저장됨
- 힙 영역(Heap area) : 동적으로 할당되는 데이터를 위해 존재
최소 1개 이상의 스레드(메인 스레드)를 가짐
- 각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 달느 프로세스의 자원에 접근할 수 없음
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 IPC 통신을 사용해야함.
- 그림을 참고하면 여러 프로세스가 동시에 실행되고 관리 되는 것처럼 보이지만 CPU는 한 번에 한 가지 명령어만 처리할 수 있음. 즉, 동시가 아니라 빠르게 프로세스들을 번갈아가면서 실행하고 관리(스케줄링)하고 있는 것
번갈아가면서 실행하고 관리 : 스케줄링 번갈아가면서 실행 : 문맥교환
- 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당 받음
프로세스 내에서 실행되는 여러 흐름의 단위
프로세스의 특정한 수행 경로
- ❗ 쓰레드의 특징
프로세스 내에서 필요한 Stack만 할당받고 Code, Data, Heap 영역은 공유해서 각 쓰레드가 공유함
- 같은 프로세스 내 쓰레드끼리 자원을 공유하며 실행
- 프로세스 하나만 사용해서 프로그램을 실행하기에는 메모리 낭비가 발생
- 쓰레드는 쓰레드 간 메모리를 공유하며 작동
1-3. 멀티 프로세스 멀티 쓰레드
종류 | 멀티 프로세스 | 멀티 쓰레드 |
---|---|---|
의미 | 하나의 OS 안에서 여러 프로세스가 실행되는 것 | 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것 |
장점 | 하나의 프로세스가 죽어도 다른 프로세스에는 영향을 끼치지 않음 | 1. 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리 가능 2. Code, Heap, Data 영역을 공유하므로 데이터를 주고받는 것이 간단, 자원 소모 적음 3. 쓰레드 사이 작업량이 작아 문맥교환이 빠르며 시스템 처리량 증가 |
단점 | 1. 작업량이 많을수록 오버헤드 발생, 문먁 교환으로 인한 성능 저하 유발 2. 프로세스 사이 통신 복잡 | 1. 프로그램 디버깅이 까다로움 (에러추적) 2. 하나의 쓰레드에 문제가 생기면 전체적인 프로세스에 영향을 끼침 3. 동기화 문제 발생(전역 변수를 이용하기 때문) 4. 단일 프로세스시스템에서 효과를 기대하기 어려움. 5. 다른 프로세스에서 쓰레드 제어 불가 |
특징 | 여러개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스는 영향을 받지 않음 | 1. 시스템 자원 소모 감소(자원의 효율성) 2. 시스템 처리량 감소(처리 비용) |
1
2
3
📌 멀티 프로세스 대신 멀티 쓰레드를 사용하는 이유
- 자원 효율성 증가, 처리 비용 감소, 응답 시간 단축
02. 쓰레드 풀
(이미지 출처 : 멀티플렉싱에 대한 간단한 이론 - Phruse)
(이미지 출처 : 멀티플렉싱에 대한 간단한 이론 - Phruse)
쓰레드 풀이란 쓰레드들이 모여있는 수영장(pool), 일을 해야될 때 앞순번부터 한명씩 할당, 나오라고 하는 사람 : 메인 쓰레드
컴퓨터 프로그래밍에서 쓰레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 SW 디자인 패턴
- 프로그램이 작업을 동시에 실행할 수 있도록 여러 쓰레드를 미리 생성해두고 유지 관리
- 여러 쓰레드를 동시에 만들어 실행(병렬처리) 할 수 있음.
- 쓰레드를 계속 늘려가는 건 좋지 않음. HW의 제한적인 사항이 있기 때문에 관리할 필요가 있음
- 쓰레드 풀은 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리함 ex) 치킨집에서 직원 뽑기가 어려우니 직원들을 미리 뽑아두는 것과 비슷
2-1. 쓰레드 풀을 사용하는 이유
프로그램 성능 저하를 방지하기 위해
다수의 사용자 요청을 처리하기 위해
2-2. 쓰레드 풀의 장단점
❗ 쓰레드 풀의 장점
쓰레드를 생성/수거하는데 비용이 들지 않음
- 쓰레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 쓰레드에게 할당해 줌.
- 쓰레드 풀을 미리 만들어 두기 때문에 처음에 생성하는 비용은 들지만 이전의 쓰레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있고 작업을 요청 시 이미 쓰레드가 대기 중인 상태라 작업을 실행하는 데 딜레이가 발생하지 않음
❗ 쓰레드 풀의 단점
쓰레드 풀에 쓰레드를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생
단점 개선 : Fork Join Thread Pool
2-3. 동시성과 병렬성
- 동시성
- 싱글 코어에서 멀티 쓰레드를 동작시키기 위한 방식, 멀티 태스킹을 위해 여러 개의 쓰레드가 번갈아가면서 실행되는 성질을 말함. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것임
- 병렬성
- 멀티 코어에서 멀티 스레드를 동작시키기 위한 방식, 한 개 이상의 쓰레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말함.
- 데이터 병렬성
- 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병령 처리하여 작업을 빠르게 수행
- 작업 병렬성
- 서로 다른 작업을 병렬 처리하는 것을 말함
- 데이터 병렬성
- 멀티 코어에서 멀티 스레드를 동작시키기 위한 방식, 한 개 이상의 쓰레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말함.