標籤:io strong 檔案 問題 代碼 linux 時間 sp on
linux上進程有5種狀態:
1. 運行(正在運行或在運行隊列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)
3. 不可中斷(收到訊號不喚醒和不可運行, 進程必須等待直到有中斷髮生)
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放)
5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止運行運行)
ps工具標識進程的5種狀態代碼:
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue)
S 中斷 sleeping
T 停止 traced or stopped
Z 僵死 a defunct ("zombie") process
R : 可執行狀態
只有在該狀態的進程才可能在CPU上運行。而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程式控制制塊)被放入對應CPU的可執行隊列中(一個進程最多隻能出現在一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU上運行。
很多作業系統教科書將正在CPU上執行的進程定義為RUNNING狀態、而將可執行但是尚未被調度執行的進程定義為READY狀態,這兩種狀態在linux下統一為 TASK_RUNNING狀態。
S:可中斷的睡眠狀態
處於這個狀態的進程因為等待某某事件的發生(比如等待socket串連、等待訊號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其他進程觸發),對應的等待隊列中的一個或多個進程將被喚醒。
通過ps命令我們會看到,一般情況下,進程列表中的絕大多數進程都處於task_interruptible狀態(除非機器的負載很高)。畢竟CPU就這麼一兩個,進程動輒幾十上百個,如果不是絕大多數進程都在睡眠,CPU又怎麼響應得過來。
D: 不可中斷的睡眠狀態
與task_interruptible狀態類似,進程處於睡眠狀態,但是此刻進程是不可中斷的。不可中斷,指的並不是CPU不響應外部硬體的中斷,而是指進程不響應非同步訊號。 絕大多數情況下,進程處在睡眠狀態時,總是應該能夠響應非同步訊號的。但是uninterruptible sleep 狀態的進程不接受外來的任何訊號,因此無法用kill殺掉這些處於D狀態的進程,無論是”kill”, “kill -9″還是”kill -15″,這種情況下,一個可選的方法就是reboot。
處於uninterruptible sleep狀態的進程通常是在等待IO,比如磁碟IO,網路IO,其他外設IO,如果進程正在等待的IO在較長的時間內都沒有響應,那麼就被ps看到了,同時也就意味著很有可能有IO出了問題,可能是外設本身出了故障,也可能是比如掛載的遠程檔案系統已經不可訪問了.
Z :退出狀態,進程成為殭屍進程
在Linux進程的狀態中,殭屍進程是非常特殊的一種,它是已經結束了的進程,但是沒有從進程表中刪除。太多了會導致進程表裡麵條目滿了,進而導致系統崩潰,倒是不佔用其他系統資源。
它已經放棄了幾乎所有記憶體空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等資訊供其他進程收集,除此之外,殭屍進程不再佔有任何記憶體空間。
進程在退出的過程中,處於TASK_DEAD狀態。在這個退出過程中,進程佔有的所有資源將被回收,除了task_struct結構(以及少數資源)以外。於是進程就只剩下task_struct這麼個空殼,故稱為殭屍
【linux】Linux 進程狀態