# 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。 ![](https://i.imgur.com/VlRMX5e.png) ## 好處 由於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。 ![](https://i.imgur.com/gV9Foqk.png) 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,底下就會介紹他們執行時的對應關係。 ![](https://i.imgur.com/UxkHhBm.png) * Many to One Model 同一process的所有user-level thread對應到一個kernel-level thread,因為只有一個kernel-level thread要向上找user-level thread執行,所以會比較迅速,不過一樣會發生前面提到的缺點,也就是thread blocked cause process blocked。 ![](https://i.imgur.com/Ol5Ec2V.png) * One to One Model 這種模式代表只要有一個user-level thread被建立,就會建立一個kernel-level thread,一對一的對應關係可以達成thread的優點,不過在kernel-level thread太多的時候,就會導致效果變差,CPU會被kernel-level thread稀釋掉。 ![](https://i.imgur.com/JPjB14y.png) * 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) ![](https://i.imgur.com/Y19fgP7.png)