Thread
Overview
thread는 cpu 연산의 가장 작은 단위
- 스레드는 thread ID, program counter, reigster set, stack으로 구성된다.
- 같은 프로세스 안에 있는 스레드들은 code, data, os resource를 같이 공유한다.
- multi-thread면 동시에 하나 이상의 task 실행 가능하다.
process가 아닌 thread 단위로 처리해서 자원과 시간 사용을 효율적으로 가능하다.

benefits
- Responsiveness : 프로세스 일부 스레드가 block되거나 긴 연산이 수행될 때도, 나머지 스레드들을 통해 계속 실행할 수 있으므로, user에 대한 반응성을 높여준다. 사용자 인터페이스에 많이 사용
- Resource sharing : 프로세스간에는 shared memory, message passing을 통해서 resource 공유가 가능하다. 이건 프로그래머가 구현해 주어야 할 필요가 있다. 반면에 같은 프로세스의 스레드들은 메모리와 자원을 default로 공유한다.
- Economy : 프로세스 생성에 있어 메모리와 자원의 할당은 cost가 크다. 반면에
스레드는 같은 프로세스 안에서 자원을 공유하므로, context-switch 스레드를 만드는 것이 더욱 경제적이다. Context switch역시 스레드 간이 프로세스 간보다 빠르다.
- Scalability : 멀티프로세서 구조에서, 스레드들은 여러 프로세싱 코어에 병렬적으로 돌아갈 수 있다는 장점이 있다. 반면, 단일 스레드 프로세스는 한번에 하나밖에 못돌림.
Multicore Programming
티스레드 프로그래밍은 효율적인 멀티 코어들의 사용과 동시성을 개선한다.
단일 코어에선 Concurrency(동시성) 몇 개의 스레드들을 교차시켜 실행할 수 있다는 것이다.
한번에 하나의 스레드만 실행, 스레드의 실행이 interleave됨

멀티 코어에선 Concurrency(동시성) 몇 개의 스레드들을 병렬적으로 실행할 수 있다는 것이다.

이때 concurrency와 paralletl은 다르다.
단일 코어에서는 process들이 concurrently하게 동작하였으나 parallel하지는 못함.
Programming Challenges
-
Identifying task
어플리케이션이 seperate, concurrent한 task들로 나뉠 수 있게 확인해야 한다.
-
Balance
식별된 tasks들이 병렬적처리를 통해 같은 값에 같은 일을 수행해야 한다. 전체 프로세스에 기여가 적은 것들은 병렬적으로 돌리면 cost가 안맞을수 있다는 것
-
Data spliting
데이터들로 tasks처럼 쪼개져서 다른 코어들로 가야함
-
Data dependency
자료들간의 의존성을 확인하여, 동기화 문제와 같이 생길 이슈들을 확인
-
Testing and debugging
다중 코어서 작동하면, 많은 경우의 수가 발생한다. 단일 스레드보다 검증하기 어려워짐
Types of Paraealellism

- Data parallelism : 같은 데이터의 부분 집합들을 멀티 코어들에 분배하는 것에 초점을 두어서, 각 코어마다 같은 연산을 수행한다.
- Task parallelism : 데이터뿐만 아니라 스레드들도 멀티 코어에 분배하는 것을 포함한다. 각 스레드는 고유 연산이 있고, 각기 다른 스레드들은 같은 데이터를 연산할 수도 있고, 다른 데이터를 연산할 수도 있다.
Multithreading models
스레드는 user threads(사용자 스레드)나 kernel threads(커널 스레드)로 제공된다.
OS 입장에서 user thread는 thread가 아니다.
- User thread : 커널의 도움 없이(syscall필요 x) 커널의 윗부분(User
library)을 지원한다. 비교적 빠르고 효율적이나, 스레드 1개에 block이 생기면 모든 스레드가 block된다. OS는
커널 스레드 기준으로 할당을 받기 때문에, 병렬적으로 안돌아 갈수도 있다.
- kernel thread : OS에 직접적으로 지원 관리된다. syscall에 생성/관리가 이뤄진다. 각각의 스레드는 TCB를 필요로 한다. 여러 스레드를 멀티 코어에 돌릴 수 있다.

1. Many-to-One Model

- 사용자 스레드들이 하나의 커널 스레드와 연결되어 있는 구조
- 사용자 스레드 1개만 커널에 접근이 가능
- 다중 스레드들이 멀티코어 시스템에서 병렬적으로 작동하기 불가능
- 다중 프로세서를 사용하지 못하므로 요즘 사용 안함
2. One-to-One Model

- 사용자 스레드 별로 1개의 커널 스레드를 mapping한 구조
- 하나의 스레드가 block 되어도 다른 스레드로 실행가능하여 concurrency가 위 구조보다 높다.
- 다중 프로세서에게 다중 스레드를 병렬적으로 실행 가능
- 사용자 스레드를 만들기 위해서는 매핑되는 커널 스레드도 필요하므로 커널 스레드 수가 많아질 수록 시스템 성능이 떨어짐
- 리눅스, 윈도우가 이 모델 사용
3. Many-to-Many Model

- 많은 사용자들은 그 보다 적은 커널 스레드와 매핑하는 구조
- 해당 모델은, many-to -one의 병렬화 불가능 단점과 one-to-one의 스레드 갯수 관리 단점을 개선한 모델
- 개발자들은 필요한 만큼 사용자 스레드를 만들어도 되고 대응되는 커널 스레드들을 멀티 프로세서에서 병렬적으로 실행 가능
- 만약 스레드가 block되면 다른 스레드를 schedule하여 실행
Thread Libraries
스레드 라이브러리는 프로그래머들에게 스레드 생성/관리를 위한 API를 제공한다. 스레드 라이브러리를 구현하는 방법은 크게 2가지가 있다
- 모든 라이브러리를 user space안에 만들어서, 커널의 지원이 필요없게 하는 방법이 있다. 모든 코드와 데이터 구조들은 user space안에 존재해야 한다. 함수가 호출된다는 것은 user space안의 local함수를 부르는 것이지,
syscall이 아니다.
- 직접적으로 OS를 통해 커널의 지원을 받게하는 방법도 있다. 모든 코드와 데이터구조는 커널 공간에 있으며, 보통 함수를 호출한다는 것은 syscall을 호출하는 것이다.
요즘 사용되는 스레드라이브러리는 크게 POSIX pthreads, Windows, Java