Linux下的進程和進程間的狀態(tài)轉(zhuǎn)換。在我們的計算機層次結(jié)構(gòu)中,操作系統(tǒng)是處于一個承上啟下的層次。如下圖~
在計算機中,操作系統(tǒng)的定位是一個管理者,對上管理在系統(tǒng)中運行的進程,對下通過驅(qū)動程序管理各種硬件。
說到進程,首先得稍微解釋一下,什么叫做程序。
程序:程序是以某種語言編寫,為完成某個特定任務(wù)的一系列指令和數(shù)據(jù)的有序集被稱之為程序。
那么什么是進程?
從用戶的角度來解讀,進程就是程序的一次動態(tài)的執(zhí)行過程。
但是想要深入理解進程的概念,一定要知道操作系統(tǒng)是怎么解讀進程的。
首先要了解進程控制塊(Process Control Block),簡稱PCB。進程屬性的集合全部被放在PCB之中,在Linux下,PCB是一個叫做task_struct的結(jié)構(gòu)體之中。
學過C數(shù)據(jù)結(jié)構(gòu)的同學應該都知道,結(jié)構(gòu)體用來描述一個結(jié)構(gòu)的信息,通過指針我們把這些結(jié)構(gòu)組織起來,形成不同的數(shù)據(jù)結(jié)構(gòu)。比如鏈表,二叉樹,堆等等。
而操作系統(tǒng)也是通過這樣的方式對我們的PCB來進行管理的。
那么操作系統(tǒng)通過PCB來對進程進行管理,那么PCB中大概有什么關(guān)鍵信息呢?
進程標識符,進程狀態(tài),進程優(yōu)先級,程序入口地址,各種計時信息,文件系統(tǒng)的相關(guān)信息,現(xiàn)場保護信息等等一系列的信息。
在Linux下,進程標識符就是pid,這個可以通過命令來獲取,也可以通過一些系統(tǒng)調(diào)用接口來獲取,如ps命令,getpid()接口。pid是在操作系統(tǒng)下唯一標識一個進程存在的標識符,用于區(qū)別其他進程,同樣的道理,一個PCB也只唯一標識一個進程。
在Linux下,一個進程可以有七種不同的狀態(tài)。
R運行狀態(tài)(running):并不意味著進程一定在運行中,它表明進程要么是在運行要么是在運行隊列里。
S睡眠狀態(tài)(sleeping):意味著進程在等待事件完成(可中斷睡眠)。
D磁盤休眠狀態(tài)(Disk sleep):也叫不可中斷睡眠狀態(tài),在這個狀態(tài)進程通常會等待IO的結(jié)束。
T停止狀態(tài)(stopped):可以通過發(fā)送SIGSTOP信號給進程來停止(T)進程。這個暫停的進程可以通過發(fā)送SIGCONT信號讓進程繼續(xù)運行(關(guān)于信號后面還會繼續(xù)更新到相關(guān)內(nèi)容)。
X死亡狀態(tài)(dead):這個狀態(tài)只是一個返回狀態(tài),你不會在任務(wù)列表里看到這個狀態(tài)。
還有t(tracing stop)跟蹤狀態(tài)和Z(zombie)僵尸狀態(tài)。
僵尸狀態(tài)是進程已經(jīng)終止,但是還占用這系統(tǒng)中的資源沒有釋放,這種狀態(tài)對系統(tǒng)是有害的。
僵尸進程這種狀態(tài)比較特殊。當進程退出并且父進程沒有讀取到子進程退出的返回代碼就會產(chǎn)生僵尸進程。
所以,只要子進程推遲,父進程還在運行,但父進程沒有讀取子進程的狀態(tài),子進程進入Z狀態(tài)。
用這段小程序在Linux系統(tǒng)下運行,然后用查看進程狀態(tài)的命令查看就可以看到進程變成了Z狀態(tài)。
#include #include #include int main() { pid_t id = fork(); if(id == -1){ perror("fork"); return 1; } else if(id == 0){ printf("child pid: %dn",getpid()); sleep(3); exit(0); }else{ printf("parents pid:%dn",getpid()); sleep(30); exit(EXIT_SUCCESS); } return 0; }
狀態(tài)之間的轉(zhuǎn)換關(guān)系如下:
孤兒進程:父進程先退出,子進程就被稱為孤兒進程。父進程如果提前退出,那么子進程后退出,進入Z之后,該怎么辦呢?這個時候會產(chǎn)生對系統(tǒng)資源的浪費的僵尸進程。操作系統(tǒng)當然不會眼睜睜的看著這種事情發(fā)生,所以當系統(tǒng)中產(chǎn)生孤兒進程,就會被1號init進程領(lǐng)養(yǎng),當然會被init進程回收,這里的init進程可以先理解為操作系統(tǒng)的進程。