本文參考了【深入linux核心架構】
linux作業系統屬於多工作業系統,系統中的每個程序能夠分時復用cpu時間片,通過有效的程序排程策略實現多工並行執行。而程序在被cpu排程執行,等待cpu資源分配以及等待外部事件時會屬於不同的狀態。下圖描述了程序之間的狀態關係:
程序的三種基本狀態:
執行:該程序此刻正在執行
乙個程序在執行期間,不斷地從一種狀態轉換到另一種狀態,它可以多次處於就緒狀態和執行狀態,也可以多次處於阻塞狀態。
(1) 就緒→執行
處於就緒狀態的程序,當程序排程程式為之分配了處理機後,該程序便由就緒狀態轉變成執行狀態。
(2) 執行→就緒
處於執行狀態的程序在其執行過程中,因分配給它的乙個時間片已用完或更高優先順序的程序搶占而不得不讓出處理機,於是程序從執行狀態轉變成就緒狀態。
(3) 執行→阻塞
正在執行的程序因等待某種事件發生而無法繼續執行時,便從執行狀態變成阻塞狀態。
(4) 阻塞→就緒
處於阻塞狀態的程序,若其等待的事件已經發生,於是程序由阻塞狀態轉變為就緒狀態。
(5) 執行→終止
程式執行完畢,撤銷而終止
現在從理論回到實際,在linux核心,涉及程序和程式的所有演算法都圍繞乙個名為task_struct的資料結構建立。在其中,state指定了程序的當前狀態,有下列值:
• 執行狀態(task_running):意味著程序處於可執行狀態。並不意味著已經實際分配了cpu。程序可能會一直等到排程器選中它。該狀態確保程序可以立即執行,而無需等待外部事件。linux 中使用task_running 巨集表示此狀態。
• 可中斷睡眠狀態(淺度睡眠)(task_interruptible):針對等待某事件或其他資源的睡眠程序設定的。在核心傳送訊號給該程序表面事件已經發生時,程序狀態變為task_running,它只要排程器選中該程序即可恢復執行。linux 使用task_interruptible 巨集表示此狀態。
• 不可中斷睡眠狀態(深度睡眠狀態)(task_uninterruptible):
其和淺度睡眠基本類似,因核心指示而停用的睡眠程序。不能由外部訊號喚醒,只能由核心親自喚醒。linux 使用task_uninterruptible 巨集表示此狀態。
• 暫停狀態(task_stopped):程序暫停執行接受某種處理。如正在接受除錯的程序處於這種狀態,linux 使用task_stopped 巨集表示此狀態。
• 僵死狀態(task_zombie):程序已經結束但未釋放pcb,linux 使用task_zombie巨集表示此狀態
程序生命週期
對於乙個程序,基本概念我覺得就是乙個資源分配單位。對於每乙個程序都有對應的pcb 程序控制塊 在linux下的pcb是task struct。對於task struct,一開始我看原始碼的時候也是非常痛苦,看了這忘了那,一直都模模糊糊。所以總結之後,覺得得需要根據乙個程序,需要有什麼東西,大概就能有...
執行緒和程序生命週期
執行緒和程序生命週期 幾種狀態 執行緒的狀態以及狀態之間的相互轉換 1 新建狀態 new 新建立了乙個執行緒物件。2 就緒狀態 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start 方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。3 執行狀態 runn...
React 生命週期 生命週期方法
生命週期 掛載 更新 解除安裝 元件被建立 執行初始化 並被掛載到dom中,完成元件的第一次渲染 constructor props getderivedstatefromprops props,state render componentdidmount 元件被建立時會首先呼叫元件的構造方法,接受...