程序狀態d,往往是由於 i/o 資源得不到滿足而引發等待 ,舉個例子,當 nfs 服務端關閉之時,若未事先 umount 相關目錄,在 nfs 客戶端執行 df 就會掛住整個登入會話,按 ctrl+c 、ctrl+z 都無濟於事。斷開連線再登入,執行 ps axf 則看到剛才的 df 程序狀態位已變成了 d ,kill -9 無法殺滅。正確的處理方式,是馬上恢復 nfs 服務端,再度提供服務,剛才掛起的 df 程序發現了其苦苦等待的資源,便完成任務,自動消亡。若 nfs 服務端無法恢復服務,在 reboot 之前也應將 /etc/mtab 裡的相關 nfs mount 項刪除,以免 reboot 過程例行呼叫 netfs stop 時再次發生等待資源,導致系統重啟過程掛起。
d(task_uninterruptible)狀態存在的意義就在於,核心的某些處理流程是不能被打斷的。如果響應非同步訊號,程式的執行流程中就會被插入一段用於處理非同步訊號的流程(這個插入的流程可能只存在於核心態,也可能延伸到使用者態),於是原有的流程就被中斷了。(參見《linux核心非同步中斷**》)
在程序對某些硬體進行操作時(比如程序呼叫read這個系統呼叫對某個裝置檔案進行讀操作,而read系統呼叫最終執行到對應裝置驅動的**,並與對應的物理裝置進行互動),可能需要使用task_uninterruptible狀態對程序進行保護,以避免程序與裝置互動的過程被打斷,造成裝置陷入不可控的狀態。這種情況下的task_uninterruptible狀態總是非常短暫的,通過ps命令基本上不可能捕捉到。
linux下如何殺掉D狀態程序
d狀態 disk sleep 程序用kill 9命令是不管用的,最簡單的方法就是reboot,除此還可以修改核心,將其程序狀態轉化為別的狀態,然後kill掉。新建資料夾,cd進去,新建killd.c 檔案,如下 include include needed by all modules includ...
linux程序狀態D和Z的處理
原始文章 關於zombie程序 這些程序已經死亡,但沒有釋放系統資源,包括記憶體和一些一些系統表等,如果這樣的程序很多,會引發系統問題。用ps el看出的程序狀態如果是z,就是殭屍程序。ps ef grep defunc可以找出殭屍程序.有些zombie程序時用kill 9也不能殺死,而且消耗了很多...
如何分析D狀態程序
在使用top檢視程序狀態時,我們有時候會看到d狀態的程序。w s process status the status of the task which can be one of d uninterruptible sleep r running s sleeping t traced or st...