為了對程序從產生到消亡的整個過程進行跟蹤和描述,就需要定義各種程序的各種狀態並制定相應的狀態轉換策略,以此來控制程序的執行。
不同的作業系統對程序的狀態解釋不同,但是最基本的狀態都是一樣的。包括一下三種:
執行態:程序占用cpu,並在cpu上執行;
就緒態:程序已經具備執行條件,但是cpu還沒有分配過來;
阻塞態:程序因等待某件事發生而暫時不能執行;
程序在一生中,都處於上述3中狀態之一。
下面是3種狀態轉換圖
當然理論上上述三種狀態之間轉換分為六種情況;
執行---》就緒:這是有排程引起的,主要是程序占用cpu的時間過長
就緒---》執行:執行的程序的時間片用完,排程就轉到就緒佇列中選擇合適的程序分配cpu
執行---》阻塞:發生了i/o請求或等待某件事的發生
阻塞---》就緒:程序所等待的事件發生,就進入就緒佇列
以上4種情況可以相互正常轉換,不是還有兩種情況嗎?
阻塞--》執行:即使給阻塞程序分配cpu,也無法執行,作業系統載進行排程時不會載阻塞佇列進行挑選,其排程的選擇物件為就緒佇列:
就緒--》阻塞:因為就緒態根本就沒有執行,何來進入阻塞態?
現在知道了程序的三種基本狀態,但是載作業系統具體現實中,設計者可以根據實際情況設定不同的狀態,這樣以來,就出現了以下幾種狀態:
可執行態:他是執行態和就緒態的合併,表示程序正在執行或準備執行,linux 中使用task_running 巨集表示此狀態。
淺度睡眠態:程序正在睡眠(被阻塞),等待資源到來是喚醒,也可以通過其他程序訊號或時鐘中斷喚醒,進入執行佇列。linux 使用task_interruptible 巨集表示此狀態。
深度睡眠態:其和淺度睡眠基本類似,但有一點就是不可其他程序訊號或時鐘中斷喚醒。linux 使用task_uninterruptible 巨集表示此狀態。
暫停狀態:程序暫停執行接受某種處理。如正在接受除錯的程序處於這種狀態,linux 使用task_stopped 巨集表示此狀態。
僵死狀態:程序已經結束但未釋放pcb,linux 使用task_zombie 巨集表示此狀態。
我們可以來看下以上巨集在核心中的定義:
#define task_running 0
183 #define task_interruptible 1
184 #define task_uninterruptible 2
185 #define __task_stopped 4
186 #define __task_traced 8
187 /* in tsk->exit_state */程序的退出狀態
188 #define exit_zombie 16
189 #define exit_dead 32
190 /* in tsk->state again */我理解為程序的喚醒狀態
191 #define task_dead 64
192 #define task_wakekill 128
193 #define task_waking 256
194 #define task_state_max 512
195196 #define task_state_to_char_str "rsdttzxxkw"
以下是linux程序間狀態轉換和核心呼叫**
好了,現在對程序的基本狀態及轉換做了一定介紹,你了解了嗎?
程序的三種狀態及轉換
作業系統中執行的乙個程序具有三個狀態 1 就緒態 ready 此時程序獲得了除過cpu資源外的所有資源,只要獲得了處理機,便會立即執行 2 執行態 running 此時程式已經獲得了處理機,程式正在執行的狀態 3 阻塞態 blocked 正在執行的程序由於等待某乙個資源而無法繼續執行,此時放棄處理機...
程序的三種基本狀態及其轉換
1 就緒狀態 程序已獲得除cpu外的所有必要資源,只等待cpu時的狀態。乙個系統會將多個處於就緒狀態的程序排成乙個就緒佇列。2 執行狀態 程序已獲cpu,正在執行。單處理機系統中,處於執行狀態的程序只乙個 多處理機系統中,有多個處於執行狀態的程序。3 阻塞狀態 正在執行的程序由於某種原因而暫時無法繼...
程序的三種狀態
程序的三種基本狀態 1 就緒狀態 程序已獲得除cpu外的所有必要資源,只等待cpu時的狀態。乙個系統會將多個處於就緒狀態的程序排成乙個就緒佇列。2 執行狀態 程序已獲cpu,正在執行。單處理機系統中,處於執行狀態的程序只乙個 多處理機系統中,有多個處於執行狀態的程序。3 阻塞狀態 正在執行的程序由於...