포스트

운영체제 11. Thread

운영체제 11. Thread

쓰레드(Thread)가 무엇인가?

제목 없음 1.png

fork()를 통해 프로세스를 만들면 text 영역을 제외한 모든 Context가 복제되어 따로따로 사용된다. 굳이 Data 영역이나 Open한 File 등이 복제될 필요가 없다면? 서로 다른 실행 흐름 끼리의 데이터 공유를 편하게 할 수 있을 것이다. 이것이 쓰레드의 개념이다. 쓰레드끼리는 text, data 영역이 공유되고 stack만 따로 갖는다. 따라서 프로세스에서 선언된 전역 변수(Data)는 모든 쓰레드에게 공유된다. 다만 Race Condition 관리 책임은 프로그래머에게 부여된다.

쓰레드가 생성되는 순간, 스케쥴링과 상태 천이 등은 쓰레드 단위로 일어난다. 즉 PCB가 아닌 TCB가 사용된다. main Thread가 아닌 생성된 쓰레드를 Consumer thread라고 함.

Pasted image 20250423170759.png

TCB에는 PC, Stack, 레지스터 등이 따로 관리되어야 한다. 새로운 실행 흐름이기 떄문에 PC 또한 TCB에서 따로 가지고 있다.

Pasted image 20250409154404.png

사용자 쓰레드와 커널 쓰레드가 무엇인가?

Pasted image 20250423170936.png

초기에 쓰레드의 아이디어를 생각하고, 그 구조를 라이브러리로 만든것이 쓰레드의 시초와 같다. 라이브러리는 커널에 손댈 수 없으므로, 모든 쓰레드가 하나의 프로세스의 Time Slice, 상태를 공유한다. 즉 하나의 쓰레드가 Block되면 다른 모든 쓰레드가 Block되는 단점이 존재했다.

Pasted image 20250423171034.png

쓰레드를 좋다고 사람들이 하도 써대니까 운영체제 수준에서 쓰레드를 지원하기 시작한다. 이제 각 쓰레드는 각각의 독립적인 Time Slice, State를 가질 수 있게 된다. 하나의 쓰레드가 Block되어도 같은 프로세스 내의 다른 쓰레드가 Block되지 않는다. 다만 생성과 관리를 커널에서 그만큼 더 부담해야 하므로, 약간의 오버헤드가 부과된다.

대부분 두가지를 모두 지원한다.

다중 쓰레드 모델이 무엇인가?

다대일 모델은 여러개의 사용자 수준 쓰레드가 하나의 커널 수준 쓰레드에 매핑된다. 이는 위에서 설명하듯이 하나의 쓰레드가 블락되면 같은 프로세스 내 모든 쓰레드가 블락되는 단점이 있다.

일대일 모델은 하나의 사용자 수준 쓰레드가 하나의 커널 수준 쓰레드에 매핑된다. 현재 리눅스에서 사용되는 방식이다.

다대다 모델은 여러개의 사용자 수준 쓰레드가 여러개의 커널 수준 쓰레드이 매핑된다. 딱히 왜 쓰는지는 모르겠다.