自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux進(jìn)程狀態(tài)解析之T、Z、X

運(yùn)維 系統(tǒng)運(yùn)維
Linux系統(tǒng)中進(jìn)程有很多種狀態(tài),前面我們說了R、S、D三種狀態(tài),還有另外的三種狀態(tài),這里我們一并說一下,補(bǔ)全前面的文章。

上面一篇文章中我們介紹了Linux進(jìn)程的R、S、D三種狀態(tài),這里接著上面的文章介紹另外三個(gè)狀態(tài)。

Linux進(jìn)程狀態(tài):T (TASK_STOPPED or TASK_TRACED),暫停狀態(tài)或跟蹤狀態(tài)。

向進(jìn)程發(fā)送一個(gè)SIGSTOP信號(hào),它就會(huì)因響應(yīng)該信號(hào)而進(jìn)入TASK_STOPPED狀態(tài)(除非該進(jìn)程本身處于TASK_UNINTERRUPTIBLE狀態(tài)而不響應(yīng)信號(hào))。(SIGSTOP與SIGKILL信號(hào)一樣,是非常強(qiáng)制的。不允許用戶進(jìn)程通過signal系列的系統(tǒng)調(diào)用重新設(shè)置對(duì)應(yīng)的信號(hào)處理函數(shù)。)
向進(jìn)程發(fā)送一個(gè)SIGCONT信號(hào),可以讓其從TASK_STOPPED狀態(tài)恢復(fù)到TASK_RUNNING狀態(tài)。

當(dāng)進(jìn)程正在被跟蹤時(shí),它處于TASK_TRACED這個(gè)特殊的狀態(tài)?!罢诒桓櫋敝傅氖沁M(jìn)程暫停下來,等待跟蹤它的進(jìn)程對(duì)它進(jìn)行操作。比如在gdb中對(duì)被跟蹤的進(jìn)程下一個(gè)斷點(diǎn),進(jìn)程在斷點(diǎn)處停下來的時(shí)候就處于TASK_TRACED狀態(tài)。而在其他時(shí)候,被跟蹤的進(jìn)程還是處于前面提到的那些狀態(tài)。

對(duì)于進(jìn)程本身來說,TASK_STOPPED和TASK_TRACED狀態(tài)很類似,都是表示進(jìn)程暫停下來。
而TASK_TRACED狀態(tài)相當(dāng)于在TASK_STOPPED之上多了一層保護(hù),處于TASK_TRACED狀態(tài)的進(jìn)程不能響應(yīng)SIGCONT信號(hào)而被喚醒。只能等到調(diào)試進(jìn)程通過ptrace系統(tǒng)調(diào)用執(zhí)行PTRACE_CONT、PTRACE_DETACH等操作(通過ptrace系統(tǒng)調(diào)用的參數(shù)指定操作),或調(diào)試進(jìn)程退出,被調(diào)試的進(jìn)程才能恢復(fù)TASK_RUNNING狀態(tài)。

Linux進(jìn)程狀態(tài):Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態(tài),進(jìn)程成為僵尸進(jìn)程。

進(jìn)程在退出的過程中,處于TASK_DEAD狀態(tài)。

在這個(gè)退出過程中,進(jìn)程占有的所有資源將被回收,除了task_struct結(jié)構(gòu)(以及少數(shù)資源)以外。于是進(jìn)程就只剩下task_struct這么個(gè)空殼,故稱為僵尸。
之所以保留task_struct,是因?yàn)閠ask_struct里面保存了進(jìn)程的退出碼、以及一些統(tǒng)計(jì)信息。而其父進(jìn)程很可能會(huì)關(guān)心這些信息。比如在shell中,$?變量就保存了***一個(gè)退出的前臺(tái)進(jìn)程的退出碼,而這個(gè)退出碼往往被作為if語句的判斷條件。
當(dāng)然,內(nèi)核也可以將這些信息保存在別的地方,而將task_struct結(jié)構(gòu)釋放掉,以節(jié)省一些空間。但是使用task_struct結(jié)構(gòu)更為方便,因?yàn)樵趦?nèi)核中已經(jīng)建立了從pid到task_struct查找關(guān)系,還有進(jìn)程間的父子關(guān)系。釋放掉task_struct,則需要建立一些新的數(shù)據(jù)結(jié)構(gòu),以便讓父進(jìn)程找到它的子進(jìn)程的退出信息。

父進(jìn)程可以通過wait系列的系統(tǒng)調(diào)用(如wait4、waitid)來等待某個(gè)或某些子進(jìn)程的退出,并獲取它的退出信息。然后wait系列的系統(tǒng)調(diào)用會(huì)順便將子進(jìn)程的尸體(task_struct)也釋放掉。
子進(jìn)程在退出的過程中,內(nèi)核會(huì)給其父進(jìn)程發(fā)送一個(gè)信號(hào),通知父進(jìn)程來“收尸”。這個(gè)信號(hào)默認(rèn)是SIGCHLD,但是在通過clone系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程時(shí),可以設(shè)置這個(gè)信號(hào)。

通過下面的代碼能夠制造一個(gè)EXIT_ZOMBIE狀態(tài)的進(jìn)程:

  1. #include   
  2. void main() {  
  3. if (fork())  
  4. while(1) sleep(100);  


編譯運(yùn)行,然后ps一下:

  1. kouu@kouu-one:~/test$ ps -ax | grep a\.out  
  2. 10410 pts/0    S+     0:00 ./a.out  
  3. 10411 pts/0    Z+     0:00 [a.out]   
  4. 10413 pts/1    S+     0:00 grep a.out 

只要父進(jìn)程不退出,這個(gè)僵尸狀態(tài)的子進(jìn)程就一直存在。那么如果父進(jìn)程退出了呢,誰又來給子進(jìn)程“收尸”?
當(dāng)進(jìn)程退出的時(shí)候,會(huì)將它的所有子進(jìn)程都托管給別的進(jìn)程(使之成為別的進(jìn)程的子進(jìn)程)。托管給誰呢?可能是退出進(jìn)程所在進(jìn)程組的下一個(gè)進(jìn)程(如果存在的話),或者是1號(hào)進(jìn)程。所以每個(gè)進(jìn)程、每時(shí)每刻都有父進(jìn)程存在。除非它是1號(hào)進(jìn)程。

1號(hào)進(jìn)程,pid為1的進(jìn)程,又稱init進(jìn)程。
linux系統(tǒng)啟動(dòng)后,***個(gè)被創(chuàng)建的用戶態(tài)進(jìn)程就是init進(jìn)程。它有兩項(xiàng)使命:
1、執(zhí)行系統(tǒng)初始化腳本,創(chuàng)建一系列的進(jìn)程(它們都是init進(jìn)程的子孫);
2、在一個(gè)死循環(huán)中等待其子進(jìn)程的退出事件,并調(diào)用waitid系統(tǒng)調(diào)用來完成“收尸”工作;
init進(jìn)程不會(huì)被暫停、也不會(huì)被殺死(這是由內(nèi)核來保證的)。它在等待子進(jìn)程退出的過程中處于TASK_INTERRUPTIBLE狀態(tài),“收尸”過程中則處于TASK_RUNNING狀態(tài)。

Linux進(jìn)程狀態(tài):X (TASK_DEAD - EXIT_DEAD),退出狀態(tài),進(jìn)程即將被銷毀。

而進(jìn)程在退出過程中也可能不會(huì)保留它的task_struct。比如這個(gè)進(jìn)程是多線程程序中被detach過的進(jìn)程(進(jìn)程?線程?參見《linux線程淺析》)。或者父進(jìn)程通過設(shè)置SIGCHLD信號(hào)的handler為SIG_IGN,顯式的忽略了SIGCHLD信號(hào)。(這是posix的規(guī)定,盡管子進(jìn)程的退出信號(hào)可以被設(shè)置為SIGCHLD以外的其他信號(hào)。)
此時(shí),進(jìn)程將被置于EXIT_DEAD退出狀態(tài),這意味著接下來的代碼立即就會(huì)將該進(jìn)程徹底釋放。所以EXIT_DEAD狀態(tài)是非常短暫的,幾乎不可能通過ps命令捕捉到。

進(jìn)程的初始狀態(tài)

進(jìn)程是通過fork系列的系統(tǒng)調(diào)用(fork、clone、vfork)來創(chuàng)建的,內(nèi)核(或內(nèi)核模塊)也可以通過kernel_thread函數(shù)創(chuàng)建內(nèi)核進(jìn)程。這些創(chuàng)建子進(jìn)程的函數(shù)本質(zhì)上都完成了相同的功能——將調(diào)用進(jìn)程復(fù)制一份,得到子進(jìn)程。(可以通過選項(xiàng)參數(shù)來決定各種資源是共享、還是私有。)
那么既然調(diào)用進(jìn)程處于TASK_RUNNING狀態(tài)(否則,它若不是正在運(yùn)行,又怎么進(jìn)行調(diào)用?),則子進(jìn)程默認(rèn)也處于TASK_RUNNING狀態(tài)。
另外,在系統(tǒng)調(diào)用調(diào)用clone和內(nèi)核函數(shù)kernel_thread也接受CLONE_STOPPED選項(xiàng),從而將子進(jìn)程的初始狀態(tài)置為 TASK_STOPPED。

進(jìn)程狀態(tài)變遷

進(jìn)程自創(chuàng)建以后,狀態(tài)可能發(fā)生一系列的變化,直到進(jìn)程退出。而盡管進(jìn)程狀態(tài)有好幾種,但是進(jìn)程狀態(tài)的變遷卻只有兩個(gè)方向——從TASK_RUNNING狀態(tài)變?yōu)榉荰ASK_RUNNING狀態(tài)、或者從非TASK_RUNNING狀態(tài)變?yōu)門ASK_RUNNING狀態(tài)。
也就是說,如果給一個(gè)TASK_INTERRUPTIBLE狀態(tài)的進(jìn)程發(fā)送SIGKILL信號(hào),這個(gè)進(jìn)程將先被喚醒(進(jìn)入TASK_RUNNING狀態(tài)),然后再響應(yīng)SIGKILL信號(hào)而退出(變?yōu)門ASK_DEAD狀態(tài))。并不會(huì)從TASK_INTERRUPTIBLE狀態(tài)直接退出。

進(jìn)程從非TASK_RUNNING狀態(tài)變?yōu)門ASK_RUNNING狀態(tài),是由別的進(jìn)程(也可能是中斷處理程序)執(zhí)行喚醒操作來實(shí)現(xiàn)的。執(zhí)行喚醒的進(jìn)程設(shè)置被喚醒進(jìn)程的狀態(tài)為TASK_RUNNING,然后將其task_struct結(jié)構(gòu)加入到某個(gè)CPU的可執(zhí)行隊(duì)列中。于是被喚醒的進(jìn)程將有機(jī)會(huì)被調(diào)度執(zhí)行。

而進(jìn)程從TASK_RUNNING狀態(tài)變?yōu)榉荰ASK_RUNNING狀態(tài),則有兩種途徑:
1、響應(yīng)信號(hào)而進(jìn)入TASK_STOPED狀態(tài)、或TASK_DEAD狀態(tài);
2、執(zhí)行系統(tǒng)調(diào)用主動(dòng)進(jìn)入TASK_INTERRUPTIBLE狀態(tài)(如nanosleep系統(tǒng)調(diào)用)、或TASK_DEAD狀態(tài)(如exit系統(tǒng)調(diào)用);或由于執(zhí)行系統(tǒng)調(diào)用需要的資源得不到滿足,而進(jìn)入TASK_INTERRUPTIBLE狀態(tài)或TASK_UNINTERRUPTIBLE狀態(tài)(如select系統(tǒng)調(diào)用)。
顯然,這兩種情況都只能發(fā)生在進(jìn)程正在CPU上執(zhí)行的情況下。

【編輯推薦】

  1. Linux進(jìn)程狀態(tài)解析之R、S、D
  2. 有關(guān)Linux創(chuàng)建用戶命令的詳細(xì)討論
  3. Linux文件類型全解析
  4. 簡單概述Linux磁盤管理命令與術(shù)語
  5. 有關(guān)Linux創(chuàng)建用戶命令的詳細(xì)討論
責(zé)任編輯:小霞 來源: CSDN
相關(guān)推薦

2010-03-02 10:27:56

Linux進(jìn)程狀態(tài)

2021-07-06 21:30:06

Linux進(jìn)程通信

2023-03-05 16:12:41

Linux進(jìn)程線程

2023-03-02 23:50:36

Linux進(jìn)程管理

2011-01-11 13:47:27

Linux管理進(jìn)程

2023-03-03 00:03:07

Linux進(jìn)程管理

2019-08-29 14:47:45

Linux中央處理器Windows

2022-07-05 16:03:29

電源管理子系統(tǒng)鴻蒙

2021-06-15 08:02:55

Linux 進(jìn)程管理

2021-04-22 07:47:46

Linux進(jìn)程管理

2021-04-15 05:51:25

Linux

2012-05-03 08:27:20

Linux進(jìn)程

2009-10-27 16:34:02

linux top命令

2016-08-23 09:17:08

LinuxD狀態(tài)TASK_RUNNIN

2021-05-17 18:28:36

Linux CFS負(fù)載均衡

2009-10-27 16:14:11

linux進(jìn)程查看

2021-05-12 07:50:02

CFS調(diào)度器Linux

2021-09-30 10:45:33

Linux進(jìn)程通信

2009-10-27 16:01:58

linux w命令

2009-10-27 15:58:06

linux進(jìn)程查看
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)