[운영체제] 4. Multithreaded Programming 멀티 스레드 프로그래밍
스레드(Tread)란?
스레드 개념
- CPU 이용의 기본 단위
- 경량(lightweight) 프로세스
프로세스 내부의 코드 실행 흐름
스레드는 한 프로세스 안에서 동시에 여러 작업들을 수행할 수 있게 해주는 프로세스 안의 작은 프로세스이다.
프로세스 생성보다 스레드 생성이 용이하다. (주소 공간을 공유하기 때문)
모듈 별로 한 기능만 실행 = 한 스레드에 할당 -> 효율성 향상
최근의 응용프로그램들은 멀티 스레드로 구성된다.

싱글 스레드 프로세스는 실행흐름이 1개, 멀티 쓰레드 프로세스는 여러개의 실행 흐름을 가진다.
각각의 쓰레드 들은 쓰레드 ID, 프로그램 카운터(Program Counter, PC), 레지스터 집합(Register Set), 스택(Stack)으로 구성
스레드는 같은 프로세스에 속한 다른 스레드와 코드(code), 데이터(data) 영역, 열린 파일이나 신호와 같은 운영체제의 자원들을 공유합니다.
따라서 스레드를 하나 더 생성 : 각 레지스터, 스택만 할당하면 생성 가능하다. (경량 프로세스)
멀티 스레드(Multi-Thread)의 장점
- 응답성 (Responsiveness) : 사용자 반응속도가 빠르다.
- 자원 공유 (Resource Sharing) : 스레드 간 자원 공유가 편하다. (주소 공간을 공유하기 때문)
- 경제성 (Economy) : 프로세스보다 스레드 생성, 문맥 교환이 경제적이다. (스레드 간 문맥 교환 시 오버헤드가 적음)
- 확장 가능성 (Scalability) : 시스템 확장성, 많은 사용자 및 과부하의 처리 효과적
멀티코어 프로그래밍 (Multicore Programming)
Single CPU는 멀티코어가 기본적이다.
Dividing activities : 여러 코어가 병행 처리 가능 작업으로 분리
Balance : 코어 간 균등한 작업량으로 분리
Data splitting : 의존성 없는 병행 처리가 가능한 데이터 분리
Data dependaency : 데이터 의존성 -> 데이터 처리 순서를 올바르게 해야 함.
Testing and debugging : 프로그램 테스트 및 오류 수정 어려움
멀티 스레드 기반 서버 구조 (Multithreaded Server Architecture)


사용자 요청 -> 각 클라이언트 별 스레드 생성 및 작업 할당 -> 작업 처리 후 쓰레드 소멸 -> 메모리 회수
Concurrency vs Parallelism

User Treads & Kernel Tread

User Tread : 커널과 무관하게 user-level threads library에서 생성 및 관리됨.
- 사용자 영역에서 스레드 연산을 수행. 각각의 사용자 스레드를 커널에서 구분하지 못함
- 사용자 레벨 스레드 라이브러리를 활용하여 스레드 생성, 스케줄링
- 동일한 메모리 영역에서 스레드 생성, 자원 절감, 속도 빠름
- 대응되는 커널 스레드가 시스템 콜을 담당 (시스템 콜 처리는 커널 스레드가 대신 처리한다.)
Kernel Thread : 커널에 의해 관리됨.
- 프로세스는 최소 1개의 커널 스레드를 가짐 -> OS 서비스에 대한 제공
- 커널 영역에서 스레드 연산을 수행
- 커널이 스레드 생성 및 스케줄링
- 스레드가 IO로 인해 중단되더라도 프로세스 내의 다른 스레드는 계속 실행 가능
- 멀티 코어, 멀티 CPU를 활용하여 병행 처리 가능
- 사용자 스레드에 비해 생성 및 관리 비용이 크다.
Multithreading Models
사용자 스레드, 커널 스레드의 비율로 결정되는 모델
- Many-to-One (사용자 Many: 커널 One)
- One-to-One
- Many-to-Many
Many-to-One
많은 유저 레벨 스레드가 하나의 커널 스레드에 매칭 되는 것.
많은 사용자 스레드가 운영체제 서비스 이용 시, 하나의 커널 스레드를 공유한다.
따라서, 한 스레드가 IO를 대기하면, 다른 스레드는 병행 IO 불가. -> 대기해야 됨.
멀티코어 시스템에서 여러 사용자 스레드의 병행처리 불가능. 오직 하나의 스레드만이 특정 시간에 커널 모드에 사용 가능
병행성 제한 -> 현재 잘 안 쓰임

One-to-One
사용자 스레드 생성 -> 대응 커널 스레드 생성 (병행성 향상)
스레드 생성에 대한 오버헤드가 많아 스레드 수에 제한을 두기도 한다

n개의 커널 스레드가 n개의 사용자 스레드를 담당하게 된다. 1:1 방식.
IO 병행처리 가능, 병렬성은 좋으나 비용 증가,
Many-to-Many
사용자 스레드 수 >= 커널 스레드 수

융통성, 효율성 증대
cf) java의 join 메서드
: 자식 스레드의 계산 결과를 사용하기 위해 자식 스레드가 종료 때까지 대기하는 메소드.
<주요 용어 정리>
1. A ___ is a flow of control within a process.
___는 프로세스 내의 제어 흐름입니다.
=> 스레드(Thread)
2. A multi-threaded process contains several different flows of control within the same ___ space.
다중 스레드 프로세스는 동일한 ___ 공간 내에 여러 가지 서로 다른 제어 흐름을 포함합니다.
=> 주소(address)
4. The operating system kernel support and manages ___ threads.
운영 체제 커널은 ___ 스레드를 지원하고 관리합니다.
=> 커널 레벨(kernel-level)
5. In java programming, join() method makes the parent thread wait for the ___ finish its execution.
자바 프로그래밍에서 join() 메서드는 부모 스레드가 ___의 실행이 끝날 때까지 기다리게 한다.
=> 자식 스레드(child-thread)