作業系統(3)程式及其實現

笨蛋糕發表於2014-03-02

1、引入程式的目的:

1)刻畫系統的動態性,發揮系統的併發性。

2)解決共享性,正確地描述程式的執行狀態。

2、可再入程式:指能夠被多個程式同時呼叫的程式。是純程式碼,在執行過程中不被修改,呼叫它的各應用程式提供工作區。編譯程式通常是“可再入”程式,可同時編譯若干源程式。

可再用程式:在被呼叫過程中可以自身修改,在呼叫它的程式退出之前是不允許其他程式來呼叫的。

3、程式:

是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和保護的基本單位。擁有結構性,共享性,動態性,獨立性,制約性,併發性。

三態模型:

1)執行態:程式佔用處理器執行的狀態。

2)就緒態:程式具備執行條件,等待系統分配處理器以便其執行的狀態。

3)等待態:又稱阻塞態或睡眠態,指程式不具備執行條件,正在等待某個事件完成。

注意:處於執行態的程式個數不能大於處理器的個數,處於就緒態和等待態的程式可以有多個。

4、建立程式需要兩個步驟:

首先為新程式分配所需資源,建立必要的管理資訊,然後,設定此程式為就緒態,等待被排程執行。

類似的,程式終止:

首先,等待作業系統或相關程式進行善後處理(如抽取資訊),然後,回收被佔用的資源並由系統刪除程式。處於終止態的程式不再被排程執行,下一步將被系統撤銷,最終從系統中消失。

5、掛起程式:

等同於不在主存的程式,因此,掛起程式不會參與低階排程知道它們被對換進主存。掛起程式具有以下特徵:

此程式不能被立即執行。此程式可能會等待某事件發生,所等待的事件獨立於掛起條件,事件結束並不能導致程式具備可執行條件。此程式進入掛起狀態是由於作業系統、父程式或程式自身組織其執行。程式掛起狀態的結束命令只能通過作業系統或父程式發出。

6、程式映像:某時刻程式的內容及其狀態集合。包括以下要素:

1)程式控制塊PCB:每個程式捆綁一個控制塊,用來儲存程式的標誌資訊、現場資訊和控制資訊。程式建立時建立控制塊,程式撤銷時回收其,它與程式一一對應。

2)程式程式塊:是被執行的程式,規定程式的一次執行所應完成的功能。

3)程式核心棧:程式在核心態工作時使用,用來儲存中斷/異常現場,儲存函式呼叫的引數和返回地址,等等。

4)程式資料塊:是程式的私有地址空間,存放各種私有資料,使用者棧也要在資料塊中開闢,用於在函式呼叫時存放棧幀、區域性變數等引數。

7、程式上下文:程式物理實體和支援程式執行的環境的合稱。由三部分組成:

1)使用者級上下文:由正文(程式)、資料、共享儲存區、使用者棧鎖組成,它們佔用程式的虛擬地址空間。

2)暫存器上下文:由程式狀態字暫存器、指令暫存器、棧指標、控制暫存器、通用暫存器組成。

3)系統級上下文:由程式控制塊、主存管理資訊(頁表或段表)、核心棧組成。

8、程式佇列及其管理:

把處於同一狀態的所有程式的PCB連結在一起的資料結構稱為佇列。有三種通用的佇列組織方式:

1)線性方式:作業系統根據系統內程式的最大數目,靜態的分配主存中的某塊空間,所有程式的PCB都組織在一個線性表中。

2)連結方式:對於同一狀態程式的PCB,通過PCB中的連結指標將其連結成佇列,可以採用單向或雙向連結串列。

3)索引方式:利用索引表記錄不同狀態程式的PCB地址,系統建立若干索引表,如就緒索引表、等待索引表、空閒索引表等。

注意:為了標誌和識別佇列,系統為每個佇列均設定佇列標誌,存放於核心空間中。不同狀態的程式可以排成不同的佇列,如執行佇列、就緒佇列和等待佇列。

9、程式上下文切換:程式切換必定在核心態而非使用者態發生。

核心在下列情況下會發生上下文切換:

1)當程式因各種原因進入等待態時。

2)當程式完成其系統呼叫返回使用者態,但尚無資格獲得CPU時。

3)當核心完成中斷處理,程式返回使用者態但尚無資格獲得CPU時。

4)當程式執行的時間片到時或程式結束時。

10、程式切換的實現步驟如下:

1)儲存被中斷程式的處理器現場資訊。

2)修改被中斷程式PCB的有關資訊,如程式狀態等。

3)把被中斷程式的PCB加入相關佇列。

4)選擇佔用處理器執行的另一個程式。

5)修改被選中程式PCB的有關資訊,如改為就緒態。

6)設定被選中程式的地址空間,恢復儲存管理資訊。

7)根據被選中程式的上下文資訊來恢復處理器現場。

11、處理器模式切換:模式切換不同於程式切換,它不一定會引起程式狀態的轉換。

注意:使用者空間和核心空間的資料不能互訪,在應用程式執行系統呼叫的過程中,如果有需要,可通過核心函式copy_from_user( )和copy_to_user( )將資料在使用者空間和核心空間中進行復制。

12、原語:

在核心態執行,是完成系統特定功能的不可分隔的過程,它具有原子操作性,其程式段不允許被中斷,或者說原語不能併發執行。原語的實現方法之一是以系統呼叫的方式提供原語介面,採用遮蔽中斷的方式來實現。

13、程式的建立源於以下事件:

1)提交批作業處理。2)有互動式作業登入終端。3)作業系統建立服務程式。4)已存在的程式建立新程式。

程式的建立過程如下:

1)在程式列表中增加一項,從PCB池中申請一個空閒PCB,為新程式分配唯一的程式識別符號。

2)為新程式的程式映像分配地址空間,以便容納程式實體。由程式管理程式確定載入至程式地址空間中的程式。

3)為新程式分配除主存空間以外的其他各種資源。

4)初始化PCB,如程式識別符號、處理器初始狀態、程式優先順序等。

5)把新程式的狀態設定為就緒態,並將其移入就緒程式佇列。

6)通知作業系統的某些模組,如記賬程式、效能監控程式。

在windows中,使用Win32 API的CreateProcess( )函式建立程式,返回一個程式控制程式碼。

14、程式阻塞和喚醒:

阻塞是指使程式讓出處理器,轉而等待一個事件,如等待資源。等待I/O操作完成、等待某事件發生等。程式通常自呼叫阻塞原語來阻塞自己,所以阻塞是程式的自主行為,是一個同步事件。

15、程式掛起和啟用:

當出現引起掛起事件時,檢查要被掛起程式的狀態,若處於活動就緒態,就修改為掛起就緒態;若處於等待態,就修改為掛起等待態,被掛起程式PCB的非常駐部分要交換到磁碟對換區。

注意:掛起原語既可以由程式自己也可以由其他程式呼叫,但是啟用原語只能由其他程式呼叫。







相關文章