1. What is thread?
- 가장 작은 execution 단위
- registers과 stack을 각각 분리하여 가지고 있음
- code, data, files를 thread끼리 공유
2. Thread의 장점
- 높은 병렬성에 좋은 퍼포먼스
- thread : light-weight process
- 프로세스를 만드는 것보다 쓰레드를 만드는 것이 적은 overhead
- process: fork() and exec() -> time consuming
- thread : pthread_create() -> library 함수여서 메모리 추가 X
- resource 사용에 있어서 효율적임
- 만약 같은 task를 parallel로 실행할 때, 프로세스를 만드는 것은 비효율적
- pipe와 같은 IPC가 필요없음으로 데이터를 공유하는 것이 쉽다.
- 장점
1) 응답성(Responsiveness )
멀티 쓰레드 프로그램에서는, 하나의 쓰레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 쓰레드들은 실행되고 있기 때문에 사용자 입장에서는 그 프로그램이 interactive하다고 볼 수 있다.
2) 자원 공유(Resource sharing)
쓰레드들 간에는 프로세스의 메모리 및 다른 자원들을 공유한다.
3) 경제성(Economy)
fork() 시스템 콜을 사용하는 등 여러 개의 프로세스를 생성하여 사용하는 것 보다, 여러 개의 쓰레드를 생성하여 사용하는 것이 비용이 적게 소모된다.
4) 확장성(Scalability)
여러 개의 쓰레드가 각각 다른 프로세서에서 동시에 실행이 가능하다. (parallelism)
3. Multicore Programming
- Multicore processor
- 다중의 CPU가 같은 칩 안에 있음.
- 성능 개선에는 한계가 있음
- thread
- 각각의 코어가 하나의 스레드를 사용하면서 병렬성 증가
- 싱글코어 : 다중의 쓰레드가 서로 공유함
4. concurrency vs. parallelism
-
parallelsim (병렬성, 말 그대로 동시에)
-
concurrency (동시성) : 조금씩 진행하면서 program이 번갈아 진행되는 것.
-
Hyperthreading
: instruction 사이의 비는 시간도 CPU가 활용할 수 있게 하여 가상의 CPU가 하나 더 있는 것처럼 보이게 함.
5. Multicore의 과제
- identifying task
: 어떤 프로그램이 독립적이고, 병렬로 돌릴 수 있는가 ?
- Balance
: 균등한 기여도를 가지고 일처리를 하는가?
- Data splitting
: 데이터의 imbalance (예를 들어 매트릭스에서 NxN에 0이 많고 적은 것들 )
- Data dependency
: task가 접근하는 데이터가 여러 task 사이에 종속성이 없는가?
- Testing and debugging
: 멀티쓰레드로 돌리면 다양한 실행경로가 있기 때문에 테스트하고 디버깅하기 어렵다.
: 두 개 이상의 쓰레드가 하나의 리소스에 접근하려고 하는 race condition 문제가 있다.
6. 병렬의 종류
- Data 병렬
: 데이터를 나눔
- Task 병렬
: 일을 나눔
: 예 ) core1은 평균만 구하고, core2는 덧셈만 하기.
7. Multithreading Models
-
User level thread
: 커널은 쓰레드의 존재를 알지 못한다.
: Thread library가 쓰레드에 관한 매니징을 모두 담당.
: 커널이 관여하지 않기 때문에, 스위칭이 적게 일어나 가볍게 쓰레딩 가능
: 하나의 쓰레드만 작동을 멈춰도 그 프로세스 자체가 block,멀티 프로세서를 활용하지 못함
: run-time system = 작은 커널의 역할
: 하나의 커널 쓰레드(프로세스)가 여러 개의 유저 레벨 쓰레드를 관리 => many to one 모델
-
Kernel level thread
: 커널이 모든 프로세스와 모든 쓰레드를 관리하는 방식
: 커널에 의해 독자적으로 스케줄링됨.
: 여러 개의 커널 쓰레드가 각각 한 개의 쓰레드를 관리, 여러 개의 커널 쓰레드가 여러개의 쓰레드 관리
: one to one , many to many 모델
8. User thread VS. Kernel Thread
9. Multithreading Models
10. Thread Library
프로그래머에게 Thread를 생성하고 관리하기 위한 API를 제공하는 것
thread Library를 구현하는 법
- In user space
- kernel 도움 X
- 모든 코드와 데이터 구조는 user space에 있다.
- API 호출 시 system call이 생성되지 않음
- Using kernel-level library
- 모든 코드와 데이터 구조는 kernel space에 있다.
- 라이브러리 API를 호출하는 것은 system call을 하는 것과 같아진다.
11. Existing Thread libraries
- posix pthread : 사용자 또는 커널 수준 라이브러리
- windows thread API : 커널 수준 라이브러리
- Java thread API : Java 프로그램에서 직접 스레드 생성과 관리 가능
12. Thread pool
-
Thread pool X : 새 요청이 들어옴 -> 새 thread를 만들고, 요청을 handling -> 끝나면 thread destroy
문제점 : 쓰레드 만들고 제거하는 데의 overhead, 쓰레드 생성이 무한하다.
-
Thread pool O : 처음에 스레드를 미리 만들어놓음 -> 새 요청 들어옴 -> thread pool에서 가능한 thread를 고름 -> 끝나면 다시 Thread pool로 돌려놓음.
13. Threading Issues
- fork()
- 모든 스레드를 복사하는 것
- fork() system call을 한 스레드만 복사하는 것
- exec() : fork() 이후 바로 exec()가 호출되면 모든 프로그램이 대체될 것이므로, 모든 스레드를 복제해서 만들어 주는 것은 불필요
- signal handling
- default signal handler : 시그널마다 기본적 처리방법 정의
- user defined siganl handler : 사용자가 처리 방법 정의
- Signal의 두 가지 유형
- Synchronous signal: 어떤 사건을 처리하기 위해 발생 ex)불법적인 메모리 접근, 0으로 나누기
- Asynchronous signal: 임의 시점에 발생. ex) interrupt(ctrl-C키), timer 만료
- Multithread에서 signal 처리 방법
- signal을 발생시킨 thread가 처리
- 모든 쓰레드에게 broadcasting해주고, 그 중 적절한 쓰레드가 처리
- 미리 쓰레드를 정해놓고 전담하여 signal 처리
14. Thread Issues
- Thread Cancellation : 쓰레드를 종료시키고 싶을 때
- Asynchronous cancellation : 바로 죽임 , 죽는 쓰레드가 Resource를 가지고 있었다면 문제가 생길 수도 있음.
- deferred cancellation : cancellation point라는 곳에서만 죽임.
- Thread cancellation의 과제
- 공유된 데이터를 업데이트하는 중간에 종료
- 죽은 쓰레드가 resource를 가지고 있을 때
- Pthread는 default가 defeered cancellation이다. ( Pthread_testcancel() )