1. 程式人生 > >作業系統——程序(1)什麼是程序和對程序狀態的理解

作業系統——程序(1)什麼是程序和對程序狀態的理解

在作業系統中滿足的大多數需求都涉及程序,在有了應用程式、系統軟體和資源的概念,就需要一種有序的方式管理應用程式的執行,從而能夠讓資源對多個應用程式是可用的、能夠讓所有程式得以執行、充分利用所有裝置。 程序如此重要那麼程序是什麼?首先程序是一個正在計算機上執行的程式例項,即程式是靜態的而程式是動態的,這麼說有一些抽象,換一個說法程序是一個運動的過程這個過程能被交給處理機去執行,也就是一個應用程式執行的時間段。那麼從作業系統的角度來說程序是什麼呢?首先程序是由資料集、程式程式碼和程序控制塊組成,但作業系統的眼中只有程序控制塊,可以說系統是通過程序控制塊來感知程序是否存在,所以程序控制塊已經成為程序存在於系統的唯一標誌。對於系統來說程序就是一個名為程序控制塊的資料結構,並且這個資料結構可以被分配排程。 通過程式程式碼段和資料集以及程序控制塊(PCB)組成的實體,具有以下特徵的活動單元:一組指令序列的執行、一個當前狀態和相關的系統資源。
程序控制塊的資料結構記憶體儲的資訊,充分到可以中斷一個程序的執行並且恢復的時侯就像從未中斷過一樣。在一個程序控制塊內具有以下資訊等: (1)識別符號:分為內部標誌符和外部標誌符,內部識別符號是方便系統對程序的使用由系統建立,外部識別符號由建立者提供方便使用者對程序的訪問。 (2)狀態:表明程序所處的環境。 (3)優先順序:相對於其他程序的優先順序。 (4)程式計數器:程式中即將被執行的下一條指令的地址。 (5)記憶體指標:包括程式程式碼和程序相關資料的指標,和其他程序共享記憶體塊的指標。 (6)上下文資料(處理器暫存器):程序執行時處理器暫存器中的資料。 (7)I/O狀態資訊:包括顯示I/O請求、分配給程序的I/O裝置、被程序使用的檔案列表。 (8)記賬資訊:包括處理器的時間總和、使用的時鐘數總和、時間限制、記賬號等等。
當進行中斷時,作業系統會把程式計數器和處理器暫存器儲存到程序控制塊中的相應位置,然後程序狀態會改變其他的值,就可以讓其他程序設定為執行態開始執行。也就是說PCB需要儲存處理機狀態資訊、程序標誌資訊、程序控制資訊三大部分。 處理機狀態資訊通過各種暫存器的內容組成包括:通用暫存器、程式計數器、條件碼、程式狀態字、棧指標。 程序控制資訊包括:程序狀態,程序優先順序、等待事件、排程所需資訊、程式和資料的地址、程序同步和通訊機制的各種標記和訊號、資源的所有權和使用情況、儲存管理、連結指標。
上面說過對一個被執行的程式不同的角色看到的結果是不同的,從系統看它會為其建立一個程序或者任務;從處理器看它在指令序列中根據程式計數器變化的值去執行某種順序的指令;從程式自身看它的執行涉及程式中的一系例指令。這些程序執行的指令序列可以描述單個程序的行為,這樣的序列稱為程序的軌跡。 作業系統的基本職責是控制程序的執行,一個程序可以處於以下兩種狀態:執行態和未執行態,作業系統必須用某種方式來表示程序使得其可以被追蹤,這就是程序控制塊,未執行的程序必須保持在某種型別的佇列裡並等待執行的時機,程序的生存週期圍繞著建立和終止,當一個新程序被新增到正在被管理的程序集合中時作業系統需要建立用於管理改程序的資料結構,並在記憶體中分配地址。而程序終止,任何一個計算機系統都必須為程序提供表示其完成的方法,在不同的系統中結束的方法不相同比如說作業中的Halt指令、使用者的行為、中端的關閉或者服務請求等等。
在建立之後如果程序做好了執行準備,對於可執行的程序處理器以一種輪轉方式操作,這時出現了一個問題佇列裡除了存在可以直接執行的程序,還存在了等待I/O操作結束的程序,所以不能只考慮佇列中最老的程序,而是未被阻塞且在佇列中時間最長的程序。所以需要將非執行狀態分為就緒狀態和阻塞狀態,同時為了解決在成百上千的程序中去遍歷整個阻塞佇列搜尋等待響應該事件的程序,擁有多個佇列是有效的,一個事件一個佇列也可以按照優先順序方案分配程序維護多個就緒佇列面,每個優先順序一個佇列。而為了更好的與建立和終止進行銜接出現了新建態和退出態,還有一直存在的執行態,這個五個狀態組成了程序的無狀態模型。 現在說一下新建態和退出態對於起到的作用: 首先新建態可以分兩步定義新程序 (1)先執行一些必須的輔助工作,將識別符號關聯到程序,分配和建立管理程序所需要的所有表,這一步處於新建態雖然作業系統已經執行了建立程序的必須操作但是沒有執行程序,沒有執行是操縱系統基於效能或者記憶體容量的原因會限制程序的數量,在程序處於新建態時,雖然已經建立了程序表並且將關於該程序的資訊儲存到記憶體的程序表中但是程序本身並沒有進入記憶體。當程序處於新建態時該程序的執行的程式碼還沒有進入記憶體也沒有為這個程式相關的資料分配空間。 (2)當作業系統準備好在接受一個程序時,程序從新建態轉換到就緒態的時候,程式程式碼和資料被載入到虛擬記憶體中。同時確保活躍的程式不會過多。
同理程序退出系統也分為兩步 (1)當一個程序被終止的時候,終止使程序轉換到退出態,程序不再被執行但是它的表資訊及其他資訊,因為一些輔助程式和支援程式會提取資訊分析效能和利用率。 (2)一旦提取結束就不需要在保留任何與該程序相關的資料了,該程序從系統中刪除。
在之前五種狀態進行的活動模型,它的建立是因為在之前的I/O活動要比計算速度慢很多,所以記憶體中等待I/O的情況很常見,因此處理器大多時候是空閒的,即使是多道程式處理器仍然處於空閒狀態,記憶體保有大量的等待I/O程序,一種解決辦法是記憶體可以被擴充以適應更多的程序但是更大的記憶體往往導致的是更大的程序而不是更多的程序,另一種解決方案是交換,即將記憶體中被阻塞程序換到磁碟中進行掛起,暫時儲存從記憶體中被驅逐出來的程序佇列,用來交換需要處理機執行的程序使其能夠進入記憶體,這一步交換是一個I/O操作因為磁碟I/O是系統最快I/O所以交換會提升效能。 當執行一個換出操作後一般有倆種選擇(1)接納一個新程序。(2)調入一個被掛起的程序,但是一般會傾向於調入一個被掛起的而不是增加增加負載數,這時要考慮阻塞的特定事件。如果沒有就緒程序則至少一個阻塞程序被換出為另一個阻塞程序讓出空間,而且就緒掛起狀態的程序要比處於就緒態的任何程序都要高,調入高優先順序的程序比減少交換亮更重要,一般系統更願意掛起阻塞態,並且如果確定了高優先順序的阻塞態程序會很快就緒,那麼可能選擇掛起一個低優先順序的就緒態程序。 掛起這個概念與不在記憶體中的程序是等價的,不論是否等待一個事件都不立即執行,也就是說程序可能是或不是的等待一個事件,如果是阻塞條件不依賴於掛起條件不會使程序立即執行。可以通過代理把這個程序置於掛起狀態,掛起程序的活動都是由最初請求掛起的代理請求的,這個代理可以是程序自己也可以是父程序或作業系統。除非代理顯示的轉換程序否則程序無法從這個狀態中轉移。