# Thread
###### tags: `IT鐵人`
雖然前面說CPU在執行程式時,都用process來敘述,不過其實在process中有一條一條的thread,那才是CPU在分配的最小單位。
## 介紹
所謂的thread,又稱為light-weight process,是分配CPU的最小單位。當thread被建立後,每條thread有自己私有的內容,包含:
1.Thread ID
2.Thread state
3.Programming Counter
4.CPU registers
5.Stack
6.Local variables
Kernel也會幫助thread建立TCB,就像是PCB一樣。
與process有很大的不同,同一個process內不同的thread彼此共享此一process的:
1."Static" local variables
2.Code Section
3.Data Section(global section)
4.other OS Resources
5.heap memory
以下用圖片敘述process跟thread的差異,傳統process沒有多個thread,稱為single-thread。

## 好處
由於thread執行在process之下,具有以下好處:
* Responsiveness
當process下的thread被block,此時CPU可以挑別的可執行的thread繼續執行,不會導致整個process被blocked。
* Resource Sharing
thread共享同一個process的部分Resource,可以方便執行。
* Economy
thread共享code, data section以及other OS Resource,thread的context switch比process的快。
* Scalability
同一個process內不同thread可以平行在不同的CPU/core上執行。
## 與process差異
因為process之間無共享,thread之間會有部分共享,所以兩者之間有以下差異。
|Process(single thread)|Thread|
|-|-|
|Heavy weight process|Light weight process|
|分配Resource的對象單位|分配CPU Time的對象單位|
|single-threaded model|Multi-threading model|
|不同process無共享的content|同一process的thread共享部分Resource|
|process若blocked則整個process就被blocked|只要process內有thread可執行則不會被blocked|
|creation, context switch, management代價高|代價低|
|對於Multiprocessors效益發揮差|效益發揮佳|
## 種類
thread跟process一樣分成user-level以及kernel-level。

user-level thread由thread library提供相關API,也就是C或是C++最前面需要include的那些library,此作法kernel並不知道有其他新創出來的thread,所以如果執行的thread被blocked,則整個process就被blocked,雖然creation跟management很快,但是就喪失了Scalability。
kernel-level thread代表thread由kernel來負責,此時kernel知道每一條thread,可以適當的分配CPU Time,優缺點與user-level thread相反。
## Multi-threading Model
前面提到了有分成user-level以及kernel-level,底下就會介紹他們執行時的對應關係。

* Many to One Model
同一process的所有user-level thread對應到一個kernel-level thread,因為只有一個kernel-level thread要向上找user-level thread執行,所以會比較迅速,不過一樣會發生前面提到的缺點,也就是thread blocked cause process blocked。

* One to One Model
這種模式代表只要有一個user-level thread被建立,就會建立一個kernel-level thread,一對一的對應關係可以達成thread的優點,不過在kernel-level thread太多的時候,就會導致效果變差,CPU會被kernel-level thread稀釋掉。

* Many to Many Model
這種模式會先固定好kernel-level thread的數量,可能會根據CPU核心數決定,並且往上找需要執行的user-level thread執行,這種作法不但能達到thread的優點,也不會有太多kernel-level thread的問題,只是設計比較複雜而已。
## What's Next?
介紹了thread的概念,可以想像process是一間工廠,thread是工廠中的工人,他們會共用機械等資源,也會保留自身的東西,不過在這種情況下會發生人們爭奪同一個機械的問題發生,那就是我們下一篇要講的,Race Condition。
| 上一篇 | 下一篇 |
|-|-|
|[CPU Scheduling Algorithm](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/H1ZwYW_mF)|[Deadlock](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/Hy6Ot7s7Y)
