1. 程式人生 > >內功修煉之作業系統學習(二:處理器管理)

內功修煉之作業系統學習(二:處理器管理)

                                   處理器管理

處理器管理是作業系統的重要組成部分,它負責排程、管理和分配處理器並控制程式的執行。處理器管理中最重要的是處理器排程,即程序排程,也就是控制、協調程序對處理器的競爭。為了提高併發粒度和降低併發開銷,現代作業系統引進了執行緒的概念,此時程序仍然是資源分配和保護的單位。

處理器包括控制器、運算器和暫存器。如果計算機系統只有一個運算器則被稱為單處理器,如果包含多個則被稱為多處理器。也就是說運算器的個數決定是單處理器還是多處理器。

暫存器所儲存器的資訊構成處理器現場。它與程式的執行密切相關。

處理器狀態可以表明當前cpu是執行核心程式還是執行使用者應用程式。處理器狀態又稱為處理器模式,可劃分為核心態(管態)和使用者態(目態)。當處理器處於核心態時,

cpu執行可信軟體,硬體允許執行全部機器指令。當處理器處於使用者態時,cpu執行非可信軟體,程式無法執行特權指令,且訪問許可權僅限於當前cpu上程序的地址空間。Intel x86處理器的狀態有四種。0級為核心級,3級為應用程式級。但執行在此處理器上的windows作業系統只使用0級和3級。

    有兩種情況會導致處理器模式切換。一是程式請求作業系統服務,執行系統呼叫。二是在程式執行時,產生中斷或異常事件,執行程式被中斷,轉向中斷處理程式。這兩種情況都是通過中斷機制發生,可以說中斷和異常是使用者態到核心態轉換的唯一途徑。

    當系統產生中斷或異常,處理器將作出響應並交換程式狀態字,此時處理器會從使用者態到核心態轉換。處理完成後計算機通過載入程式狀態字的特權指令來實現從核心態返回使用者態。

    中斷是指在 程式執行過程中,遇到急需要處理的事件時,暫時中止現行程式在cpu上的執行,轉而執行相應的事件處理程式,處理完成後再返回斷點或排程其他程式。它是現在帶計算機系統的重要組成部分之一。每當應用程式執行系統呼叫要求獲得作業系統服務等都要通過中斷機制產生中斷訊號並啟動核心工作。可以說作業系統是由中斷驅動的。

    Cpu會在執行在兩條指令之間檢查有無中斷髮生。

    自願性中斷事件時正在執行的程式所期待的,是由於執行訪管指令而引起的,它表示執行的程式對作業系統的有某種需求,一旦機器執行訪管指令,就會使cpu狀態從使用者態轉向核心態,停止現行程式的執行而轉入核心的相應系統呼叫例程進行處理。這被稱為訪管中斷。

    硬中斷分為外中斷和內中斷。外中斷,又稱中斷,是指來自處理器之外的中斷訊號。包括時鐘中斷、鍵盤中斷、裝置中斷等。內中斷又稱為異常。是指來自cpu內部的中斷訊號。又分為三種:訪管中斷,由系統呼叫引起。硬體故障中斷,如電源失效,奇偶校驗錯誤,匯流排超時等;程式性中斷,如非法操作,地址越界,頁面故障,除數為0,浮點數溢位。所有這些異常均有異常處理程式處理,且不能被遮蔽。

    中斷和異常的區別:中斷是由於當前程式無關的中斷訊號觸發的,cpu對中斷的響應是被動的,且與cpu模式無關。既可以發生在使用者態,又可以發生在核心態。通常在發生兩條機器指令之間才響應中斷。通常在兩條機器指令之間才能響應中斷。異常是由cpu控制單元產生的,源於現行程式執行指令過程中檢測到例外。大部分異常發生在使用者態。異常處理程式所提供的服務通常是當前程序所需要的。如程式出錯或頁面故障。異常處理程式在當前程式的上下文執行。

    Cpu對異常和中斷的響應是一致的。即當執行完當前指令後,或在執行當前指令的中途,根據中斷源所提供的中斷向量,在主存中找到響應服務程式的入口地址並呼叫此服務。中斷向量由硬體或作業系統的核心預先分配和設定。系統呼叫所對應的向量在訪管指令中給出。中斷和異常以統一的模式加以實現,這也是許多書中將它們都歸入中斷機制的原因。

    在兩條指令中間,cpu會檢查中斷暫存器是否有中斷事件發生,若無中斷訊號或中斷訊號被遮蔽,則繼續執行後續指令。否則將暫停當前程式,轉向核心的中斷處理程式。

    中斷和異常的響應需要做四件事:1,發現中斷源;2,保護現場;3,轉向中斷/異常處理程式。4,恢復現場。

    訪管中斷是由程式執行訪管指令而引起的,表示當前執行的程式對作業系統功能的呼叫。它包括操作碼和訪管引數兩部分。前者表示此指令是訪管指令,後者表示具體的訪管要求。當程式發出訪管請求時,cpu控制裝置發出中斷向量,然後指定系統呼叫號,表示想要呼叫的系統呼叫。

    時鐘是作業系統進行呼叫工作的重要工具,如維護系統絕對日期和時間,讓分時程序按時間片輪轉,讓實時程序定時傳送或接收控制訊號,系統定時喚醒或阻塞程序。利用定時器能夠確保作業系統必要時獲得控制權,使陷入死迴圈的程序最終會因為時間片耗盡而被迫讓出處理器。時鐘通常是一個硬體,它按照固定週期發出中斷請求,分為絕對時鐘和間隔時鐘。系統設定一個絕對時鐘暫存器,定時的把此暫存器的內容加一。間隔時鐘在每個時間切換點將間隔時鐘暫存器的內容減一。當減為0時,就產生間隔時鐘中斷。作業系統經常利用間隔時鐘進行排程

   發生中斷的每個裝置都有一個相應的中斷處理程式。一個裝置的中斷處理程式是它裝置驅動程式的一部分。中斷處理程式是被核心呼叫來響應中斷的,工作在核心態的中斷上下文中,不允許被阻塞。

Windows2003陷阱排程。陷阱排程設施是用來處理意外事件的硬體機制,當中斷或異常發生時硬體或軟體可以捕獲它們,暫停當前執行緒的執行,讓處理器從使用者態切換到核心態,並將控制權交給核心陷阱排程程式,陷阱排程程式將檢測中斷和異常的型別並進行排程,將控制權交給相應的程式碼。陷阱排程程式本身可以處理一些異常,但大多數情況下只判斷和確定所發生的情況,並把控制權轉交給核心的其他部分或執行體。如果是裝置中斷事件,將把控制權轉交給裝置驅動程式的中斷服務例程。如果是系統呼叫服務事件,將把控制權轉交給執行體中的系統服務程式碼。其他異常事件由核心自身的異常排程器傳送並由相應的處理程式進行處理。

異常是由執行程式的執行產生的,它是由核心的異常排程器提供服務,其任務是找到能夠處理此異常的異常處理程式,核心所定義的異常有:主存訪問越界,被0除,整數溢位,浮點異常和除錯程式斷點。Win32引入異常處理工具,允許應用程式在發生異常時能夠得到控制,應用程式可將這個狀態固定並返回至異常發生的地方展開堆疊,也可以向系統宣告不識別此異常。

核心俘獲和處理對應用程式透明的某些異常,如程式除錯斷點異常,此時核心將呼叫除錯程式來處理此異常。對於主存越界或算術溢位等異常,核心會原封不動的返回使用者態程式來處理。作業系統建立基於棧幀的異常處理器來處理異常。當過程被呼叫時代表此過程啟用的堆疊幀會被推入堆疊。堆疊幀可以有一個或多個與其相關的異常處理程式,每個處理程式都儲存在源程式的一個特定程式碼塊內。當異常發生時,核心將查詢與當前堆疊幀相關的異常處理程式。如果不存在,核心將繼續查詢與前一個堆疊幀相關的異常處理程式,如此往復,如果還找不到,核心將呼叫系統預設的異常處理程式。

陷阱排程可以呼叫系統服務,執行INT 2E指令引起一個系統陷阱,從使用者態切換到核心態,進入系統服務排程器,被傳遞的引數指明被請求的系統服務號。核心將根據引數在系統呼叫服務排程表中查詢響應的系統服務程式。

程序

所有多道程式設計都是建立在程序的基礎上的。程序是為了刻畫系統內部的動態狀況、描述執行程式的活動規律而引進的概念。從理論角度看,程序是對當前執行程式的活動規律的抽象。從實現角度看,程序是一種資料結構,用來刻畫系統動態變化的內在規律,有效地管理和排程在計算機系統執行的程式。

程序是程式在資料集合上的一次執行過程。它由建立而產生,由排程而執行,由事件而等待,由撤銷而消亡。

程序由程式塊、資料塊、程序核心棧和程序控制塊組成。由三種狀態:執行態,佔用處理器執行的狀態。就緒態:具備執行條件,等待系統分配處理器。等待態:又稱阻塞態,是指程序不具備執行條件,正在等待某個事件完成。

處於執行態的程序個數不能大於處理器個數。而處於就緒態和等待態的程序可以有多個。通常在建立後就處於就緒態。Cpu排程程式永遠在就緒佇列選取程序,所以所有程序只能從就緒態轉到執行態,而不能從等待態轉到執行態。

在很多系統中增加了新建態和終止態。新建態對應於程序被建立的狀態,尚未進入就緒佇列。終止態,指程序完成任務,到達正常結束點。

主存資源是有限的,有時主存資源不能滿足程序執行的要求,此時必須把某些程序掛起,置於磁碟對換區中,釋放其佔用的某些資源,暫時不參加低階排程。使用者在除錯程式時,可以請求掛起某程序,以便進行某種檢查或修改。為此又新增兩個狀態:掛起就緒態,表明具備執行條件,但目前在輔存中。掛起等待態,表明程序正在等待某一事件發生且程序在輔助儲存器中。

掛起程序等同於不在主存的程序,不會參與低階排程。不能立即執行,可能會等待某個事件發生。

程式和資料描述程序的靜態特徵,程序控制塊刻畫程序的動態特徵。程序控制塊用於儲存程序的標識資訊、現場資訊和控制資訊。它與程序一一對應。是作業系統掌握程序的唯一資料和管理程序的主要依據。

程序控制塊儲存程序的標識資訊,如程序號、儲存cpu現場,用於恢復執行時恢復處理器現場。同時還儲存用於管理和排程程序的控制資訊,包括:一程序排程資訊,如程序狀態、等待時間和等待原因、程序優先順序、佇列指標等。二程序組成資訊,如正文段指標,資料段指標,指向父子程序的資訊。三程序間通訊資訊,如訊息佇列指標、所使用的訊號量和鎖。四cpu佔用和使用資訊,如時間片剩餘、已佔用時間。五資源清單,如程序所需的全部資源、已經分得的資源,如主存、裝置、開啟檔案表等。六程序特權資訊,如主存訪問許可權和處理器特權。

程序映像還包括程序核心棧,用於當程序在核心態工作(系統呼叫等)時使用,用來儲存中斷/異常現場,儲存函式呼叫的引數和返回地址等。

Pcb(process control block)是作業系統最重要的資料結構,包含管理程序所需要的全部資訊,只有核心可以修改pcb。作業系統根據pcb對併發執行的程序進行管理,程序藉助於pcb才能被排程執行。

程序佇列:把處於同一狀態的所有程序的pcb連線在一起的資料結構。如執行佇列,就緒佇列和等待佇列。組織方式有:線性方式,連線方式和索引方式。執行佇列中通常只有一個程序,就緒佇列中可按照優先順序或FIFO原則排隊,也可以按照程序優先順序的高低分成多個就緒佇列。等待佇列通常有多個,對應不同的等待佇列。

當發生某個事件使程序的狀態發生轉換時,程序就要退出所在佇列而排入另一個佇列。處理器排程中負責程序入隊和岀對的功能模組成為佇列管理模組。

中斷和異常是啟用作業系統的僅有方法,它暫停當前程序的執行,把處理器切換至核心態,核心獲得cpu的控制權後,如果需要就可以實現程序切換,程序切換必定發生在核心態而非使用者態。當發生程序切換時,暫存器上下文會被儲存到系統級上下文(包括程序控制塊、主存管理資訊、核心棧等)的相應的現場資訊位置,然後核心把這些資訊壓入核心棧的一個上下文層,當核心處理完中斷返回或程序完成其系統呼叫返回使用者態,核心進行上下文切換並從核心棧彈出一個上下文層。

程序上下文切換步驟:

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

2,修改被中斷程序的pcb有關資訊,如程序狀態等。

3,把被中斷程序的pcb加入相關佇列。

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

5,修改被選中程序pcb有關資訊,如改為就緒態。

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

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

處理器模式切換步驟:

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

2,處理器從使用者態切換到核心態,以便執行系統服務程式或中斷處理程式。

3,如果處理中斷,可根據所規定的中斷級別設定中斷遮蔽位。

4,根據系統呼叫號或中斷號,從系統呼叫表或中斷入口地址表中找到系統服務程式或中斷處理程式的地址。

模式切換不同於程序切換,它不一定引起程序狀態的切換,也不一定引起程序切換。

在引用程序之後又引入了執行緒的概念,是為了減少程式併發執行時所付出的時空開銷,使併發粒度更細、併發度更好。基本思路是:把程序的兩項功能:獨立分配資源和被排程分派執行分離開來。前一項任務仍然由程序完成,作為系統資源分配和保護的獨立單位,無需頻繁切換。後一項任務交給成為執行緒的實體來完成,執行緒作為系統呼叫和分派的基本單位。

執行緒的組成部分有:

1,執行緒識別符號及執行緒狀態資訊。

2,執行緒上下文資訊。

3,核心棧,在核心態工作時儲存引數,在函式呼叫時的返回地址。

4,擁有存放區域性變數和使用者站的私有儲存區。

執行緒有執行、就緒和等待狀態。因為它不擁有資源,因此掛起狀態對於程序是沒有意義的。如果程序在掛起後被對換出主存,它的所有執行緒也必須被對換出去。如果程序內的某一執行緒需要等待某資源,如果程序內還存在其他處於就緒態的執行緒執行,作業系統就會排程此執行緒執行,否則將程序轉換為等待態。Windows僅把程序分為執行態和不可執行態。

處理器排程分為三級:

高階排程,又稱作業排程,按照預定的策略從一批作業中挑選一批作業進入主存,建立程序併為其分配所需資源。

中級排程:根據主存資源決定主存中所能容納的程序數目,並根據程序的當前狀態來決定輔助儲存器和主存中的程序的對換。

低階排程:又稱程序/執行緒排程,根據某種原則決定就緒佇列中的哪個執行緒獲得處理器,並將處理器讓出給其使用。低階排程是作業系統最核心的部分,其排程策略的優劣將直接影響整個系統的效能。有兩種排程方式:剝奪時和非剝奪式。核心關鍵程式是非剝奪式的,使用者程序是剝奪式的。

低階排程是所有作業系統必備的功能。

作業是使用者提交給作業系統計算的一個獨立的任務。

作業與程序的關係:作業是任務實體,程序是完成任務的執行實體。沒有作業任務,程序無事可做,沒有程序,作業任務無法完成。

cpu利用率=cpu有效工作時間/cpu總的工作時間。

吞吐率=單位時間cpu處理作業的個數。

週轉時間:向系統提交作業開始到作業完成為止。

低階排程演算法(大部分也適用於作業排程演算法):

1,先來先服務演算法。(FCFS)

2,最短作業優先演算法(SJF)

3,最短剩餘時間優先演算法(SRTF)

4,響應比最高優先演算法(H RRF) 響應比=作業週轉時間/作業處理時間。

5,優先順序排程演算法。

6,輪轉排程演算法(Round Robin)