* Threads
- process를 만드는 것과 같이 여러개의 실행을 동시실행 하기 위한 방법
(근본적으로 process를 만드는 것과는 다르다.)
- 즉, 어떤 에플리케이션에서 여러개의 나눠진 Thread를 이용해 Multiple task를 구현하고 있다.
- 프로세스를 생성하는 것과 다르게 가볍다.(코드가 단순해지고 효율이 증가한다)
> 메모리 사용이 적고, Thread간 데이터를 주고 받는 것도 쉽다.
- 일반적으로 kernel은 multi-threaded방식을 사용한다.
※ 그림 중요!!
* Thread 사용으로 얻는 이득
- 반응성이 빨라진다. (데이터에 access하거나 정보 교환이 편하다)
- 쉽게 자원을 공유 할 수 있다. (같은 주소 공간을 사용한다)
- 경제적이다.(빠르다. 손쉽게 할 수 있다. 적은 비용으로 생성 가능하다.)
- scalability : 확정성이 쉽다.
* Multicore Programming
- Activity를 균형있게 나누고, 데이터를 나누고, 데이터간의 의존성을 고려하여 만들어야한다.
- 테스팅과 디버깅이 힘들다.
(프로그램 실행할때마다 CPU스케줄링에 따라서 값이 달라 질 수 있다.)
- 이러한 문제를 포함하고 있어 multicore programming을 구현하기 힘들다.
* Multithreading models
- Many-to-one
> 많은 사용자 단계의 스레드를 하나의 커널에 연결한다.
- One-to-one
> 각각의 사용자 단계의 스레드가 하나의 커널과 맵핑된다.
> 현재 보편화 되있으며 가장 많이 사용을 한다.
- many-to-many
> 많은 사용자 단계의 스레드가 여러개의 커널과 맵핑된다.
> two-level model : mtm으로 연결을 하지만, 중요한 thread는 별도의 kernel을 주어 관리
* Thread library
- library로써 user space에서 구현하는 법과 kernel-level library를 사용해서 구현하는 방법으로 나뉜다.
- POSIX Pthreads, Win32 threads, Java Threads로 나뉜다.(소스볼것)
> Pthreads : User or kernel level
> Win32 : kernel level
> Java : depends on the host system
* Threading Issue
- thread에서 프로세스 생성을 할시 어떻게 할 것인가?
> 답은 정해지지 않는다. 만약 fork후에 exec로 thread를 변경하면 이는 완전히 다른 프로세스가 되기 때문에
threads가 복제될 일이 없다. 하지만 thread가 단순히 fork되면 모두 복제될 필요가 존재하다.
- Thread cancellation
> Asynchronous cancellation : 해당 Thread를 순간적으로 죽인다.
리소스 반납이 이뤄나지 않으며, 공유된 정보에 무언가를 writing할때
멈출 수도 있다.(Critical)
> Deferred cancellation : 해당 Thread에게 사라질 것을 알려준다. Thread는 알아서 리소스를 반납하고
하던 일을 완료후 사라진다.
- Signal handling
- Thread Pools
> Thread를 미리 여러개 생성해 둔 뒤에 thread 사용자가 올때 분배를 해주는 방식
> 요청에 따라서 thread를 만드는 것보다 속도가 빠르다.
> 미리 생성한 thread양을 초과해서는 받기가 힘들다.
> pool의 크기는 경험적인 선택이나 상황에 맞춰서 준비를 해둔다.