프로세스 내에서 실행되는 흐름의 단위
일반적으로 프로그램은 하나의 쓰레드를 갖는다.
하지만 프로그램 환경에 따라 둘 이상의 쓰레드를 동시에 실행할 수 있다.
이를 멀티 쓰레드(Multi-thread)
라고 한다.
하나의 프로세스 안의 쓰레드들의 자원은 2가지로 나뉜다.
개별적으로 갖는 자원
과 서로 공유하는 자원
- 쓰레드 ID, 프로그램 카운터(PC), 레지스터 집합, 스택
- 코드, 데이터 및 OS리소스
독립적인 실행 흐름
을 추가하기 위해프로세스는 별도의 메모리 공간
에서 실행된다.
반면 동일한 프로세스 내의 쓰레드는 공유 메모리 공간
에서 실행된다.
사용자 응답성 증가
프로세스가 여러 쓰레드로 분할된 경우 일부 쓰레드의 처리가 지연되어도, 다른 쓰레드는 작업을 계속 처리 가능
다중 처리로 성능 향상
- 단일 프로세스에 멀티 쓰레드가 있는 경우 멀티 프로세서에서 멀티 쓰레드를 예약할 수 있다
- 이는 프로세스 성능을 향상시킨다.
경제성이 좋음
- 하나의 프로세스 내에서 자원(코드, 데이터, 힙)을 공유한다.
- 때문에 프로세스에 비해 자원 자원 할당 비용이 적게 들고 문맥 교환(context switch) 비용도 적게 듬
통신이 쉬움
- 프로세스 간 통신은 특정 통신 기법(IPC)이 필요하지만, 쓰레드는 공유(데이터, 힙) 주소 공간을 사용하면 되기 때문에 데이터 교환에서는 특별한 기법이 필요 없음
안전성이 취약함
- 자원을 공유하기 때문에 타 쓰레드 메모리 공간을 덮어쓸 수 있어 안정성이 다소 취약함
운영체제에 따라 다양하게 구현할 수 있다.
사용자 수준 쓰레드
커널 수준 쓰레드
혼합 쓰레드
커널 영역 상위에서 지원되며 일반적으로 사용자 수준의 라이브러리를 통해 구현됨
이 경우 커널은 쓰레드의 존재를 인식하지 못하기 때문에 커널의 개입을 받지 않음
다수의 사용자 수준 쓰레드가 커널 수준 쓰레드 1개에 매핑됨
-> 다대일(n:1) 쓰레드 매핑
- 사용자 영역에서 생성 및 관리되므로 속도가 빠름
- 커널의 개입을 받지 않기 때문에 이식성(portability) 이 높음 (운영체제 호환성 good)
- 커널에서 쓰레드가 하나라고 판단하기 때문에 하나의 쓰레드가 중단되면 나머지 모든 쓰레드도 중단
운영체제가 지원하는 쓰레드 기능으로 구현되며 커널
이 쓰레드의 생성 및 스케줄링 등을 관리
사용자 수준 쓰레드와 커널 수준 쓰레드가 일대일(1:1)
로 매핑됨
-> 따라서 사용자 수준 쓰레드를 생성하면 이에 대응하는 커널 쓰레드를 자동으로 생성함
- 커널이 각 쓰레드를 개별적으로 관리하기 때문에 프로세스 내 쓰레드들이 병행으로 수행이 가능
- 그렇기 때문에 하나의 쓰레드가 중단되도 다른 쓰레드는 계속 수행이 가능
- 사용자 쓰레드보다 생성 및 관리 속도가 느림
- 문맥 교환으로 인한 오버헤드가 큼
사용자 수준 쓰레드와 커널 수준 쓰레드를 혼합한 구조, 둘의 단점을 극복한 방법
사용자 수준 쓰레드는 커널 수준 쓰레드와 비슷한 경량 프로세스
에 다대다로 매핑되고,
경량 프로세스
는 커널 수준 쓰레드
와 일대일
로 매핑된다.
결국 다수의 사용자 수준 쓰레드에 다수의 커널 쓰레드가 다대다(n:m)
로 매핑된다.
- 프로세스 내 쓰레드들이 병행으로 작업 가능
- 사용자는 원하는 수만큼 쓰레드 사용
- 효율적이면서도 유연함
- 쓰레드 풀링 기법을 통해 일대일 쓰레드 매핑에서의 오버헤드를 줄여줌
시스템이 관리하는 쓰레드의 풀을 응용 프로그램에 제공하여 쓰레드를 효율적으로 사용하는 방법
즉, 미리 생성한 쓰레드를 재사용
하여 쓰레드를 생성하는 시간을 줄이고, 시스템의 부담을 덜어준다.
또한 동시에 생성할 수 있는 쓰레드 수를 제한하여 시스템의 자원 소비를 줄여서 응용 프로그램의 전체 성능을 일정 수준으로 유지한다.
🔍 [참고 사이트]