乙個程序,有多種狀態,而要檢視當前的狀態,使用語句
檢視全部程序:ps aux
檢視特定程序:ps aux | grep [process]
例:
r 執行狀態(running): 並不意味著程序一定在執行中,它表明程序要麼是在執行中要麼在執行佇列裡。
r 執行狀態(running): 並不意味著程序一定在執行中,它表明程序要麼是在執行中要麼在執行佇列裡。
s 睡眠狀態(sleeping): 意味著程序在等待事件完成(這裡的睡眠有時候也叫做可中斷睡眠(interruptible sleep))。
d 磁碟休眠狀態(disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的程序通常會等待io的結束。
t 停止狀態(stopped): 可以通過傳送 sigstop 訊號給程序來停止(t)程序。這個被暫停的程序可以通過傳送 sigcont 訊號讓程序繼續執行。
x 死亡狀態(dead):這個狀態只是乙個返回狀態,你不會在任務列表裡看到這個狀態。
產生原因
我們知道,當乙個程式產生乙個程序,則它就會有自己的pcb,而父子程序的pcb通過雙向鍊錶掛接,某一時刻子程序退出,而父程序並沒有接收到該訊息,子程序此時就變成了乙個殭屍程序。
因為父程序沒有接收到子程序退出狀態,因此核心中子程序的pcb並沒有消失仍然掛接在父程序中
殭屍程序的危害
前面說了,殭屍程序的pcb是仍然存在的,我們使用ps aux命令仍然可以檢視,但它實際已經推出了,而它之前的那塊記憶體就因此被洩露了。過多的殭屍程序的危害就在此處
模擬乙個殭屍程序
寫乙個text.c,使用fork()建立乙個子程序並分支,而在父程序的分支讓其死迴圈,這樣在子程序結束後就無法將狀態訊息返回給父程序
檢視結果,產生了乙個z+程序,即殭屍程序
此時我們若使用**"kill -9"強殺殭屍程序呢?
可以看到,殭屍程序刀槍不入,連kill -9都無法殺掉它,不難理解,此時的該程序其實早已經不存在了,殺掉它更就無從談起
產生原因;父程序先退出,子程序就稱之為「孤兒程序」
孤兒程序產生後,由1號程序init**領養,也就是說,當孤兒程序產生後,1號程序會成為其父程序,收集它的狀態資訊。那麼對於殭屍程序有一種處理方法就是:殺掉其父程序,讓殭屍程序變成乙個孤兒程序,接著就會被1號程序領養
linux 程序 狀態
程序在執行過程中會根據環境來改變state。linux程序有以下狀態 running 程序處於執行 它是系統的當前程序 或者準備執行狀態 它在等待系統將cpu分配給它 waiting 程序在等待乙個事件或者資源。linux將等待程序分成兩類 可中斷與不可中斷。可中斷等待程序可以被訊號中斷 不可中斷等...
linux程序狀態
1.r task running,正在執行或者處於就緒狀態 很多作業系統教科書將正在cpu上執行的程序定義為running狀態 而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一為 task running狀態。例子 ps aux 會看到ps這個程式命令的執行狀態是...
Linux程序狀態
在linux中,常見的程序狀態有以下幾種 task running 0 程序正在執行或者等待被排程執行 task interruptible 1 程序由於等待某個系統資源或者某個事件而處於掛起 睡眠 狀態。對其傳送訊號 signal 可以將其喚醒 進入task running狀態 task unin...