# 스레드
# 스레드와 멀티스레딩
스레드
- 프로세스의 실행 가능한 가장 작은 단위입니다.
- 프로세스와 달리 코드, 데이터, 힙을 스레드끼리 서로 공유합니다.
- 프로세스는 여러 스레드를 가질 수 있습니다.
멀티스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법입니다.
- 장점
- Responsiveness : 프로그램의 어느 부분을 담당하는 스레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 스레드들은 실행되고 있기 때문에 유저의 입장에서는 그 프로그램이 Interactive하다고 볼 수 있습니다.
- Resource Sharing : 스레드들 간에는 서로 자원들을 공유하기 때문에 효율성이 높습니다.
- Economy : 스레드들은 하나의 프로세스 메모리 영역에서 실행하기 때문에 새로운 프로세스를 생성하는 것보다 스레드를 생성하는 것이 비용이 적게 들어갑니다.
- Scalability : 여러개의 스레드가 각각 다른 프로세스에서 동시에 실행이 가능합니다.
- 동시성에 큰 장점이 있습니다.
- 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있습니다.
- ex) 웹 브라우저의 렌더러 프로세스(메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드가 존재)
동시성이란?
서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
# 스레드의 분류
스레드를 지원하는 주체에 따라 유저 스레드와 커널 스레드로 나눌 수 있습니다.
# 유저 스레드
- 커널 영역에서 지원되며, 일반적으로 유저 레벨의 library를 통해 구현됩니다.
- library에서 스레드를 생성, scheduling과 관련된 관리를 해줍니다.
- 장점
- 동일한 메모리 영역에서 스레드가 생성, 관리 되므로 이에 대한 속도가 빠릅니다.
- 단점
- 여러 개의 유저 스레드 중 하나의 스레드가 시스템 콜 요청으로 block이 된다면, 나머지 모든 스레드 역시 block됩니다.
- 커널은 여러 유저 스레드들을 하나의 프로세스로 간주하기 때문입니다.
- 여러 개의 유저 스레드 중 하나의 스레드가 시스템 콜 요청으로 block이 된다면, 나머지 모든 스레드 역시 block됩니다.
# 커널 스레드
- 운영체제에서 스레드를 지원합니다.
- 커널 영역에서 스레드의 생성, scheduling 등을 관리해줍니다.
- 장점
- 스레드가 시스템 콜을 호출하여 block이 되면, 커널은 다른 스레드를 실행함으로써 전체적인 Thread Blocking이 없습니다.
- 멀티 프로세스 환경에서 커널이 여러 개의 스레드를 다른 프로세스에 할당할 수 있습니다.
- 단점
- 유저 스레드보다 생성 및 관리가 느립니다.
# 유저 스레드와 커널 스레드의 매핑(Mapping)
- Many-to-One
- 스레드 관리는 유저 레벨에서 이루어집니다.
- 여러 개의 유저 스레드들이 하나의 커널 스레드로 매핑됩니다.
- 커널 스레드를 지원하지 못하는 시스템에서 사용됩니다.
- 한계점
- 한번에 하나의 스레드만 커널에 접근 가능합니다.
- 하나의 스레드가 커널에 접근(시스템 콜)하면, 나머지 스레드들은 대기해야 합니다
- 진정한 동시성은 지원하지 못합니다.
- 동시에 여러 개의 스레드가 시스템 콜을 사용할 수 없습니다.
- 커널의 입장에서 여러 개의 스레드는 하나의 프로세스이기 때문에 멀티프로세스더라도 여러 개의 프로세스에서 동시에 수행이 불가능합니다. (진정한 병렬이 아님)
- 한번에 하나의 스레드만 커널에 접근 가능합니다.
- One-to-One
- 각각의 유저 스레드를 커널 스레드로 매핑합니다.
- 유저 스레드가 생성되면 그에 따른 커널 스레드가 생성됩니다.
- Many-to-One 방법에서 문제가 되었던 시스템 콜 호출 시 다른 스레드들이 block되는 문제를 해결합니다.
- 여러 개의 스레드를 멀티프로세스에서 동시에 수행 할 수 있습니다.
- 한계점
- 커널 스레드도 한정된 자원이기 때문에 무한정으로 생성할 수 없습니다.
- 스레드를 생성, 사용하려고 할 때, 그 개수에 대한 고려가 필요합니다.
- Many-to-Many
- 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑합니다.
- Many-to-One과 One-to-One 모델의 문제점을 해결합니다.
- 커널 스레드는 생성된 유저 스레드와 같거나, 적은 수 만큼만 생성이 되어 적절히 Scheduling 됩니다.
- Many-to-Many처럼 스레드가 시스템콜을 사용할 경우, 다른 스레드들이 block되는 현상에 대해 걱정할 필요가 없습니다.
- One-to-One 처럼 사용할 스레드의 수에 대해 고민할 필요가 없습니다.
- 커널은 적절히 유저 스레드와 커널 스레드 사이의 매핑을 조절하여 위와 같은 장점을 보장할 수 있습니다.
# 참고자료
- 주홍철.면접을 위한 CS 전공지식 노트.서울:길벗,2022.
- 숭실대학교 김영근 교수님의 운영체제 강의자료(2021)
← 멀티프로세싱 공유자원과 임계영역 →