前兩篇博客都是在講操做系統進程,包括進程狀態、PCB、進程同步、通訊、線程等——個人操做系統複習——進程(上) 和 個人操做系統複習——進程(下),本篇開始講處理器調度,包括處理機調度算法、死鎖等。 html
處理機調度程序按照某種算法將處理機分配給某個進程,這就叫處理機調度。整體而言,按層次分,有三種類型:算法
做業調度的本質就是根據某種算法,把外存上的做業調入內存,併爲之建立進程,分配處理機並執行。這裏有兩個概念:spa
1)做業(Job)操作系統
在操做系統概述中,咱們瞭解過操做系統的發展歷程,在單道批處理系統和多道批處理系統中粗略瞭解過做業的概念。做業是一個比程序更普遍的概念,能夠包含多個程序和數據,還包含一份做業說明書,處理機根據做業說明書來對做業中的程序進行控制。通常而言,批處理系統中才會有高級調度。線程
2)做業步(Job Step)指針
做業步的本質就是程序。做業運行過程當中的每個步驟能夠稱爲一個做業步。典型的做業可分爲三個做業步:編譯做業步->連續裝配做業步->運行做業步。至關於咱們的程序代碼的整個執行步驟。htm
進程調度的本質就是根據某種算法,把處理機分配給進程。進程調度首先會保存處理機現場。將程序計數器等指定寄存器中的內容保存到PCB中。而後將按照某種算法從就緒隊列中選取進程,把處理機分配給進程。最後,把指定進程的PCB中的處理機現場信息恢復處處理機中,處理機分配給進程執行。這裏須要額外的瞭解一下進程調度中的三個基本機制和兩種調度方式:blog
1)進程調度中的三個基本機制隊列
(PS:這裏有一個額外的知識:一般每一次上下文切換須要花費幾毫秒的時間。有一種簡單的方式,經過多組寄存器來減小上下文切換的時間。一組寄存器供處理機在系統態使用,一組供處理機在應用程序狀態時使用。這樣,上下文切換的時候只須要改變指針,指向當前的寄存器。)進程
(PSS:CPU的系統態就是CPU在執行操做系統,用戶態則是CPU在執行普通應用程序。)
2)進程調度的兩種調度方式
中級調度的本質就是讓暫時不能運行的進程掛起,釋放內存資源,並把它們調到外存上去等待。什麼是外存?外存就是硬盤、磁盤等存儲設備。
說到調度算法,那麼有幾個衡量進程運行效率的名詞須要瞭解一下,在作題的時候須要用到:
顧名思義。就是先來的先進入內存或佔用處理機。對於做業調度,就是從後備做業隊列中選擇一個或多個最早進入隊列的做業,將其調入內存。對於進程調度就是從就緒隊列選擇最新進入的進程,爲之分配處理機。
顧名思義。就是在選擇做業或進程的時候,先估算每一個做業、進程的服務時間,選擇其中最短的優先得到處理機。
這種算法給進程加了一個屬性,那就是優先權。這個算法的本質就是,高優先權的優先調用。優先權有兩種類型,一種是靜態的,即每一個進程、做業的優先權在它建立的時候就已經肯定,此後都不能改變。另外一種是動態的,即進程、做業的優先權是能夠改變的。最多見的作法就是進程、做業在等待中,優先權以必定速率隨時間增加,這樣等待時間越長,被調用的可能性就越大。
這就是分時系統中採用的調度算法。原理就是把全部的就緒隊列進程按先來先服務的原則排成隊列。每次都把CPU分配給隊首,讓其執行一個時間片,執行完畢,調度器中斷進程,並把該進程移至就緒隊列的隊尾,而後再取一個隊首進程,繼續執行下一個時間片。時間片是什麼,就是一段很短的CPU時間,幾毫秒到幾百毫秒不等。
這是當下公認的比較好的,使用最普遍的調度算法。其原理也不難。例如,某計算機採用多級反饋隊列調度算法,設置了5個就緒隊列。第一個就緒隊列優先級最高,時間片爲2ms。第二個就緒隊列優先級第二,時間片爲4ms,其他隊列也同樣,優先級依次遞減,時間片依次增長。若是某個進程進入就緒隊列,首先把它放在第一個就緒隊列的末尾,輪到它執行就執行2ms,時間片結束,若該進程尚未執行完畢,就把該進程移入第二個就緒隊列的末尾。只有當第一個隊列的進程都執行完時間片,纔會執行第二個隊列。如此依次執行,若該進程服務時間很長,將被移到最後一個就緒隊列。在最後一個就緒隊列,進程將按照時間片輪轉調度法執行。處理機執行過程當中,只有當優先級高的隊列中的線程都執行完畢,纔會執行優先級低的隊列。如圖所示(懶得本身畫一遍了,直接從書上拿過來):
何謂死鎖?即多個進程在運行過程當中因爭奪資源形成的一種僵局。
(1)、產生死鎖的必要緣由:
1)互斥條件。即一段時間內,某資源只能由一個進程佔用。這段時間,其餘的進程只能等待。
2)請求和保持條件。進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
3)不剝奪條件。進程已得到的資源,在未使用完以前,不能被剝奪
4)環路等待條件。
參考:《計算機操做系統(湯子瀛)》