我的操作系統復習——處理機調度


  前兩篇博客都是在講操作系統進程,包括進程狀態、PCB、進程同步、通信、線程等——我的操作系統復習——進程(上) 和 我的操作系統復習——進程(下),本篇開始講處理器調度,包括處理機調度算法、死鎖等。 

一、處理機調度的類型

處理機調度程序按照某種算法將處理機分配給某個進程,這就叫處理機調度。總體而言,按層次分,有三種類型:

(1)作業調度(又稱高級調度、長程調度)。

  作業調度的本質就是根據某種算法,把外存上的作業調入內存,並為之創建進程,分配處理機並執行。這里有兩個概念:

  1)作業(Job)

  在操作系統概述中,我們了解過操作系統的發展歷程,在單道批處理系統和多道批處理系統中粗略了解過作業的概念。作業是一個比程序更廣泛的概念,可以包含多個程序和數據,還包含一份作業說明書,處理機根據作業說明書來對作業中的程序進行控制。一般而言,批處理系統中才會有高級調度。

  2)作業步(Job Step)

  作業步的本質就是程序。作業運行過程中的每一個步驟可以稱為一個作業步。典型的作業可分為三個作業步:編譯作業步->連續裝配作業步->運行作業步。相當於我們的程序代碼的整個執行步驟。

 

(2)進程調度(又稱低級調度、短程調度)。

  進程調度的本質就是根據某種算法,把處理機分配給進程。進程調度首先會保存處理機現場。將程序計數器等指定寄存器中的內容保存到PCB中。然后將按照某種算法從就緒隊列中選取進程,把處理機分配給進程。最后,把指定進程的PCB中的處理機現場信息恢復到處理機中,處理機分配給進程執行。這里需要額外的了解一下進程調度中的三個基本機制和兩種調度方式:

  1)進程調度中的三個基本機制

  • 排隊器。將所有的就緒進程按照一定方式 (如優先級)排成一個隊列,以便調度程序找到。
  • 分派器。把從就緒隊列中取出的進程,處理機上下文切換后,把處理機分配給該進程執行。
  • 上下文切換機制。

  (PS:這里有一個額外的知識:通常每一次上下文切換需要花費幾毫秒的時間。有一種簡單的方式,通過多組寄存器來減少上下文切換的時間。一組寄存器供處理機在系統態使用,一組供處理機在應用程序狀態時使用。這樣,上下文切換的時候只需要改變指針,指向當前的寄存器。)

  (PSS:CPU的系統態就是CPU在執行操作系統,用戶態則是CPU在執行普通應用程序。)

  2)進程調度的兩種調度方式

  • 非搶占式(Nonpreemptive Mode)。說白了就是一旦把進程分配給某個進程,除非它自願退出,它將永遠運行下去。
  • 搶占式(Preemptive Mode)。說白了就是可以根據某種條件,使正在運行的進程暫停,將處理機分配給另一個進程。相當於信號量機制中的條件變量。

 

(3)中級調度

  中級調度的本質就是讓暫時不能運行的進程掛起,釋放內存資源,並把它們調到外存上去等待。什么是外存?外存就是硬盤、磁盤等存儲設備。

 

二、調度算法

說到調度算法,那么有幾個衡量進程運行效率的名詞需要了解一下,在做題的時候需要用到:

  • 服務時間:進程總共需要占用處理機的時間長度。
  • 開始執行時間:進程開始執行的時間點。
  • 完成時間:進程執行完畢的時間點。
  • 周轉時間:完成時間-到達時間。
  • 帶權周轉時間:周轉時間/服務時間。
  • 到達時間:進程進入就緒隊列的時間點

(1)先來先服務調度算法(FCFS)。

  顧名思義。就是先來的先進入內存或占用處理機。對於作業調度,就是從后備作業隊列中選擇一個或多個最先進入隊列的作業,將其調入內存。對於進程調度就是從就緒隊列選擇最新進入的進程,為之分配處理機。

 

(2)短作業(進程)優先調度算法(SJ(P)F)

  顧名思義。就是在選擇作業或進程的時候,先估算每個作業、進程的服務時間,選擇其中最短的優先獲得處理機。

 

(3)高優先權優先調度算法。

  這種算法給進程加了一個屬性,那就是優先權。這個算法的本質就是,高優先權的優先調用。優先權有兩種類型,一種是靜態的,即每個進程、作業的優先權在它創建的時候就已經確定,此后都不能改變。另一種是動態的,即進程、作業的優先權是可以改變的。最常見的做法就是進程、作業在等待中,優先權以一定速率隨時間增長,這樣等待時間越長,被調用的可能性就越大。

 

(4)基於時間片的輪轉調度法。

  這就是分時系統中采用的調度算法。原理就是把所有的就緒隊列進程按先來先服務的原則排成隊列。每次都把CPU分配給隊首,讓其執行一個時間片,執行完畢,調度器中斷進程,並把該進程移至就緒隊列的隊尾,然后再取一個隊首進程,繼續執行下一個時間片。時間片是什么,就是一段很短的CPU時間,幾毫秒到幾百毫秒不等。

 

(5)多級反饋隊列調度算法。

  這是當下公認的比較好的,使用最廣泛的調度算法。其原理也不難。例如,某計算機采用多級反饋隊列調度算法,設置了5個就緒隊列。第一個就緒隊列優先級最高,時間片為2ms。第二個就緒隊列優先級第二,時間片為4ms,其余隊列也一樣,優先級依次遞減,時間片依次增加。如果某個進程進入就緒隊列,首先把它放在第一個就緒隊列的末尾,輪到它執行就執行2ms,時間片結束,若該進程還沒有執行完畢,就把該進程移入第二個就緒隊列的末尾。只有當第一個隊列的進程都執行完時間片,才會執行第二個隊列。如此依次執行,若該進程服務時間很長,將被移到最后一個就緒隊列。在最后一個就緒隊列,進程將按照時間片輪轉調度法執行。處理機執行過程中,只有當優先級高的隊列中的線程都執行完畢,才會執行優先級低的隊列。如圖所示(懶得自己畫一遍了,直接從書上拿過來):

 

三、死鎖

何謂死鎖?即多個進程在運行過程中因爭奪資源造成的一種僵局。

(1)、產生死鎖的必要原因:

  1)互斥條件。即一段時間內,某資源只能由一個進程占用。這段時間,其他的進程只能等待。

  2)請求和保持條件。進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。

      3)不剝奪條件。進程已獲得的資源,在未使用完之前,不能被剝奪

  4)環路等待條件。

 

  

 參考:《計算機操作系統(湯子瀛)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM