行程(Process)、執行緒(thread)傻傻分不清楚(中)-執行緒管理
前言
今天會討論執行緒Thread,是一個我覺得很容易跟行程Process混淆的概念,為了學習跟整理這個概念,我們可以踩在前人的肩膀上前進XD
透過一張別人整理出來的Process、Thread比較圖,我們來問問一些「為什麼?」。
而透過回答經過整理的問題,可以看到兩者的差別及是什麼造成這些差別。
而最後我相信通過探究這些差異的過程,不只可以幫助理解Thread,也同時可以回頭幫助了解Process~
執行緒Thread
Item | Process | Thread |
---|---|---|
定義 | 在執行中的程式 | 行程的一部分 |
輕量 | 不輕量 | 輕量 |
終止時間 | 較長 | 較短 |
建立時間 | 較長 | 較短 |
溝通 | 行程間的溝通較費力且相對Thread來說更久 | 溝通容易且相對較短 |
上下文交換 | 較長 | 較短 |
資源 (CPU時間) | 消耗較多資源 | 較少 |
記憶體 | 幾乎隔離 | 有共享的記憶體位置 |
資料共用 | 不共用資料 | 共享資料 |
from Process vs Thread – Difference Between Them |
為什麼說Thread是Process的一部分?
我們可以用三種角度來看這個定義,看能不能釐清他們!
角度1: 工廠藍圖想像
我們先用比較淺顯的想像開頭:
想像我們按照「藍圖」建立「工廠」,「工廠」裡面會聘請「工人」來完成工作。
上面提到的藍圖、工廠、工人分別就是Program、Process、Thread。
所以實際上完成功作的是作為工人的Thread。
但這邊我在看的時候產生一個困惑,我們在操作系統簡介不是曾說:
Process會根據CPU scheduling機制搶占CPU資源
這樣到底是Process還是Thread完成工作呢?
其實這句話依舊是正確的,只是說的還不夠多,要了解這點,我們需要先知到Thread到底是什麼又存在哪裡。
透過一張圖的幫忙會更容易理解了。
角度2: 單執行緒行程 vs 多執行緒行程
from 程序、行程(process)
這是一張單執行緒Process與多執行緒Process的比較圖。
我們回到表格中的定義:
執行緒是行程的一部分
這樣是不是就很明顯地看到這個定義了呢?
執行緒確實是行程的一部分,於是昨天提到的行程結構,其實就是一個單執行緒行程。
確切來說,執行緒的結構包含獨立的: stack、register、counter
並且與其他Thread共用code, date(共用變數區), files。
正因為每個Thread有自己的Register、Counter、Stack,所以他們可以自己決定執行哪段程式,也就是說:
每段執行緒可以執行各自片段的程式碼以完成Process需要完成的工作
角度3: 概念總結
最後來整理一下,並帶到最後一個對Thread及Process之間差異的描述:
Process是OS分配資源之對象單位,而Thread才是OS分配CPU時間之對象單位
– 作業系統筆記(二):利用處理程序、執行緒來多工處理
為什麼Thread相對輕量?建立及終止時間相對短?資源消耗較少?
Process建立流程包括:
- 向系統註冊,讓系統紀錄執行清單,並標上PID。
- 分配適當的資源,包含CPU使用權及獨立的資料儲存空間。
這個過程會申請空白PCB並初始化資料並填入PCB。
而因為Thread共用了大部分Process的狀態(這邊幫助你回憶一下,Thread是Process的一部分XD),所以可以減少建立及管理的開銷。
另外一部分牽涉到Context Switch的成本,因為行程在進行Context Switch時,需要保存整個Process的狀態資訊,包括Counter、CPU registers、PCB,在處理這個過程花費的CPU相對Thread較多,因為Thread僅需要保存他自己的CPU register而已。
用工廠的說法來描述這些成本的差異好了。
建一個工廠需要選地址、找監督特別記錄所有工廠的資料、建立所有流程;而多請一個員工,因為原本的工廠裡面的流程都還在,所以大部分要做的事情都可以被省略。
為什麼Thread溝通容易?為什麼Thread可以共享資料?又為什麼Process不行?
一個相同行程裡面多個Thread在被建立時,都可以共用同一個Process裡面的區塊的資料,這個區塊就是Heap,可以把這個區塊理解成像是全域變數的存在。
而不同Process在被建立時,他們彼此之間就會被分配不同的記憶體位置,因為沒有共用記憶體,所以Process之間如果需要溝通就要靠其他方法,一般統稱這些方法為Inter-process communication(IPC),而這個過程相對不易,但也確保了行程內的資料不易被汙染。
盡可能保持Process之間的獨立性是有它的意義的,就好像我們現在可以毫無猶豫的ctrl + alt + delete直接強制關閉行程卻不用擔心造成其他行程的影響,因為他們之間互不依賴。
小結
透過了解Thread,我們進一步釐清了Thread這個概念被建立想要去處理的問題是快速的多工,並提高了資源(CPU、Memory…)的使用率。
於是接下來會進到下集,我們要談的Concurrency,可以說Thread幾乎是為此而生XD至於為什麼這麼說,下一篇也會試圖解釋這件事情!
那就明天見囉~
本文章同步分享於部落格,歡迎來逛逛~
後話
其實原本是要將內容分成上下兩個部分,但Process、Thread、Concurrency這三個主題實在太息息相關,可以講的東西又太多了。
不知不覺,篇幅就大到一天要讀完太過難受,為了閱讀體驗以及我的鐵人賽挑戰,所以最終才分成三篇。
另外,若有人看不懂本篇的內容的話,可以回頭從OS overview開始看起喔。
參考資料
行程及執行緒
Why Thread Considered Cheap
What is the difference between concurrent programming and parallel programming?
程序(進程)、執行緒(線程)、協程,傻傻分得清楚!
作業系統筆記(二):利用處理程序、執行緒來多工處理
Linux 核心設計: 不僅是個執行單元的 Process
PPT in Operating system
Threads and its types in Operating System
OS Process & Thread (user/kernel) 筆記