一文讀懂Linux進程管理一(進程原理與分析)
一、進程原理
1.進程
Linux內(nèi)核把進程稱為任務(wù)(task),進程的虛擬地址空間分為用戶虛擬地址空間和內(nèi)核虛擬地址空間,所有進程共享內(nèi)核虛擬地址空間,每個進程有獨立的用戶虛擬地址空間。
進程有兩種特殊形式:沒有用戶虛擬地址空間的進程成為內(nèi)核線程,共享用戶虛擬地址空間的進程稱為用戶線程。通用在不會引起混淆的情況下把用戶線程簡稱為線程。共享同一用戶虛擬地址空間的所有用戶線程組成一個線程組。
C標(biāo)準(zhǔn)庫的進程專業(yè)術(shù)語和Linux內(nèi)核的進程專業(yè)術(shù)語對應(yīng)關(guān)系如下:

2.Linux進程四要素
有一段程序供其執(zhí)行
有進程專用的系統(tǒng)堆??臻g
在內(nèi)核有task_struct數(shù)據(jù)結(jié)構(gòu)
有獨立的存儲空間,擁有專有的用戶空間
? ? ? ?如果只具備前三條缺少第四條,稱為:線程 ? ? ? ?如果完全沒有用戶空間,稱為:內(nèi)核線程 ? ? ? ?如果共享用戶空間映射,稱為:用戶線程
內(nèi)核為每個進程分配一個task_struct結(jié)構(gòu)時,實際分配兩個連續(xù)的物理頁面(8192字節(jié)),數(shù)據(jù)結(jié)構(gòu)task_struct的大小約占1kb字節(jié)左右,進程的系統(tǒng)空間堆棧的大小約為7kb字節(jié)(不能擴展,是靜態(tài)確定的)
3.進程描述符task_struct數(shù)據(jù)結(jié)構(gòu)內(nèi)核源碼,其主要核心成員如下

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ? ? ??


4.創(chuàng)建新進程
在Linux內(nèi)核中,新進程是從一個已經(jīng)存在的進程復(fù)制出來的,內(nèi)核使用靜態(tài)數(shù)據(jù)結(jié)構(gòu)造成0號內(nèi)核線程,0號內(nèi)核線程分叉生成1號內(nèi)核線程和2號內(nèi)核線程(kthreadd線程)。1號內(nèi)核線程完成初始化以后裝載用戶程序,變成1號進程,其他進程都是1號進程或者它的子孫進程分叉生成的,其他內(nèi)核線程時kthreadd線程分叉生成的。
3個系統(tǒng)調(diào)用用來創(chuàng)建新的進程:
fork(分叉):子進程是父進程的一個副本,采用定時復(fù)制技術(shù)。
vfork:用于創(chuàng)建子進程,之后子進程立即調(diào)用execve以裝載新程序的情況,為了避免復(fù)制物理頁,父進程會睡眠燈帶子進程裝載新程序。現(xiàn)在fork采用了定時復(fù)制技術(shù),vfork失去了速度優(yōu)勢,已被廢棄。
clone(克隆):可以精確的控制子進程和父進程共享那些資源,這個系統(tǒng)調(diào)用的主要用處是可供pthread庫來床架線程。clone是功能最齊全的的函數(shù),參數(shù)多使用復(fù)雜,fork是clone的簡化函數(shù)。 ? ? ?
Linux內(nèi)核定義系統(tǒng)調(diào)用的獨特方式,目前以系統(tǒng)調(diào)用fork為例,fork調(diào)用_do_fork為例,流程如下:

在調(diào)用_do_fork的過程中,主要是cory_process

同一個線程組的所有線程必須屬于相同的用戶命名空間和進程號命名空間。
二、進程狀態(tài)遷移
進程主要有7種狀態(tài):
就緒狀態(tài)
運行狀態(tài)
輕度睡眠
中度睡眠
深度睡眠
僵尸狀態(tài)
死亡狀態(tài)
狀態(tài)變遷如下:

三、進程調(diào)度策略和優(yōu)先級
?1.Linux內(nèi)核支持調(diào)度策略
先進先出(SCHED_FIFO)、輪流調(diào)度(SCHED_RR)、限期調(diào)度策略(SCHED_DEADLINE)采用不同的調(diào)度策略調(diào)度實時進程
普通進程支持兩種調(diào)度策略:標(biāo)準(zhǔn)輪流分時(SCHED_NORMAL)和SCHED_BATCH調(diào)用普通的非實時進程
空閑(SCHED_IDLE)則在系統(tǒng)空閑時調(diào)用idle進程

2.進程優(yōu)先級
限期進程的優(yōu)先級比實時進程高,實時進程比普通進程高
限期進程的優(yōu)先級是-1
實時進程的實時優(yōu)先級是1-99,優(yōu)先級數(shù)值越大,表示優(yōu)先級越高
普通進程的靜態(tài)優(yōu)先級是100-139,優(yōu)先級值越小,表示優(yōu)先級越高,可通過修改nice值改變普通進程的優(yōu)先級,優(yōu)先級等于120加上nice值。
在task_struct結(jié)構(gòu)體中,4個成員的優(yōu)先級有關(guān)如下:


四、寫時復(fù)制
寫時復(fù)制核心思想:只有在不得不復(fù)制數(shù)據(jù)內(nèi)容時采取復(fù)制數(shù)據(jù)內(nèi)容

