linux任務的幾種狀態

linux任務的幾種狀態

 

 

而我們用ps,top看到的線程狀態還需要轉一下

 

R:任務正在CPU上運行,或已獲取除CPU外所有的資源,正在等待調度運行

 

當linux任務無法獲取所需資源時,如通過軟中斷陷入內核態調用會引起阻塞的系統調用read,accept,epoll_wait,select,futex等,不能繼續運行下去時會在內核態改變自己的狀態爲阻塞態,然後進行任務切換

 

S:當阻塞可以被信號中斷如net read,net write,accept,epoll_wait,select,futex時就設狀態爲TASK_INTERRUPTIBLE也就是top看到的S狀態

 

D:當陷入到內核態後直接等待一個硬件驅動程序完成相關操作時的阻塞不可以被信號中斷,如當由於讀寫磁盤無法立即滿足時,磁盤等待隊列已經很長了,這時一個linux任務再發起一個disk read,而恰好此read所需的數據所在的磁盤block未被cache在文件系統的高速緩衝區,此linux任務就會被設爲TASK_UNINTERRUPTIBLE等待磁盤驅動程序IO完成,也就是top看到的D狀態,而此時iowait及系統負載也是很高的,而此狀態其實並不只是包含disk sleep,disk sleep只是我們常見到的導致務狀態是D一種情況,當與硬件交互無法立即得到結果時,有些情況會被設爲TASK_UNINTERRUPTIBLE狀態,然後進行任務切換

 

這是man vmstat中對r b 兩列的介紹

介紹說r列的只包含等待CPU的任務,vmstat其實壓根就無法區分那些任務正在等待調度到CPU,那些正在CPU上運行,內核根本沒提供這種狀態,而ps,top,vmstat,這些命令只是從/proc/pid/stat中讀取這些狀態展示罷了

b列就是處於D狀態的任務個數,表明當前有多少任務被磁盤IO給block住了

 

r b列的任務多時伴隨的是系統負載高

load average高,iowait低,說明CPU資源緊張,此時r隊列大小應該是大於cpu核數

load average高,iowait也高,此時b隊列一定是不爲0的,如果CPU使用率高那就是CPU資源緊張 ,反之就是磁盤IO已經滿載了,此時再讀寫磁盤就有可能被hang住

 

T:被SIGSTOP信號暫停,strace跟蹤,gdb調試

 

Z:當父進程未退出,子進程退出但父進程未忽略SIGCLD信號,時子進程的狀態,在父進程收屍後狀態會轉變爲X,如果父進程不及時調用wait收屍,系統會存在殭屍進程佔用進程描述符

 

X:當父進程忽略SIGCLD信號,子進程退出時的狀態

 

當一個S,D狀態的linux任務已獲取到所需資源如read到數據,accept到新連接,獲取到鎖時,就會從S,D狀態轉變爲R狀態,狀態R代表任務正在CPU上運行或已經獲取到所有除CPU外的所有資源,萬事俱備只欠東風,只待被調度器選中調度到CPU上運行了

 

同樣是read write,爲什麼net read wirte阻塞後是TASK_INTERRUPTIBLE,而被disk read wirte阻塞後是TASK_UNINTERRUPTIBLE?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章