Linux 进程状态【转】
轉(zhuǎn)自:http://www.cnblogs.com/itech/p/3208261.html
來自:?http://blog.csdn.net/tianlesoftware/article/details/6457487
Linux是一個(gè)多用戶,多任務(wù)的系統(tǒng),可以同時(shí)運(yùn)行多個(gè)用戶的多個(gè)程序,就必然會(huì)產(chǎn)生很多的進(jìn)程,而每個(gè)進(jìn)程會(huì)有不同的狀態(tài)。??在下文將對(duì)進(jìn)程的
R、S、D、T、Z、X?六種狀態(tài)做個(gè)說明。
?
PROCESS STATE CODES
???????Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process.
???????D????Uninterruptible sleep?(usually IO)
???????R????Running or runnable (on run queue)
???????S????Interruptible sleep?(waiting for an event to complete)
???????T????Stopped, either by a job control signal or because it is being traced.
???????W????paging (not valid since the 2.6.xx kernel)
???????X????dead (should never be seen)
???????Z????Defunct ("zombie") process, terminated but not
????????????reaped by its parent.
?
???????For BSD formats and when the stat keyword is used,additional characters may be displayed:
???????<????high-priority (not nice to other users)
???????N????low-priority (nice to other users)
???????L????has pages locked into memory (for real-time and custom IO)
???????s????is a session leader
???????l????is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
???????+????is in the foreground process group
?
?
一.?查看進(jìn)程的狀態(tài)
1.1?使用PS命令
[root@localhost]#?ps -a -o pid,ppid,stat,command -u oracle
??PID??PPID STAT COMMAND
??637?????1 Ss???oracleXEZF (LOCAL=NO)
??729?????1 Ss???oracleXEZF (LOCAL=NO)
?1144??1103 S+???top
?1230?????1 Ss???oracleXEZF (LOCAL=NO)
?1289??1145 S+???vmstat 10
?1699?????1 Ss???oracleXEZF (LOCAL=NO)
?1827??1294 R+???ps -a -o pid,ppid,stat,command -u oracle
?3410?????1 Ss???ora_pmon_XEZF
?3412?????1 Ss???ora_psp0_XEZF
?3414?????1 Ss???ora_mman_XEZF
?3416?????1 Ss???ora_dbw0_XEZF
?3418?????1 Ss???ora_lgwr_XEZF
?3420?????1 Ss???ora_ckpt_XEZF
?3422?????1 Ss???ora_smon_XEZF
?3424?????1 Ss???ora_reco_XEZF
?3426?????1 Ss???ora_mmon_XEZF
?3428?????1 Ss???ora_mmnl_XEZF
?3430?????1 Ss???ora_d000_XEZF
?3432?????1 Ss???ora_d001_XEZF
?3434?????1 Ss???ora_s000_XEZF
?3436?????1 Ss???ora_s001_XEZF
?3438?????1 Ss???ora_s002_XEZF
?3488?????1 Ssl??/home/oracle_app/bin/tnslsnr LISTENER -inherit
11167?????1 Ss???oracleXEZF (LOCAL=NO)
11423?????1 Ss???oracleXEZF (LOCAL=NO)
11425?????1 Ss???oracleXEZF (LOCAL=NO)
11429?????1 Ss???oracleXEZF (LOCAL=NO)
14867?????1 Ss???oracleXEZF (LOCAL=NO)
19323?????1 Ss???oracleXEZF (LOCAL=NO)
?
用ps?的?– l?選項(xiàng),得到更詳細(xì)的進(jìn)程信息:
(1)F(Flag):一系列數(shù)字的和,表示進(jìn)程的當(dāng)前狀態(tài)。這些數(shù)字的含義為:
???????00:若單獨(dú)顯示,表示此進(jìn)程已被終止。
???????01:進(jìn)程是核心進(jìn)程的一部分,常駐于系統(tǒng)主存。如:sched,vhand,bdflush。
???????02:Parent is tracing process.
???????04?:Tracing parent's signal has stopped the process; the parent is waiting ( ptrace(S)).
???????10:進(jìn)程在優(yōu)先級(jí)低于或等于25時(shí),進(jìn)入休眠狀態(tài),而且不能用信號(hào)喚醒,例如在等待一個(gè)inode被創(chuàng)建時(shí)。
???????20:進(jìn)程被裝入主存(primary memory)
???????40:進(jìn)程被鎖在主存,在事務(wù)完成前不能被置換。
?
(2)?進(jìn)程狀態(tài):S(state)
???????O:進(jìn)程正在處理器運(yùn)行,這個(gè)狀態(tài)從來木見過.
???????S:休眠狀態(tài)(sleeping)
???????R:等待運(yùn)行(runable)R Running or runnable (on run queue)?進(jìn)程處于運(yùn)行或就緒狀態(tài)
???????I:空閑狀態(tài)(idle)
???????Z:僵尸狀態(tài)(zombie)
???????T:跟蹤狀態(tài)(Traced)
???????B:進(jìn)程正在等待更多的內(nèi)存頁
???????D:不可中斷的深度睡眠,一般由IO引起,同步IO在做讀或?qū)懖僮鲿r(shí),cpu不能做其它事情,只能等待,這時(shí)進(jìn)程處于這種狀態(tài),如果程序采用異步IO,這種狀態(tài)應(yīng)該就很少見到了
?
(3)C(cpu usage):cpu利用率的估算值
?
?
1.2?使用Top命令中的S?字段
pid user??????pr??ni??virt??res??shr?s?%cpu %mem????time+??command????????????????????????????????
11423 oracle????16???0??627m 170m 168m?R???32??9.0???4110:21 oracle????????????????????????????????
?3416 oracle????15???0??650m 158m 138m?S????0??8.4???0:07.12 oracle?????????????????????????????????
11167 oracle????15???0??626m 151m 149m?S????0??8.0 400:20.77 oracle????????????????????????????????
11429 oracle????15???0??626m 148m 147m?S????0??7.9 812:05.71 oracle????????????????????????????????
?3422 oracle????18???0??627m 140m 137m?S????0??7.4???1:12.23 oracle????????????????????????????????
?1230 oracle????15???0??639m 107m??96m?S????0??5.7???0:10.00 oracle????????????????????????????????
??637 oracle????15???0??629m??76m??73m?S????0??4.0???0:04.31 oracle?????????????????????
?
?
二.??進(jìn)程狀態(tài)說明
2.1??R (task_running) :?可執(zhí)行狀態(tài)
???????只有在該狀態(tài)的進(jìn)程才可能在CPU上運(yùn)行。而同一時(shí)刻可能有多個(gè)進(jìn)程處于可執(zhí)行狀態(tài),這些進(jìn)程的task_struct結(jié)構(gòu)(進(jìn)程控制塊)被放入對(duì)應(yīng)CPU的可執(zhí)行隊(duì)列中(一個(gè)進(jìn)程最多只能出現(xiàn)在一個(gè)CPU的可執(zhí)行隊(duì)列中)。進(jìn)程調(diào)度器的任務(wù)就是從各個(gè)CPU的可執(zhí)行隊(duì)列中分別選擇一個(gè)進(jìn)程在該CPU上運(yùn)行。
???????很多操作系統(tǒng)教科書將正在CPU上執(zhí)行的進(jìn)程定義為RUNNING狀態(tài)、而將可執(zhí)行但是尚未被調(diào)度執(zhí)行的進(jìn)程定義為READY狀態(tài),這兩種狀態(tài)在linux下統(tǒng)一為?TASK_RUNNING狀態(tài)。
?
2.2??S (task_interruptible):?可中斷的睡眠狀態(tài)
???????處于這個(gè)狀態(tài)的進(jìn)程因?yàn)榈却衬呈录陌l(fā)生(比如等待socket連接、等待信號(hào)量),而被掛起。這些進(jìn)程的task_struct結(jié)構(gòu)被放入對(duì)應(yīng)事件的等待隊(duì)列中。當(dāng)這些事件發(fā)生時(shí)(由外部中斷觸發(fā)、或由其他進(jìn)程觸發(fā)),對(duì)應(yīng)的等待隊(duì)列中的一個(gè)或多個(gè)進(jìn)程將被喚醒。
???????通過ps命令我們會(huì)看到,一般情況下,進(jìn)程列表中的絕大多數(shù)進(jìn)程都處于task_interruptible狀態(tài)(除非機(jī)器的負(fù)載很高)。畢竟CPU就這么一兩個(gè),進(jìn)程動(dòng)輒幾十上百個(gè),如果不是絕大多數(shù)進(jìn)程都在睡眠,CPU又怎么響應(yīng)得過來。
?
2.3??D (task_uninterruptible):?不可中斷的睡眠狀態(tài)
???????與task_interruptible狀態(tài)類似,進(jìn)程處于睡眠狀態(tài),但是此刻進(jìn)程是不可中斷的。不可中斷,指的并不是CPU不響應(yīng)外部硬件的中斷,而是指進(jìn)程不響應(yīng)異步信號(hào)。
???????絕大多數(shù)情況下,進(jìn)程處在睡眠狀態(tài)時(shí),總是應(yīng)該能夠響應(yīng)異步信號(hào)的。但是uninterruptible sleep?狀態(tài)的進(jìn)程不接受外來的任何信號(hào),因此無法用kill殺掉這些處于D狀態(tài)的進(jìn)程,無論是”kill”, “kill -9″還是”kill -15″,這種情況下,一個(gè)可選的方法就是reboot。
?
???????處于uninterruptible sleep狀態(tài)的進(jìn)程通常是在等待IO,比如磁盤IO,網(wǎng)絡(luò)IO,其他外設(shè)IO,如果進(jìn)程正在等待的IO在較長的時(shí)間內(nèi)都沒有響應(yīng),那么就被ps看到了,同時(shí)也就意味著很有可能有IO出了問題,可能是外設(shè)本身出了故障,也可能是比如掛載的遠(yuǎn)程文件系統(tǒng)已經(jīng)不可訪問了.
?
???????而task_uninterruptible狀態(tài)存在的意義就在于,內(nèi)核的某些處理流程是不能被打斷的。如果響應(yīng)異步信號(hào),程序的執(zhí)行流程中就會(huì)被插入一段用于處理異步信號(hào)的流程(這個(gè)插入的流程可能只存在于內(nèi)核態(tài),也可能延伸到用戶態(tài)),于是原有的流程就被中斷了。
???????在進(jìn)程對(duì)某些硬件進(jìn)行操作時(shí)(比如進(jìn)程調(diào)用read系統(tǒng)調(diào)用對(duì)某個(gè)設(shè)備文件進(jìn)行讀操作,而read系統(tǒng)調(diào)用最終執(zhí)行到對(duì)應(yīng)設(shè)備驅(qū)動(dòng)的代碼,并與對(duì)應(yīng)的物理設(shè)備進(jìn)行交互),可能需要使用task_uninterruptible狀態(tài)對(duì)進(jìn)程進(jìn)行保護(hù),以避免進(jìn)程與設(shè)備交互的過程被打斷,造成設(shè)備陷入不可控的狀態(tài)。這種情況下的task_uninterruptible狀態(tài)總是非常短暫的,通過ps命令基本上不可能捕捉到。
?
???????我們通過vmstat?命令中procs下的b?可以來查看是否有處于uninterruptible?狀態(tài)的進(jìn)程。?該命令只能顯示數(shù)量。
?
???????In computer operating systems terminology, a sleeping process can either be interruptible (woken via signals) or uninterruptible (woken explicitly).?An uninterruptible sleep state is a sleep state that cannot handle a signal (such as waiting for disk or network IO (input/output)).
?
???????When the process is sleeping uninterruptibly, the signal will be noticed when the process returns from the system call or trap.
???????--?這句是關(guān)鍵。?當(dāng)處于uninterruptibly sleep?狀態(tài)時(shí),只有當(dāng)進(jìn)程從system?調(diào)用返回時(shí),才通知signal。
?
???????A process which ends up in “D” state for any measurable length of time is trapped in the midst of a system call (usually an I/O operation on a device — thus the initial in the ps output).
?
???????Such a process cannot be killed?— it would risk leaving the kernel in an inconsistent state, leading to a panic.?In general you can consider this to be a bug in the device driver that the process is accessing.
?
2.4??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)。“正在被跟蹤”指的是進(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)。
?
?
2.5 Z (task_dead - exit_zombie):退出狀態(tài),進(jìn)程成為僵尸進(jìn)程
???????在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它是已經(jīng)結(jié)束了的進(jìn)程,但是沒有從進(jìn)程表中刪除。太多了會(huì)導(dǎo)致進(jìn)程表里面條目滿了,進(jìn)而導(dǎo)致系統(tǒng)崩潰,倒是不占用其他系統(tǒng)資源。????
???????它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。
??????
???????進(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)程在退出的過程中,內(nèi)核會(huì)給其父進(jìn)程發(fā)送一個(gè)信號(hào),通知父進(jìn)程來“收尸”。?父進(jìn)程可以通過wait系列的系統(tǒng)調(diào)用(如wait4、waitid)來等待某個(gè)或某些子進(jìn)程的退出,并獲取它的退出信息。然后wait系列的系統(tǒng)調(diào)用會(huì)順便將子進(jìn)程的尸體(task_struct)也釋放掉。
???????這個(gè)信號(hào)默認(rèn)是SIGCHLD,但是在通過clone系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程時(shí),可以設(shè)置這個(gè)信號(hào)。
???????如果他的父進(jìn)程沒安裝SIGCHLD信號(hào)處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯式忽略該信號(hào),那么它就一直保持僵尸狀態(tài),子進(jìn)程的尸體(task_struct)也就無法釋放掉。
?
???????如果這時(shí)父進(jìn)程結(jié)束了,那么init進(jìn)程自動(dòng)會(huì)接手這個(gè)子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵尸進(jìn)程。
?
???????當(dāng)進(jìn)程退出的時(shí)候,會(huì)將它的所有子進(jìn)程都托管給別的進(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)。
?
Unix/Linux?處理僵尸進(jìn)程的方法:
???????找出父進(jìn)程號(hào),然后kill?父進(jìn)程,之后子進(jìn)程(僵尸進(jìn)程)會(huì)被托管到其他進(jìn)程,如init進(jìn)程,然后由init進(jìn)程將子進(jìn)程的尸體(task_struct)釋放掉。
?
除了通過ps?的狀態(tài)來查看Zombi進(jìn)程,還可以用如下命令查看:
[oracle@rac1 ~]$ ps -ef|grep defun
oracle???13526 12825??0 16:48 pts/1????00:00:00 grep defun
oracle???28330 28275??0 May18 ?????????00:00:00 [Xsession] <defunct>
?
僵尸進(jìn)程解決辦法:
(1)改寫父進(jìn)程,在子進(jìn)程死后要為它收尸。
???????具體做法是接管SIGCHLD信號(hào)。子進(jìn)程死后,會(huì)發(fā)送SIGCHLD信號(hào)給父進(jìn)程,父進(jìn)程收到此信號(hào)后,執(zhí)行?waitpid()函數(shù)為子進(jìn)程收尸。這是基于這樣的原理:就算父進(jìn)程沒有調(diào)用wait,內(nèi)核也會(huì)向它發(fā)送SIGCHLD消息,盡管對(duì)的默認(rèn)處理是忽略,如果想響應(yīng)這個(gè)消息,可以設(shè)置一個(gè)處理函數(shù)。
(2)把父進(jìn)程殺掉。
???????父進(jìn)程死后,僵尸進(jìn)程成為"孤兒進(jìn)程",過繼給1號(hào)進(jìn)程init,init始終會(huì)負(fù)責(zé)清理僵尸進(jìn)程.它產(chǎn)生的所有僵尸進(jìn)程也跟著消失。如:
???????kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
???????其中,“Process Name”為處于zombie狀態(tài)的進(jìn)程名。
(3)殺父進(jìn)程不行的話,就嘗試用skill -t TTY關(guān)閉相應(yīng)終端,TTY是進(jìn)程相應(yīng)的tty號(hào)(終端號(hào))。但是,ps可能會(huì)查不到特定進(jìn)程的tty號(hào),這時(shí)就需要自己判斷了。
(4)重啟系統(tǒng),這也是最常用到方法之一。
?
?
2.6 X (task_dead - exit_dead):退出狀態(tài),進(jìn)程即將被銷毀
???????進(jìn)程在退出過程中也可能不會(huì)保留它的task_struct。比如這個(gè)進(jìn)程是多線程程序中被detach過的進(jìn)程。或者父進(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)變化說明
3.1?進(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。
?
3.2?進(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í)行的情況下。
作者:iTech
出處:http://itech.cnblogs.com/?
轉(zhuǎn)載于:https://www.cnblogs.com/sky-heaven/p/5730001.html
總結(jié)
以上是生活随笔為你收集整理的Linux 进程状态【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis学习总结(16)——Myb
- 下一篇: Compass 更智能的搜索引擎(3)-