Linux 內核分析與應用 3 - 進程管理

本系列是對 陳莉君 老師 Linux 內核分析與應用 [1] 的學習與記錄。講的非常之好,推薦觀看

留此記錄,蜻蜓點水, 可作拋磚引玉


3.1 進程概述

一個程序通過編譯器將其編譯成_彙編程序_, 經過彙編器將其彙編成目標代碼, 通過**鏈接器**形成可執行文件 a.out 或者 elf 格式, 最後交給操作系統來執行

進程最基本的狀態有三種: 就緒態, 睡眠態和運行態, 在具體的操作系統中, 可能實例化出多個狀態.

PCB: Process Control Block

task_struct 結構體位於 sched.h 中

對於進程來說, 它的靜態表現就是程序, 平時都安安靜靜呆在磁盤上, 而一旦運行起來, 就變成了計算機裏的數據和狀態的總和;

運行着的程序就是一個進程.


3.2 Linux 進程創建

對於進程, 線程, 內核線程, 內核使用唯一的數據結構task_struct來分別表示, 也使用相同的調度算法對其進行調度.

儘管看起來差異很大, 但最後都通過 do_fork 分別創建.

創建進程和創建線程調用了不同的函數, 分別爲forkpthread_create, 而對應的系統調用分別爲 fork 和 clone.

所有的系統調用進入內核只有一個入口, 但進入以後就分道揚鑣, 各有各的服務歷程; 而分手是暫時的, 最終還是會歸到一處, do_fork 就是它們的聚合點.

父子進程共享內存的地址空間, 但父進程的頁表除外

copy_process() 函數主要是爲子進程創建父進程 PCB 的副本


3.3 Linux 進程調度

所謂調度, 實際就是從就緒隊列中, 選擇一個進程投入到 CPU 中運行.

"主戰場" 是就緒隊列, 核心是調度算法, 實質是進程的切換

O(1) 調度: 將單鏈表變爲多鏈表來實現, 從 O(n) 降低到了 O(1)

機制與策略分離

完全公平調度 ---CFS,

沒有了_時間片_的概念, 而是分配 CPU 使用的比例

同一時刻, 一個 CPU 上運行的進程只能有一個. 當一個進程佔用 CPU 的時候, 其他進程必須等待

使用到了紅黑樹

CFS 中的就緒隊列, 就是一棵已_虛擬時間_爲鍵值的紅黑樹, 虛擬時間越小的進程, 越靠近紅黑樹的左端, 調度器每次選擇位於紅黑樹左端的進程.

更多可參閱 <深入理解 Linux 內核> 第三版第七章

蝸窩科技 [2]


參考資料

[1]

Linux 內核分析與應用: https://next.xuetangx.com/course/XIYOU08091001441/1516763

[2]

蝸窩科技: http://www.wowotech.net/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RmaEe72KemEK-HGxzzMxsw