스레드
프로세스는 자원과 제어 두 특성으로 이루어져 있는데, 제어만을 분리한 실행단위를 스레드라고 한다.
스레드의 주소공간

하나의 프로세스는 여러 스레드로 이루어질 수 있는데 각 스레드는 스레드 실행 환경 정보, 지역 데이터 그리고 스택을 제외하고 코드, 전역 데이터, 힙은 서로 공유한다. 즉, PC와 스택 등이 각 스레드마다 독립적이기 때문에 같은 프로세스의 스레드들이 동시에 작업을 수행할 수 있다.
스레드의 장점
- 사용자 응답성 증가: 일부 스레드의 처리가 지연되도 다른 스레드가 처리할 수 있어서 사용자 응답성 증가된다.
- 프로세스의 자원과 메모리 공유: 프로세스의 자원 하나와 메모리를 공유하기 때문에 프로그램 하나가 동일한 주소 공간에서 스레드를 여러 개 실행해 시스템 성능을 향상시킬 수 있다.
=> 커널의 개입을 피해 독립적 실행을 할 수 있음
- 경제성 좋음: 프로세스를 생성하는 것보다 스레드를 여러 개 생성해 컨텍스트 스위칭하면 오버 헤드가 줄어든다.
- 다중 처리로 성능과 효율 향상: 각 스레드들은 여러 프로세서에서 병렬로 실행해 성능과 효율을 높일 수 있다.
스레드의 단점
- 사용자 수준 스레드는 커널 자체가 스레드 한 개로 구성되어 있는데 하나의 스레드에서 시스템 콜을 호출하면 해당 시스템 콜의 결과를 받을 때까지 모든 스레드가 작업을 멈추고 대기해야 한다. 이는 효율성이 떨어진다.
프로세스-스레드 관계
- 단일 프로세스 - 단일 스레드
- 단일 프로세스 - 다중 스레드
- 다중 프로세스 - 단일 스레드
- 다중 프로세스 - 다중 스레드

스레드 제어 블록(TCB)
프로세스가 PCB에 상태 정보를 저장하듯이 스레드도 스레드 제어 블록(TCB, Thread Control Block)에 상태 정보를 저장한다.

프로세스 하나는 여러 개의 스레드를 가질 수 있기 때문에 결국 PCB는 TCB의 리스트를 가르킨다.
스레드 구현
스레드는 운영체제에 따라 다양하게 구현할 수 있는데 대부분 아래 세 가지 형태로 구현한다.
- 사용자 수준 스레드: 스레드 라이브러리로 구현한 스레드로 모든 작업을 유저 영역에서 처리해 TCB가 유저 영역에 존재한다. 이 스레드는 커널이 해당 스레드의 존재를 인지하지 못해 커널은 사용자 수준의 스레드가 N개 존재해도 1개로 인식한다. 커널에 독립적으로 실행되기 때문에 모든 OS에 적용할 수 있는 장점과 커널 모드로 전환할 필요가 없다는 장점이 있지만, 1개의 스레드가 시스템 콜이 호출하면 동일 프로세스의 나머지 스레드가
Blocking 되는 단점이 있다. 커널 수준 스레드와 1:N 매핑이 일어난다.
- 커널 수준 스레드: 커널이 관련된 모든 작업을 관리하는 스레드로 커널 영역에서 처리해 TCB가 커널 영역에 존재한다. 커널의 지원을 많이 받을 수 있지만 유저 영역에서 커널 영역으로 전환이 필요해 오버헤드가 발생한다. 사용자 수준 스레드가 생성되면 커널 수준 스레드가 자연스레 같이 생성돼 사용자 수준의 스레드와 1:1 매핑이 일어난다.
- 혼합형 스레드: 사용자 수준 스레드와 커널 수준 스레드를 혼합한 구조로 사용자 수준 스레드와 경량 프로세스와 N:M 매핑이 일어난다. 유저 영역에서 사용자 수준 스레드를 생성하면 자연스레 커널 수준 스레드가 생성되어 매핑이 일어나는데 이때 커널 수준 스레드는 경량 프로세스와 1:1 매핑이 되어있다.
리눅스에서 스레드 생성
pthread_create() 명령어를 통해 리눅스에서 스레드를 생성할 수 있는데 이 명령어는 내부적으로 clone() 시스템 콜을 사용한다.
학습하며 정리한 글이기 때문에 혼용된 표현 또는 잘못된 내용이 있을 수 있습니다.
만약, 발견하신 경우 댓글을 통해 알려주신다면 진심으로 감사드립니다.