本節目标:
- 程序狀态變遷
- 程序控制塊
- 程序建立
- 程序撤消
- 終止程序的五種方法
一,程序狀态變遷
程序的三種基本狀态
就緒(Ready)狀态
當程序已配置設定到除CPU以外的所有必要的資源,隻要獲得處理機便可立即執行,這時的程序狀态稱為就緒狀态。
執行(Running)狀态
當程序已獲得處理機,其程式正在處理機上執行,此時的程序狀态稱為執行狀态。
阻塞(Blocked)狀态
正在執行的程序,由于等待某個事件發生而無法執行時,便放棄處理機而處于阻塞狀态。引起程序阻塞的事件可有多種,例如,等待I/O完成、申請緩沖區不能滿足、等待信件(信号)等。
狀态轉換圖:

一個程序在運作期間,不斷地從一種狀态轉換到另一種狀态,它可以多次處于就緒狀态和執行狀态,也可以多次處于阻塞狀态。
(1) 就緒→執行
處于就緒狀态的程序,當程序排程程式為之配置設定了處理機後,該程序便由就緒狀态轉變成執行狀态。
(2) 執行→就緒
處于執行狀态的程序在其執行過程中,因配置設定給它的一個時間片已用完或更高優先級的程序搶占而不得不讓出處理機,于是程序從執行狀态轉變成就緒狀态。
(3) 執行→阻塞
正在執行的程序因等待某種事件發生而無法繼續執行時,便從執行狀态變成阻塞狀态。
(4) 阻塞→就緒
處于阻塞狀态的程序,若其等待的事件已經發生,于是程序由阻塞狀态轉變為就緒狀态。
(5) 運作→終止
程式執行完畢,撤銷而終止
以上是最經典也是最基本的三種程序狀态,但現在的作業系統都根據需要重新設計了一些新的狀态。
如linux:
- 運作狀态(TASK_RUNNING):是運作态和就緒态的合并,表示程序正在運作或準備運作,Linux 中使用TASK_RUNNING 宏表示此狀态
- 可中斷睡眠狀态(淺度睡眠)(TASK_INTERRUPTIBLE):程序正在睡眠(被阻塞),等待資源到來是喚醒,也可以通過其他程序信号或時鐘中斷喚醒,進入運作隊列。Linux 使用TASK_INTERRUPTIBLE 宏表示此狀态。
- 不可中斷睡眠狀态(深度睡眠狀态)(TASK_UNINTERRUPTIBLE): 其和淺度睡眠基本類似,但有一點就是不可被其他程序信号或時鐘中斷喚醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此狀态。
- 暫停狀态(TASK_STOPPED):程序暫停執行接受某種處理。如正在接受調試的程序處于這種狀态,Linux 使用TASK_STOPPED 宏表示此狀态。
- 僵死狀态(TASK_ZOMBIE):程序已經結束但未釋放PCB,Linux 使用TASK_ZOMBIE 宏表示此狀态
狀态轉換圖如下:
就緒态在支援虛拟記憶體的作業系統中可能分為:在記憶體中就緒和在交換空間就緒,因為支援虛拟記憶體的作業系統會将目前不太活躍的一些程序交換到交換空間,交換空間就緒程序要運作要先換人記憶體出入記憶體就緒态,在由cpu排程執行。
二,程序控制塊(PCB)
程序控制塊包括:
程序描述資訊:
- 程序辨別符用于唯一的辨別一個程序(pid,ppid)。
程序控制資訊:
- 程序目前狀态
- 程序優先級
- 程式開始位址
- 各種計時資訊
- 通信資訊
資源資訊:
- 占用記憶體大小及管理用資料結構指針
- 交換區相關資訊
- I/O裝置号、緩沖、裝置相關的數結構
- 檔案系統相關指針
現場保護資訊(cpu進行程序切換時):
- 寄存器
- PC
- 程式狀态字PSW
- 棧指針
程序辨別:PID
- 每個程序都會配置設定到一個獨一無二的數字編号,我們稱之為“程序辨別”(process identifier),或者就直接叫它PID.
- 是一個正整數,取值範圍從2到32768
可以通過:cat /proc/sys/kernel/pid_max 檢視系統支援多少程序
- 當一個程序被啟動時,它會順序挑選下一個未使用的編号數字做為自己的PID
- 數字1一般為特殊程序init保留的
init程序實際上是使用者程序,它是一個程式,在/sbin/init,linux啟動的第一個程序
實際上linux中還存在0号程序(核心程序),它是一個空閑程序,它進行空閑資源的統計及交換空間的換入換出,1(init)程序是由0号程序建立的。
三,程序建立
- 不同的作業系統所提供的程序建立原語的名稱和格式不盡相同,但執行建立程序原語後,作業系統所做的工作卻大緻相同,都包括以下幾點:
- 給新建立的程序配置設定一個内部辨別(pcb),在核心中建立程序結構。
- 複制父程序的環境
- 為程序配置設定資源, 包括程序映像所需要的所有元素(程式、資料、使用者棧等),
- 複制父程序位址空間的内容到該程序位址空間中。
- 置該程序的狀态為就緒,插入就緒隊列。
四,程序撤銷
程序終止時作業系統做以下工作:
- 關閉軟中斷:因為程序即将終止而不再處理任何軟中斷信号;
- 回收資源:釋放程序配置設定的所有資源,如關閉所有已打開檔案,釋放程序相應的資料結構等;
- 寫記帳資訊:将程序在運作過程中所産生的記帳資料(其中包括程序運作時的各種統計資訊)記錄到一個全局記帳檔案中;
- 置該程序為僵死狀态:向父程序發送子程序死的軟中斷信号,将終止資訊status送到指定的存儲單元中;
- 轉程序排程:因為此時CPU已經被釋放,需要由程序排程進行CPU再配置設定。
五,終止程序的五種方法
- 從main函數傳回:從return傳回,執行完畢退出
- 調用exit:C函數庫,實際上也是調用系統調用_exit完成的,在任何一個函數調用exit函數都可使得程序撤銷
- 調用_exit:系統調用
- 調用abort:調用abort()函數使得程序終止,實際上該函數是産生一個SIGABRT信号,
- 由信号終止:發送一些信号如SINGINT等信号
-----------------------我和我追豬的夢-----------------------------------------------------------------
作者:mickole
出處:http://www.cnblogs.com/mickole/