iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0
自我挑戰組

OS作業系統學習系列 第 6

第六天 Thread(執行緒)--上

第六天 Thread(執行緒)--上

Thread我們之前在講process時有提到,現在我們來詳細說明他。在說明之前,我們先來搞清楚program-process-thread之間的關係是什麼?!

我們可以將program比喻成建造藍圖,而process就是透過這個藍圖建的工廠,至於thread就是這間工廠的工人,確保這間工廠的功能,而且共享這間工廠所有的資源。

在很多的應用程式中使用的都是多重執行緒,因為一個程式內需要做很多事情,如果一樣一樣來這樣會花費很多時間,這時我們就需要多重執行緒,而且thread的產生是比process的產生節省很多系統資源。

多重執行緒的架構產生是由client端需要server端時,server就會產生一個thread,同時server也會繼續注意client是否還有請求,有就再生一個thread,多重執行緒就這樣生出來了!
多重執行緒有幾點好處:

  • 回應快,而且不會因為有某個thread堵住了,而全部都停擺
  • 資源的分享也比process簡單
  • 經濟實惠:因為他所需要的資源並不像process要的那麼多
  • 擴展性好:在多處理器架構下,可以平行處理

在多核心或是多處力氣架構下執行多重執行緒,給程式設計者有很多挑戰,像是:活動如何劃分、平衡問題、資料分割、資料的依賴還有測試跟調整。在說明多核心程式如何運作前,我們要先認識兩個單字,concurrency跟parallelism,這兩個單字英文念法很像,中文翻譯也很像,但兩個是不一樣的東西。

Concurrency叫並行,舉例來說一個CPU內有兩個process,而這兩個process交互執行,一個在動另一個就停止。
Parallelism叫平行,舉例來說有兩個CPU,且有兩個process,一個CPU就執行一個process,兩個同時進行。
以下的圖能更清楚知道他們的區別
https://ithelp.ithome.com.tw/upload/images/20181021/20112132HtFQylVJNN.png

說到這也就知道我們在多核心程式下就是運用parallelism來運作。

而parallelism有兩種型態:data parallelism跟task parallelism,data parallelism是將資料分到不同的核心上,而資料都做同樣的事; task parallelism是將不同的thread分到不同的核心,而每個thread都做不一樣的事情。
那我們怎麼知道平行處理後效率增加多少呢?這就要運用Amdahl’s定律!
以下是他的公式
https://ithelp.ithome.com.tw/upload/images/20181021/20112132gtPnpWxyb9.png
S代表有多少thread是循序的運用
N代表有多少核心在處理

如果在處理thread都能用parallelism的方式,那絕對是能快很多,但如果只是單單增加核心的數量,而處理上都用循序的方式,那多核心也沒有用。
我們將Thread分成兩種:user thread跟kernel thread。
user thread由user-level執行緒庫做管理,POSIX Pthreads、Windows thread和Java threads是這執行緒庫主要的用戶。
kernel thread是又kernel所支持,包含Windows、Solaris….等。

而多重執行緒有三種模型:many-to-one、one-to-one跟many-to-many。

many-to-one是多個user thread連到一個kernel thread,但是用這種方式如果有其中一個thread被鎖住,所有的都會動彈不得,而且一次只能有一個user thread能存取kernel thread,所以現在已經很少使用了!
https://ithelp.ithome.com.tw/upload/images/20181021/20112132eXD8WFTK8j.png

one-to-one是一個user thread連到一個kernel thread,thread是真的能平行運作。當user thread生成時,就會生成一個相對的kernel thread,但是每個process有多少的thread是有限制的,所以使用時要小心。
https://ithelp.ithome.com.tw/upload/images/20181021/201121320EsU4OgstZ.png

many-to-many是多個user thread連到一個kernel thread,兩個的數量並不用一樣,作業系統會在中央調控,讓kernel thread有最好的效能。
https://ithelp.ithome.com.tw/upload/images/20181021/20112132E7l14crcQR.png
有一個跟many-to-many很像的模型叫two-level,但是他可以允許user thread跟kernel thread綁在一起。
https://ithelp.ithome.com.tw/upload/images/20181021/20112132ny1Zo7Y9up.png


上一篇
第五天 程序(process)概念--下
下一篇
第七天 Thread(執行緒)--下
系列文
OS作業系統學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言