天天看點

第三章 程序描述和控制

第三章 程序描述和控制

一、什麼是程序:

開發作業系統是為了給應用程式提供一個友善、安全和一緻的接口。

作業系統是計算機硬體和應用程式之間的一層軟體,對應用程式和工具提供支援。

目标:

資源對多個應用程式是可用的;

實體處理器在多個應用程式間切換以保障所有程式都在執行中;

處理器和IO裝置能得到充分利用。

所有現代作業系統采用的方法都是依據對應于一個或多個程序存在的應用程式執行的一種模型。

程序的幾種定義:

一個正在執行中的程式;

一個正在計算機上執行的程式執行個體;

能配置設定給處理器并由處理器執行的實體。

程序的兩個基本元素是程式代碼(可能被執行相同程式的其他程序共享)和代碼相關的資料集。

假設處理器開始執行這個程式代碼,且我們把這個執行實體稱為程序。

在執行程序時,程序可以唯一的表征為以下元素:

标示符,狀态,優先級,程式計數器,記憶體指針,上下文資料,IO狀态資訊,記賬資訊。

上述的清單資訊被存放在一個稱為程序控制塊的資料結構中,該控制塊由作業系統建立和管理。程序控制塊包含了充分的資訊,這樣就可以中斷一個程序的執行,并且在後來恢複執行程序時就好像程序未被中斷過一樣。

程序控制塊是作業系統能夠支援多程序和提供多重處理技術的關鍵工具。

當程序被中斷時,作業系統會把程式計數器和處理器寄存器(上下文資料)儲存到程序控制塊中的相應位置,程序狀态也被改變為其他的值,例如阻塞态或就緒态。

現代作業系統可以自由的把其他程序置為運作态,把其他程序的程式計數器和程序上下文資料加載到處理器寄存器中,這樣其他程序就可以開始執行。

可以說,程序 = 程式代碼 + 相關資料 + 程序控制塊

二、程序狀态:

對一個被執行的程式,作業系統會為該程式建立一個程序或任務。

從處理器的角度看,它在指令序列中按某種順序執行指令,這個順序根據程式計數器的寄存器中不斷變化的值來訓示,程式計數器可能指向不同程序中不同部分的程式代碼。

從程式自身角度看,它的執行涉及程式中的一系列指令。

1 兩狀态程序模型,

一個程序或者正在執行,或者沒有執行。

當作業系統建立一個新程序時,它将該程序以未運作态加入到系統中,作業系統指導這個程序是存在的,并且正在等待執行機會。目前正在運作的程序不時被中斷,作業系統中的分派器部分将選擇一個新的程序運作。

必須有一些與程序相關的資訊,包括程序在記憶體中的目前狀态和位置,及程序控制塊。未運作的程序必須保持在某種類型的隊列中,并等待他們的執行時機。分派器從隊列中選擇一個程序來執行。

2 程序的建立和終止,

程序的生存期圍繞着程序的建立和終止。

可能建立程序的事件:

在批處理環境中,作業送出時會建立程序;

在互動環境中,當一個新使用者試圖登陸時會建立程序。

作業系統會負責新程序的建立。

傳統的,作業系統建立程序的方式對使用者和應用程式都是透明的。但是,當作業系統為另一個程序顯式請求建立一個程序時,這個動作稱為程序派生。當一個程序派生另一個程序時,前一個稱為父程序,被派生的程序稱為子程序。在典型情況下,相關程序需要互相之間的通信合作。

3 五狀态模型

隊列是“先進先出”的表,對于可運作的程序,處理器以一種輪轉的方式操作(一次給隊列中的玫瑰程序一定的執行時間,然後程序傳回隊列。阻塞情況除外)。

兩狀态模型的局限性:

存在着一些處于非運作态但已經就緒等待執行的程序,同時存在另外一些處于阻塞狀态等待IO操作的程序。是以如果使用單個隊列,分派器應該掃描隊列,查找那些未被阻塞且在隊列中時間最長的程序。

将非運作狀态分為兩個狀态:就緒和阻塞。

運作态:該程序正在執行

就緒态:程序做好了準備,隻要有機會就開始執行

阻塞/等待态:程序在某些事件發生前不能執行,如IO操作完成

建立态:剛剛建立的程序,作業系統還沒有把它加入到可執行程序組中。通常是程序控制塊已經建立但還沒有價值到記憶體中的新程序

退出态:作業系統從可執行程序組中釋放出的程序,或者因為它自身停止了,或者因為某種原因被取消。

(建立态:作業系統可能基于性能或記憶體局限性的原因,限制系統中的程序數量。當程序處于建立态時,作業系統所需要的關于該程序的資訊儲存在記憶體的程序表中,但程序自身還未進入記憶體,就是即将執行的程式代碼不在記憶體中,也沒有為與這個程式相關的資料配置設定空間。當程序處于建立态時,程式保留在外存中,通常是磁盤中。)

如果程序請求它不等待的某些事件,則進入阻塞态。

排隊規則:有兩個對立,就緒隊列和阻塞隊列。

進入系統的每個程序被放置在就緒隊列中,當作業系統選擇另一個程序運作時,就将從就緒隊列中選擇。對于沒有優先級的方案,這可以使一個簡單的先進先出隊列。

當一個正在運作的程序被移出處理器時,它根據情況或者被終止,或者被防止在就緒或阻塞隊列中。

最後,當一個事件發生時,所有位于阻塞隊列中等待這個事件的程序都被轉換到就緒隊列中。

此外,擁有多個事件隊列會很有效。一個事件對應一個隊列。當事件發生時,相應隊列中的所有程序都轉換到就緒态。

4 被挂起的程序,

産生緣由:當一個程序正在等待時,處理器可以轉移到另一個程序,但是處理器比IO要快的多,以至于記憶體中所有的程序都在等待IO的情況很常見。

交換:包括把記憶體中某個程序的一部分或全部移到磁盤中。

交換是一個IO操作,當記憶體中的所有程序都處于阻塞态時,作業系統可以把其中的一個程序置于“挂起态”,并将它轉移到磁盤中,記憶體中釋放的空間可被調入的另一個程序使用。

當作業系統已經執行了一個換出操作後,它可以有兩種将一個程序取到記憶體中的選擇:可以接納一個新近建立的程序,或調入一個以前被挂起的程序。

兩個考慮:程序是否在等待一個事件(阻塞與否),程序是否已經被換出記憶體(挂起與否)

就緒态:程序在記憶體中并可以執行

阻塞态:程序在記憶體中并等待一個事件

阻塞/挂起态:程序在外存中并等待一個事件

就緒/挂起态:程序在外存中,但是隻要被載入記憶體就可以執行

在虛拟記憶體方案中,可能會執行到隻有一部分内容在記憶體中的程序,如果通路的程序位址不在記憶體中,則程序的相應部分可以被調入記憶體。虛拟記憶體的使用看上去會消除顯示交換的需要,這是因為通過處理器中的存儲管理硬體,任何期望的程序中的任何期望的位址都是可以移入或移出記憶體。

阻塞-》阻塞/挂起:如果沒有就緒程序,則至少一個阻塞程序被換出,為另一個沒有阻塞的程序讓出空間。通常,作業系統更傾向于挂起阻塞态的程序而不是就緒态程序。

一個不在記憶體中的程序,不論它是否在等待一個時間,都不能立即執行。

父程序可能會希望挂起一個後代程序。挂起程序的活動都是由最初請求挂起的代理 請求的。

三、程序描述:

3.1作業系統的控制結構

作業系統控制計算機系統内部的事件,它為處理器執行程序而進行排程和分派,給程序配置設定資源,并響應使用者程式的基本服務請求。是以,我們可以把作業系統視為管理系統資源的實體。

作業系統構造并維護它所管理的每個實體的資訊表。

作業系統維護着四種不同類型的表:記憶體,IO,檔案和程序。

記憶體表:記憶體的某些部分為作業系統保留,剩餘的部分是程序可以使用的,儲存在外存中的程序使用某種類型的虛拟記憶體或簡單的交換機制。

IO表:作業系統使用IO表管理計算機系統中的IO裝置和通道。在任何給定的時刻,一個IO裝置或者是可用的,或者是已配置設定給某個特定的程序。

檔案表:作業系統還維護着檔案表,這些表提供關于檔案是否存在。檔案在外存中的位置、目前狀态和其他屬性資訊。

程序表:作業系統為例管理程序必須維護程序表。記憶體、IO和檔案時代表程序而被管理的,是以程序表中必須有對這些資源的直接或間接引用。

3.2程序控制結構

作業系統在管理和控制程序時,首先必須知道程序的位置,然後它必須知道在管理時所必須的程序屬性(如程序ID、程序狀态)

程序的實體表示:程序最少必須包括一個或一組被執行的程式,與這些程式相關聯的是局部變量、全局變量和任何已定義常量的資料單元。

程序映像中的典型元素:

1)使用者資料:使用者空間中的可修改部分,可以包括程式資料、使用者棧區域和可修改的程式

2)使用者程式:将被執行的程式

3)系統棧:每個程序都有一個或多個後進先出(LIFO)系統棧,棧用于儲存參數、過程調用位址和系統調用位址

4)程序控制塊:作業系統控制程序所需要的資料(程序辨別資訊、程序狀态資訊、程序控制資訊)

當程序互相之間進行通信時,程序辨別符可用于通知作業系統某一特定通信的目标;當允許程序建立其他程序時,辨別符可用于緻命每個程序的父親程序和後代程序。

程序控制塊是作業系統中最重要的資料結構。每個程序控制塊包含作業系統所需要的關于程序的所有資訊。作業系統中的很多例程都需要通路程序控制塊中的資訊,直接通路這些表并不難,每個程序都有一個唯一的ID号,可用做程序控制塊指針表的索引。

四、程序控制:

4.1兩種執行模式

非特權态常稱為使用者态,這是因為使用者程式通常在該模式下運作

特權态可稱為系統态或核心态

使用兩種模式的原因是很顯然的,它可以保護作業系統和重要的作業系統表(如程序控制塊)不受使用者程式的幹涉。在核心态下,軟體具有對處理器及所有指令、寄存器和記憶體的控制能力

程式狀态字中有一位表示執行模式,這一位應某些事件的要求而改變。在典型情況下,當使用者調用一個作業系統服務或 中斷 觸發 系統例程 的執行時,執行模式被設定成核心态;當從系統服務傳回到使用者程序時,執行模式被設定為使用者态。

4.2程序建立

一旦作業系統基于某種原因建立一個新程序:

給新程序配置設定一個唯一的程序辨別符-》給程序配置設定空間-》初始化程序控制塊-》設定正确的連接配接-》建立或擴充其他資料結構

4.3程序切換

程序切換的功能:在某一時刻,一個正在運作的程序被中斷,作業系統指定另一個程序為運作态,并把控制權交給這個程序。

程序切換可以在作業系統從目前正在運作的程序中活動控制權的任何時刻發生。

作業系統中兩種類型的系統中斷:

1)中斷:與 目前正在運作的 程序無關的 某種類型的 外部事件相關(如完成一次IO操作)。控制首先轉移給中斷處理器,它做一些基本的輔助工作,然後轉移到與已經發生的特定類型的中斷相關的作業系統例程。

2)陷阱:與 目前正在運作的程序 所産生的錯誤或異常條件相關。作業系統确定錯誤或異常條件是否是緻命的。如果是,目前正在運作的程序被轉換到退出态,并發生程序切換;如果不是,作業系統的動作取決于錯誤種類和作業系統的設計(試圖恢複或通知使用者),作業系統 可能會進行一次程序切換或者繼續執行目前正在運作的程序。

模式切換與程序切換:發生模式切換可以不改變正處于運作态的程序狀态,在這種情況下,儲存上下文環境和以後恢複上下文環境隻需要很少的開銷。但是,如果目前正在運作的程序被轉換到另一個狀态(就緒,阻塞等),則作業系統必須使其環境産生實質性的變化。是以,程序切換涉及狀态變化,因而比模式切換需要做更多的工作。

五、作業系統的執行

作業系統與普通的計算機軟體以同樣的方式運作,也就是說,它也是由處理器執行的一個程式。作業系統經常釋放控制權,并且依賴于處理器恢複控制權。

5.1無程序核心

作業系統可以完成儲存程序環境的功能,并繼續排程和分派另一個程序。

其關鍵點是,程序的概念僅使用于使用者程式,作業系統代碼作為一個在特權模式下工作的獨立實體被執行。

5.2 在使用者程序中執行

常見的方法實際上是在使用者程序的上下文中執行幾乎所有作業系統軟體。

其觀點是,作業系統從根本上說是使用者調用的一組例程,在使用者程序環境中執行,用于實作各種功能。作業系統代碼和資料位于共享位址空間中,被所有的使用者程序共享。

當發生一個中斷、陷阱或系統調用時,處理器被至于核心态,控制權交給作業系統。為了将控制權從使用者程式轉交給作業系統,需要儲存模式想下午環境并進行模式切換,然後切換到一個作業系統例程,但此時仍然是在目前使用者程序中繼續執行。是以,不需要執行程序切換,僅在同一個程序中進行模式切換。如果作業系統完成其操作後,确定需要繼續運作目前程序,則進行一次模式切換,在目前程序中恢複被中斷的程式。如果确定需要發生程序切換二不是反話到先前執行的程式,則控制權被轉換給程序切換例程。

在使用者程序中執行的代碼是共享的作業系統代碼。基于使用者态和核心态的概念,及時作業系統例程在使用者程序環境中執行,使用者也不能篡改或幹涉作業系統例程。

在一個程序中,使用者程式和作業系統程式都有可能執行。而在不同使用者程序中執行的作業系統程式是相同的。

5.3 基于程序的作業系統

即把作業系統作為一組系統程序來實作。主要的核心函數被組織成獨立的程序,同樣,還可能有一些在任何程序之外執行的程式切換代碼。

把作業系統作為一組程序實作,在多處理器或多計算機環境中都是十分有用的,這時一些作業系統服務可以傳送到專用處理器中執行,以提高性能。

六、安全問題

作業系統對于每個程序都關聯了一套權限。這些權限規定了程序可以擷取哪些資源,包括記憶體區域、檔案和特權系統指令等。典型的是,一個程序的運作代表着一個使用者擁有作業系統認證的權限。

七、UNIX SVR4程序管理

UNIX區分記憶體中運作就緒态和被搶占态這兩個狀态。

隻有當程序準備從核心态移動到使用者态時才可能發生搶占,程序在核心态下運作時是不會被搶占的。

UNIX中有兩個獨特的程序。程序0是一個特殊的程序,是在系統啟動時建立的。實際上,這是預定義的一個資料結構,在啟動時刻被加載,是交換程序。此外程序0産生程序1,稱為出事程序,程序1是系統中所有其他程序的祖先。當新的互動使用者登陸到系統時,程序1為該使用者建立一個使用者程序。随後,使用者程序可以建立子程序,進而構成一棵分支樹。是以,任何程式都是由一組相關程序組成的。

程序描述:使用者級上下文,寄存器上下文,系統級上下文。

程序控制:UNIX中的程序建立時通過核心系統調用fork()實作的

八、總結:

現代作業系統中最基本的建構是程序,作業系統的基本功能是建立、管理和終止程序。當程序處于活躍狀态時,作業系統必須設法使美國程序都配置設定到處理器執行時間,并協調他們的活動,管理有沖突的請求,給程序配置設定系統資源。

為執行程序管理功能,作業系統維護着對每個程序的描述,或者成為程序映像,它包括執行程序的位址空間和一個程序控制塊。程序控制塊含有作業系統管理程序所需要的所有資訊,包括它的目前狀态、配置設定給它的資源、優先級及其他相關資料。

在整個生命周期中,程序總是在一些狀态之間轉換。最重要的狀态有就緒态、運作态和阻塞态。一個就緒态程序是指目前沒有執行但已做好執行準備的程序,隻要作業系統排程到它就可以立即執行;運作态程序是指目前正在被處理器執行的程序,在多處理器系統中,會有多個程序處于這種狀态;阻塞态程序正在等待某一事件的完成,如一次IO操作。

一個正在運作的程序可被一個在程序外發生且被處理器是被的中斷事件打斷,或者被執行作業系統的系統調用打斷。不論哪種情況,處理器都執行一次模式切換,把控制轉交給作業系統例程。作業系統在完成必須的操作後,可以恢複被中斷的程序或切換到别的程序。

課後練習:

一、 通常哪些事件會導緻建立一個程序?

1、 新作業的進入

2、 父程序由于某種原因開啟一個派生程序

3、 一個新的服務的啟動,作業系統因提供一項服務而建立。

4、 互動登陸,終端使用者登陸到系統。

二、搶占一個程序是什麼意思?

搶占就是優先級高的程序去搶占優先級低的且正在執行的程序的資源,導緻優先級低的正在運作态的程序被迫阻塞(終端)。通俗的講就是一個程序正處在運作态執行,此時一個比他優先級高的程序啟動,正處于運作态的程序被阻塞,優先級高的程序執行。

比如:B程序正在運作,而另一個具有更高優先級的A程序處于阻塞态,當處于阻塞态的程序A由于某個事件的觸發而轉換為就緒态,由于A優先級大于B,是以,此時中斷程序B,将處理器分派給程序A。

三、 什麼是交換,目的是什麼?

交換:就是将記憶體中的程序換到外存中的“挂起隊列”。

其目的是為了讓記憶體有更多的可運作空間,加快執行速度。

四、 挂起程序的四個特點。

1、 處于外存。從記憶體中被換出。

2、 不能自啟動,除非有外部事件的觸發。

3、 程序不能立即執行

4、 程序可能是或不是正在等待一個事件

5、 為阻止程序執行,可以通過代理把這個程序置于挂起狀态,代理可以是自己,也可以是父程序或作業系統

6、 除非代理顯示地指令系統進行狀态轉換,否則程序無法從這個狀态中轉移

五、 對于哪類實體,作業系統為了管理它而維護其資訊表?

1、 程序表(程序)

2、 記憶體表(記憶體使用情況、虛拟記憶體配置設定)

3、 裝置(I/O表,I/O使用情況)

4、 檔案()

六、 程序控制塊中的三類資訊

程序控制塊:程序屬性的集合。

而程式、資料、棧和屬性的集合稱做程序映像。

作用:包含作業系統所需要的關于程序的所有資訊。

程序:一段運作的程式和維持它運作所需要的資料集。

1、 程序ID,表示目前程序的身份(1、程序辨別資訊(程序辨別符、使用者辨別符、建立該程序的辨別符))

2、 程序存儲空間,目前程序需要執行所需要的記憶體空間()

3、 CPU狀态(2、CPU狀态資訊(使用者可見寄存器、控制和狀态寄存器以及棧指針的資訊))和程序控制資訊(3、程序控制資訊(排程和狀态資訊、程序通信、程序特權和存儲管理等資訊))

4、 程式實體

七、 為什麼需要兩種CPU執行模式

針對記憶體保護,是以某些機器指令(特權指令)隻能由作業系統執行,比如I/O指令就屬于特權指令。

CPU的兩種模式是指**使用者态(非特權态)和核心态(特權态)。

使用兩種模式是為了提高程式的執行效率和資訊安全,利用兩種模式的優點并克服兩種模式各自的缺點。(保護作業系統和重要的作業系統表(比如PCB表)不受使用者程式的幹涉。在核心态下,軟體具有對處理器以及所有指令、寄存器和記憶體的控制能力。)

什麼時候CPU處于核心模式呢?

當使用者調用一個作業系統服務或中斷觸發例程的執行時,執行模式被設定成核心模式;

當從系統服務傳回到使用者程序時,執行模式被設定為使用者态。(這點對Windows或者UNIX都是同樣的)

八、 建立一個新程序所執行的步驟。

1、 配置設定程序ID

2、 配置設定記憶體空間

3、 初始化程序控制塊

4、 設定正确的連接配接,将程序加入就需隊列連結清單中

5、 建立或擴充其他資料結構

九、 中斷和陷阱的差別

中斷是由于外部的事件觸發,而陷阱是由于自身的程式運作故障所導緻的中斷。

十一、中斷的例子

(I/O中斷,記憶體溢出(記憶體失效),時鐘中斷(時間片到))

十二、模式切換和程序切換的差別。

模式切換:是指同一個程序中使用者态與核心态的切換。因為他們共享記憶體,是以不涉及資源的重新配置設定,是以模式切換效率更高。并且不改變正在運作的程序的狀态,在這種情況下,儲存上下文環境和以後恢複上下文環境隻需很少的開銷。

程序切換:由于不同程序之間不同狀态的切換,需要重新配置設定各種資源,作業系統必須使其環境産生實質性的變化。

十三、Windows作業系統核心與UNIX作業系統的執行比較

在Windows中,作業系統的執行是被當做一組系統程序來實作的。當發生中斷、陷阱或系統調用時,CPU轉到核心态執行,但由于作業系統是作為一組系統程序實作的,是以需進行程序切換。Windows作業系統是基于程序的作業系統。

而在UNIX中,作業系統是融合在使用者程序的上下文中被執行的。當發生一個中斷、陷阱或系統調用時,處理器被置于核心态,控制權轉交給作業系統,為了将控制從使用者程序轉交給作業系統,需要儲存模式上下文環境并進行模式切換,然後切換到一個作業系統例程,但此時仍然是在目前使用者程序中繼續執行。UNIX是基于使用者程序的作業系統。

UNIX使用兩類程序,系統程序和使用者程序,系統程序處于核心态運作,使用者程序處于使用者态執行,當發生中斷、異常或使用者程序發出系統調用時,使用者程序可進入核心态。

繼續閱讀