行程(Process)、執行緒(thread)傻傻分不清楚(上)-行程管理
前言
行程是CPU分配資源的最小單位,以後還會聊到,甚至就連docker的container在run的時候就是一個process,很有趣吧,就來稍微認識一下~
定義
一個較好記憶的說法會將行程解釋成運行中的應用程式(Application),但有個比較貼切的說法是: 行程是一個正在運行中的應用程式實例。
實例隱含的意思是,由一個應用程式而建立的行程可以有多個,且雖然他們皆由同一個應用程式而來,他們可以具備不同狀態。
行程架構
此圖大致代表Process在記憶體裡的結構,
- Stack: 暫時性資料,例如Function Parameters、Local variables
- Heap: 執行程式碼所需要的動態工作區
- Data: 儲存全域變數等
- Text: 程式碼所在
行程生命週期
引用自 https://medium.com/@akhandmishra/operating-system-process-and-process-management-108d83e8ce60
共有五種狀態
狀態 | 說明 |
---|---|
new創建 | 初始狀態,分配及建立PCB以及其他資源,在完成上述工作後進入ready |
ready就緒 | 在隊列按照CPU Scheduling的演算法等待搶奪CPU以完成工作 |
running工作 | 一旦搶奪到CPU,此狀態會被設置為工作中,並執行應用程式中的指令。在與ready狀態切換時,會作Context Switch |
waiting等待 | 如果因為事件或是IO速度的差異導致等待,就會停在此 |
terminated終止 | 完成執行、被迫結束(比如在硬性即時系統)或者遇到錯誤時就會進入此狀態 |
Process Control Block, PCB
記錄行程相關狀態資訊的資料區,每個行程都有自己的一個,並在Process創建時被建立。
其內容包含:
項目 | 內容 |
---|---|
行程狀態process state | 流程生命週期的狀態 |
程式計數器process counter | 紀錄下一個要執行的指令的位址 |
CPU暫存器保存區 | 不在running state時,CPU暫存器內容會被保存在此 |
排班資訊 | 例如行程優先等級(priority)等排班時所需要的參數 |
記憶體資訊 | 其內容根據記憶體系統的種類而定 |
帳號資訊Accounting Information | process所屬的使用者帳號(user id)、行程代號(process identification)、時間限制、已經使用掉的處理機時間、進入系統之實際時間 |
IO狀態資訊 | 如所配置之輸出入裝置串列、開啟(Opened)之檔案串列等資訊 |
大部分資訊由參考資料2來的,並統整了其他資料的內容,所以更詳細可以看參考資料2。
Process Create
在OS內,Process可以建立child process,因此所有的排程可以組成一個樹狀結構。
如果你手邊有linux系統的話,可以使用 pstree -aup
看到在你的電腦裡的process的樹狀圖。
如上圖,甚至可以知道我是在zsh之下執行的這個指令XD
大部分的OS會支援兩種Process Create的方式
- Fork: 複製父行程的PCB到子PCB
- Exec: 替換子行程的資料,初始化新的PCB資料
所以建立新的Process就是兩者混用,先Fork一個子行程後,再Exec初始化子行程。
參考資料
Operating System: Process and Process Management
PCB
程序(process)概念–上
Process Creation
Process