乙個程序的誕生,是從其父程序呼叫fork()開始的。
程序從剛開始被建立出來,是處於task_running(就緒態),程序被放在等待佇列中排隊等待系統排程。
linux核心中的函式sched()稱為排程器,它會根據各種引數來選擇乙個等待的程序去占用cpu,當程序占用了cpu後,就從就緒態轉變成了執行態。此時程序可以執行了,但是執行時間有乙個限制,即「時間片」的概念。當時間片耗光的情況下該程序還沒有結束的話,那麼會被系統重新放入等待佇列中等待。 要注意的是:處於"執行態"的程序即使時間片沒有耗光,也可能被別的更高優先順序的程序搶占cpu,被迫重新回到等待佇列中等待。
程序處於"執行態"時,可能會因為某些資源的不可得而被置為 "睡眠態 / 掛起態",如程序要讀取乙個管道檔案資料,而管道為空。或者使用 sleep() 強制自己掛起。這些情況下程序都會變成 task_uninterrupible(睡眠態)或 task_interrupible(掛起態)。在睡眠期間不能響應訊號,掛機期間可以響應訊號。 當程序中所等待的資源變得可獲取時,又會被系統置為task_running(就緒態)重新排隊。
當程序收到sigstop 或 sigtstp 中的乙個訊號時,狀態就會置為 task_stopped(暫停態)。該狀態下程序不再參與排程,系統資源也不釋放。直到收到 sigcont訊號後被重新置為就緒態。
程序執行結束以後就會被置為 exit_zombie(殭屍態),這裡殭屍指的是程序的pcb(程序控制塊)。程序結束以後會留下一些資訊封存進該程序的pcb裡面,好讓它的父程序知道程序是怎麼結束的。
父程序呼叫 wait() / waitpid() 來檢視子程序的結束資訊,順便做一件非常重要的事情:將子程序的狀態設定為 exit_dead(死亡態)。因為處於這個狀態下的程序的pcb才能系統**。
程序的建立和程序狀態
程序 程序是乙個程式在記憶體中執行的過程。程序由程式 資料和程序控制塊 簡稱pcb 組成 程序控制塊 pcb linux中的pcb是乙個名叫task struct 的結構體,其中有一下幾個內容 識別符號 用來區別於其他的程序的識別符號。狀態 任務狀態,退出 退出訊號等。優先順序 程序的優先順序。程式...
程序以及狀態 程序的建立
程式 例如 py這是程式,是乙個靜態的 程序 乙個程式執行起來後,用到的資源 稱之為程序,它是作業系統分配資源的基本單元。不僅可以通過執行緒完成多工,程序也是可以的 乙個程式可以對應多個程序,如qq乙個程式,可以開啟多個qq則是多個程序。程序是擁有資源,如網路 記憶體等 工作中,任務數往往大於cpu...
Linux程序建立和結束
在linux 中,程序的建立由系統呼叫fork 和vfork 完成。它們生成乙個子程序並且子程序是父程序的乙個複製品。fork 系統呼叫對應的kernel 函式是sys fork 此函式簡單的呼叫kernel 函式do fork 乙個簡化版的do fork 執行如下 1 alloc pid 給新的程...