基于Linux操作系統(tǒng)下的進(jìn)程管理分析
進(jìn)程
1.進(jìn)程是什么
1.1概念
計(jì)算機(jī)上所有可運(yùn)行的軟件,通常也包括操作系統(tǒng),被組織成若干順序進(jìn)程 (sequential process),簡(jiǎn)稱(chēng)進(jìn)程 (process)。
一個(gè)進(jìn)程就是一個(gè)正在執(zhí)行程序的實(shí)例,包括程序設(shè)計(jì)器、寄存器和變量的當(dāng)前值。一個(gè)進(jìn)程是某種類(lèi)型的一種活動(dòng),它有程序、輸入、輸出以及狀態(tài)。單個(gè)處理器可以被若干進(jìn)程共享,它使用某種調(diào)度算法決定何時(shí)停止一個(gè)進(jìn)程的工作,并轉(zhuǎn)而為了另一個(gè)進(jìn)程服務(wù)功能。
2.進(jìn)程如何組織
2.1進(jìn)程控制塊(PCB)
Linux系統(tǒng)中主要的活動(dòng)實(shí)體就是進(jìn)程。
每個(gè)進(jìn)程執(zhí)行一段獨(dú)立的程序并且在進(jìn)程初始化的時(shí)候擁有一個(gè)獨(dú)立的控制線程。換句話說(shuō),每一個(gè)進(jìn)程都擁有一個(gè)獨(dú)立的程序計(jì)數(shù)器,用這個(gè)這個(gè)程序計(jì)數(shù)器可以追蹤下一條將要被執(zhí)行的指令。
所有的進(jìn)程都被放在一個(gè)叫做進(jìn)程控制塊(PCB),的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進(jìn)程屬性的集合,該控制塊由操作系統(tǒng)創(chuàng)建和管理。每個(gè)進(jìn)程在內(nèi)核中都有一個(gè)進(jìn)程控制塊來(lái)維護(hù)進(jìn)程相關(guān)的信息,Linux內(nèi)核的進(jìn)程控制塊是(task_struct)結(jié)構(gòu)體。
2.2進(jìn)程標(biāo)識(shí)符(PID)
進(jìn)程標(biāo)識(shí)符在task_struct下定義
每個(gè)進(jìn)程都有一個(gè)唯一的標(biāo)識(shí)符(PID),內(nèi)核通過(guò)這個(gè)標(biāo)識(shí)符來(lái)識(shí)別不同的進(jìn)程,同時(shí),進(jìn)程標(biāo)識(shí)符(PID)也是內(nèi)核提供給用戶(hù)程序的接口,用戶(hù)程序通過(guò)PID對(duì)進(jìn)程發(fā)號(hào)施令。
** PID** 是32位的無(wú)符號(hào)整數(shù),它被順序編號(hào):新創(chuàng)建進(jìn)程的PID通常是前一個(gè)進(jìn)程的PID加1。然而,為了與16位硬件平臺(tái)的傳統(tǒng)Linux系統(tǒng)保持兼容,在Linux上允許的最大PID號(hào)是32767,當(dāng)內(nèi)核在系統(tǒng)中創(chuàng)建第32768個(gè)進(jìn)程時(shí),就必須重新開(kāi)始使用已閑置的PID號(hào)。在64位系統(tǒng)中,PID可擴(kuò)展到4194303。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?


3.進(jìn)程狀態(tài)
** 3.1六種狀態(tài)**
#define TASK_RUNNING ** **
1.表示進(jìn)程要么正在執(zhí)行,要么正在準(zhǔn)備執(zhí)行。
#define TASK_INTERRUPTIBLE
2.表示進(jìn)程被阻塞(睡眠),只有當(dāng)某個(gè)條件是TRUE時(shí),其狀態(tài)相應(yīng)的設(shè)置為 TASK_RUNNING。它可以被信號(hào)和wake_up喚醒。
#define TASK_UNINTERRUPTIBLE
3.表示進(jìn)程被阻塞(睡眠),只有當(dāng)某個(gè)條件是TRUE時(shí),其狀態(tài)相應(yīng)的設(shè)置為 TASK_RUNNING。它只能被wake_up喚醒。
#define TASK_STOPPED
4.表示進(jìn)程被停止執(zhí)行。
#define TASK_TRACED
5.表示進(jìn)程被 debugger 等進(jìn)程監(jiān)視著。
#define EXIT_ZOMBIE
6.表示進(jìn)程的執(zhí)行被終止,但是其父進(jìn)程還沒(méi)有使用 wait() 等系統(tǒng)調(diào)用來(lái)獲知它的終止信息。
#define EXIT_DEAD
7.表示進(jìn)程的最終狀態(tài)。
3.2狀態(tài)轉(zhuǎn)換圖

4.Linux下的O(1)調(diào)度算法
** Linux O(1)調(diào)度器** (O(1) scheduler) 是歷史上一個(gè)流行的Linux系統(tǒng)調(diào)度程序。命名為這個(gè)名字是因?yàn)樗軌蛟诔?shù)時(shí)間內(nèi)執(zhí)行任務(wù)調(diào)度,例如從執(zhí)行隊(duì)列中選擇一個(gè)任務(wù)或?qū)⒁粋€(gè)任務(wù)加入執(zhí)行隊(duì)列,這與系統(tǒng)中的任務(wù)總數(shù)有關(guān)。
4.1 O(1)調(diào)度器
在O(1)調(diào)度中,要問(wèn)最重要的數(shù)據(jù)結(jié)構(gòu)是運(yùn)行隊(duì)列。運(yùn)行隊(duì)列描繪了進(jìn)程隊(duì)列的結(jié)構(gòu),在內(nèi)核源碼中用runqueue結(jié)構(gòu)體表示。
4.2優(yōu)先級(jí)數(shù)組
O(1)算法的另一個(gè)核心數(shù)據(jù)結(jié)構(gòu)即為prio_array結(jié)構(gòu)體。該結(jié)構(gòu)體中有一個(gè)用來(lái)表示進(jìn)程動(dòng)態(tài)優(yōu)先級(jí)的數(shù)組queue,它包含了每一種優(yōu)先級(jí)進(jìn)程所形成的鏈表。
4.3靜態(tài)優(yōu)先級(jí)和動(dòng)態(tài)優(yōu)先級(jí)
進(jìn)程有兩個(gè)優(yōu)先級(jí),一個(gè)是靜態(tài)優(yōu)先級(jí),一個(gè)是動(dòng)態(tài)優(yōu)先級(jí).靜態(tài)優(yōu)先級(jí)是用來(lái)計(jì)算進(jìn)程運(yùn)行的時(shí)間片長(zhǎng)度的,動(dòng)態(tài)優(yōu)先級(jí)是在調(diào)度器進(jìn)行調(diào)度時(shí)用到的,調(diào)度器每次都選取動(dòng)態(tài)優(yōu)先級(jí)最高的進(jìn)程運(yùn)行.
4.4時(shí)間片
O(1)算法采用過(guò)期進(jìn)程數(shù)組和活躍進(jìn)程數(shù)組解決以往調(diào)度算法所帶來(lái)的O(n)復(fù)雜度問(wèn)題。過(guò)期數(shù)組中的進(jìn)程都已經(jīng)用完了時(shí)間片,而活躍數(shù)組的進(jìn)程還擁有時(shí)間片。當(dāng)一個(gè)進(jìn)程用完自己的時(shí)間片后,它就被移動(dòng)到過(guò)期進(jìn)程數(shù)組中,同時(shí)這個(gè)過(guò)期進(jìn)程在被移動(dòng)之前就已經(jīng)計(jì)算好了新的時(shí)間片。可以看到O(1)調(diào)度算法是采用分散計(jì)算時(shí)間片的方法,并不像以往算法中集中為所有可運(yùn)行進(jìn)程重新計(jì)算時(shí)間片。當(dāng)活躍進(jìn)程數(shù)組中沒(méi)有任何進(jìn)程時(shí),說(shuō)明此時(shí)所有可運(yùn)行的進(jìn)程都用完了自己的時(shí)間片。那么此時(shí)只需要交換一下兩個(gè)數(shù)組即可將過(guò)期進(jìn)程切換為活躍進(jìn)程,進(jìn)而繼續(xù)被調(diào)度程序所調(diào)度。兩個(gè)數(shù)組之間的切換其實(shí)就是指針之間的交換,因此花費(fèi)的時(shí)間是恒定的。
上面的代碼說(shuō)明了兩個(gè)數(shù)組之間的交換,通過(guò)分散計(jì)算時(shí)間片、交換過(guò)期和活躍兩個(gè)進(jìn)程集合的方法可以使得O(1)算法在恒定的時(shí)間內(nèi)為每個(gè)進(jìn)程重新計(jì)算好時(shí)間片。
4.5調(diào)度算法
在每次進(jìn)程切換時(shí),內(nèi)核依次掃描就緒隊(duì)列上的每一個(gè)進(jìn)程,計(jì)算每個(gè)進(jìn)程的優(yōu)先級(jí),再選擇出優(yōu)先級(jí)最高的進(jìn)程來(lái)運(yùn)行;盡管這個(gè)算法理解簡(jiǎn)單,但是它花費(fèi)在選擇優(yōu)先級(jí)最高進(jìn)程上的時(shí)間卻不容忽視。系統(tǒng)中可運(yùn)行的進(jìn)程越多,花費(fèi)的時(shí)間就越大,時(shí)間復(fù)雜度為O(n)。
5.對(duì)操作系統(tǒng)進(jìn)程模型的看法
進(jìn)程是操作系統(tǒng)最核心的概念,這是對(duì)正在運(yùn)行的程序的一個(gè)抽象。所有操作系統(tǒng)其他的所有內(nèi)容都是圍繞著進(jìn)程的概念展開(kāi)的。
從概念上說(shuō),每個(gè)進(jìn)程都擁有它自己的虛擬CPU。當(dāng)然,實(shí)際上的真正的CPU在各自進(jìn)程之間來(lái)回切換。
進(jìn)程管理即是操作系統(tǒng)對(duì)CPU的管理,為了提升CPU利用率,使用多道編程,便有了多進(jìn)程維護(hù)管理。操作系統(tǒng)已實(shí)現(xiàn)了各管理功能,硬件CPU及一系列進(jìn)程資源抽象成為了進(jìn)程的概念,可以說(shuō)進(jìn)程算是操作系統(tǒng)的“無(wú)中生有”,應(yīng)用程序的編程人員直接利用進(jìn)程的機(jī)制,達(dá)到讓?xiě)?yīng)用程序高效利用硬件資源的目的。
轉(zhuǎn)自Wangwangsheng
