【操作系統】CPU調度和死鎖


  高級調度又稱為作業調度或長程調度,其主要功能是根據作業控制塊中的信息,審查系統能否滿足用戶作業的資源需求,以及按照一定的算法,從外存的后備隊列中選取某些作業調入內存,並為它們創建進程、分配必要的資源。然后再將新創建的進程插入就緒隊列,准備執行。它的調度對象是作業。作業是一個比程序更為廣泛的概念,它不僅包含了通常的程序和數據,而且還應配有一份作業說明書,系統根據該說明書來對程序的運行進行控制。在批處理系統中,是以作業為基本單位從外存調入內存的。為了管理和調度作業,在多道批處理系統中為每個作業設置了一個作業控制塊JCB,它是作業在系統中存在的標志,其中保存了系統對作業進行管理和調度所需的全部信息

  低級調度稱為進程調度或短程調度,它所調度的對象是進程(或內核進程)。低級調度用於決定就緒隊列中的哪個進程應獲得處理機,然后再由分派程序執行把處理機分配給該進程的具體操作。低級調度的主要功能有保存處理機的現場信息、按某種算法選取進程、把處理器分配給進程。有兩種進程調度的方式:非搶占式調度和搶占式調度。

  在采用非搶占調度方式時,可能引起進程調度的因素可歸結為1、正在執行的進程執行完畢,或因發生某事件而不能再繼續執行;2、執行中的進程因提出I/O請求而暫停執行;3、在進程通信或同步過程中執行了某種原語操作,如P操作(wait操作)、Block原語、Wakeup原語等。非搶占式調度優點實現簡單,開銷小。缺點無法滿足緊急任務。

  搶占方式的優點是,可以防止一個長進程長時間占用處理機,能為大多數進程提供更公平的服務,特別是能滿足對響應時間有着較嚴格要求的實時任務的需求。但搶占方式比非搶占方式調度所需付出的開銷較大。搶占式調度基於的原則:優先權原則、短作業有限原則、時間片原則。

  中級調度又稱中程調度。引入中級調度的主要目的是為了提高內存利用率和系統吞吐量。為此,應使那些暫時不能運行的進程不再占用寶貴的內存資源,而將它們調至外存上去等待,把此時的進程狀態稱為就緒駐外存狀態或掛起狀態。中級調度實際上就是存儲器管理中的對換功能

 

 

   選擇調度方式和算法的准則有面向用戶的和面向系統的。

  面向用戶的准則:

  • 周轉時間最短。是指從作業被提交給系統開始,到作業完成為止的這段時間間隔(稱為作業周轉時間)。它包括四部分時間:作業在外存后備隊列上等待(作業)調度的時間,進程在就緒隊列上等待進程調度的時間,進程在CPU 上執行的時間,以及進程等待I/O 操作完成的時間。系統則希望平均周轉時間最短,可使得大多數用戶滿意。
  • 響應時間快。是從用戶通過鍵盤提交一個請求開始,直至系統首次產生響應為止的時間。
  • 截止時間的保證。
  • 優先權准則。

  面向系統的准則:

  • 系統吞吐量高。
  • 處理機利用率好。
  • 各類資源的平衡利用。

調度算法

  在OS中調度的實質是一種資源分配,因而調度算法是指:根據系統的資源分配策略所規定的資源分配算法。

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

  FCFS 算法比較有利於長作業(進程),而不利於短作業(進程)。

  短作業(進程)優先調度算法

  該算法對長作業不利,未考慮作業的緊迫程度。

  高優先權優先調度算法

  為了照顧緊迫型作業,使之在進入系統后便獲得優先處理,引入了最高優先權優先(FPF)調度算法。分為非搶占式和搶占式。

  優先權的類型分為靜態優先權和動態優先權。靜態優先權是在創建進程時確定的,且在進程的整個運行期間保持不變。靜態優先權根據進程類型、進程對資源的需求和用戶要求確定。靜態優先權法簡單易行,系統開銷小,但不夠精確。動態優先權是指在創建進程時所賦予的優先權,是可以隨進程的推進或隨其等待時間的增加而改變的,以便獲得更好的調度性能。

  由上式可以看出:

  • (1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利於短作業。
  • (2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務。
  • (3) 對於長作業,作業的優先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先級便可升到很高,從而也可獲得處理機。

  時間片輪轉法

  在時間片輪轉算法中,時間片的大小對系統性能有很大的影響,如選擇很小的時間片將有利於短作業,因為它能較快地完成,但會頻繁地發生中斷、進程上下文的切換,從而增加系統的開銷;反之,如選擇太長的時間片,使得每個進程都能在一個時間片內完成,時間片輪轉算法便退化為FCFS算法,無法滿足交互式用戶的需求。

  多級反饋隊列調度算法

  多級反饋隊列算法可以很好的處理交互作用,短作業和長作業。

  設置多個就緒隊列,並為各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其余各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,為每個進程所規定的執行時間片就愈小。

  當一個新進程進入內存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可准備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列后,在第n 隊列中便采取按時間片輪轉的方式運行。

   僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,才會調度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。

  

實時調度

  實時調度需要的信息:就緒時間、開始截止時間和完成截止時間、處理時間、資源要求、優先級。

  假定系統中有m 個周期性的硬實時任務,它們的處理時間可表示為Ci,周期時間表示為Pi,則在單處理機情況下,必須滿足下面的限制條件:

  假定系統中的處理機數為N,則應將上述的限制條件改為:

  

   實時調度通常采用采用搶占式調度機制,具有快速切換機制(對外部中斷的快速響應能力、快速的任務分派能力)。

  實時調度算法的分類如下:

  

  常見的實時調度算法有:最早截止時間優先即EDF(Earliest Deadline First)算法、最低松弛度優先即LLF(Least Laxity First)算法。松弛程度就是任務緊急程度。 

死鎖 

   死鎖(Deadlock)是指多個進程在運行過程中因爭奪資源而造成的一種僵局,當進程處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。

  產生死鎖的原因:

  • 競爭資源:競爭非剝奪資源、臨時性資源都可能導致死鎖。資源分為可剝奪資源(指某進程在獲得這類資源后,該資源可以再被其他進程或系統剝奪,CPU和主存均屬於可剝奪性資源。)和非可剝奪資源(當系統把這類資源分配給某進程后,再不能強行收回,只能在進程用完后自行釋放,如磁帶機、打印機等。)。資源也可分為永久性資源(可以重復使用的資源)和臨時資源(指由一個進程產生,被另一進程使用一短暫時間后便無用的資源)。
  • 進程間推進順序非法

  產生死鎖的必要條件:

  • 互斥條件:進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。
  • 請求和保持條件:進程已經保持了至少一個資源,又提出了新的資源請求,但是該資源已經被其他進程占有,此時請求進程阻塞。
  • 不剝奪條件:進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
  • 環路等待條件:指在發生死鎖時,必然存在一個進程—資源的環形鏈。

  處理死鎖的方法:

  • 預防死鎖。
  • 避免死鎖。
  • 檢測死鎖。
  • 解除死鎖。

  預防死鎖

  該方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或幾個條件,來預防發生死鎖。由於所施加的限制條件往往太嚴格,因而可能會導致系統資源利用率和系統吞吐量降低。預防死鎖的方法是使四個必要條件中的第2、3、4 個條件之一不能成立,來避免發生死鎖。至於必要條件1互斥條件,因為它是由設備的固有特性所決定的,不僅不能改變,還應加以保證。

  破壞請求和保持條件:系統規定所有進程在開始運行之前,都必須一次性地申請其在整個運行過程所需的全部資源。其優點是簡單、易於實現且很安全。缺點為資源被嚴重浪費和使進程延遲運行。在允許的情況(較為簡單的情況)下也可以一個一個申請,即申請一個用完就釋放

  破壞不剝奪條件:當一個已經保持了某些資源的進程,再提出新的資源請求而不能立即得到滿足時,必須釋放它已經保持了的所有資源,待以后需要時再重新申請。這延長了進程的周轉時間,增加了系統開銷,降低了系統吞吐量。

  破壞環路等待條件:這種方法中規定,系統將所有資源按類型進行線性排隊,並賦予不同的序號。所有進程對資源的請求必須嚴格按照資源序號遞增的次序提出,這樣,在所形成的資源分配圖中,不可能再出現環路。這限制了新類型設備的增加,造成資源浪費,按規定次序申請的方法,必然會限制用戶簡單、自主地編程。

  避免死鎖

  並不須事先采取各種限制措施去破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。由於施加較弱的限制條件,便可獲得較高的資源利用率及系統吞吐量,但在實現上有一定的難度。系統的狀態分為安全狀態和不安全狀態,只要能使系統始終都處於安全狀態,便可避免發生死鎖。允許進程動態地申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程;否則,令進程等待。

  所謂安全狀態,是指系統能按某種進程順序(P1,P2,…,Pn)(稱〈P1,P2,…,Pn〉序列為安全序列),來為每個進程Pi分配其所需資源,Pi執行結束后釋放資源可供Pi+1使用,直至滿足每個進程對資源的最大需求,使每個進程都可順利地完成。如果系統無法找到這樣一個安全序列,則稱系統處於不安全狀態。

  使用銀行家算法可以避免死鎖。

  算法數據結構:

  可用資源數組Available:  數組大小m表示有m類資源,數組元素表示系統中某類資源可用數目。
  最大需求矩陣Max:  n×m 的矩陣,定義了系統中n個進程中的每一個進程對m類資源的最大需求。
  分配矩陣Allocation:  n×m 的矩陣,定義了每一個進程當前已分配給每一類資源數。
  需求矩陣Need:  n×m的矩陣,用以表示每一個進程還需要的各類資源數。

  

  進程i的某一次請求資源數組Request_i:  大小為m,元素為本次要申請每類資源的數目。

  工作數組Work:  表示系統當前可提供的各類資源數目,它含有m個元素,在執行安全算法開始時,Work:=Available。

  數組Finish:  它表示系統是否有足夠的資源分配給進程,使之運行完成,大小為n。開始時先做Finish[i]:=false;當有足夠資源分配給進程時,再令Finish[i]:=true。

 

   算法步驟:

  1. 如果Request i[j]≤Need[i,j],便轉向步驟(2);否則認為出錯,因為它所需要的資源數已超過它所宣布的最大值。
  2. 如果Requesti[j]≤Available[j],便轉向步驟(3);否則,表示尚無足夠資源,Pi 須等待。
  3. 系統試探着把資源分配給進程P i,並修改下面數據結構中的數值:

  4.系統執行安全性算法,檢查此次資源分配后系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。

 

  安全性算法步驟:

  1. 設置兩個向量:Work:=Available,Finish[i]:=false;
  2. 從進程集合中找到一個能滿足下述條件的進程:
    ① Finish[i]=false;② Need[i,j]≤Work[j](系統的資源可以滿足該進程);若找到,執行步驟3,否則,執行步驟4。

  3. 當進程Pi獲得資源后,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:Work[j]:= Work[j]+Allocation[i,j](此時假設Pi已經執行完畢);Finish[i]:=true;go to step 2;
  4. 如果所有進程的Finish[i]=true都滿足,則表示系統處於安全狀態;否則,系統處於不安全狀態。

 

  檢測死鎖

  並不須事先采取任何限制性措施,也不必檢查系統是否已經進入不安全區,而是允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源; 然后,采取適當措施,從系統中將已發生的死鎖清除掉。檢測的前提是系統保存有關資源的請求和分配信息。

  死鎖定理:S(資源分配圖)狀態為死鎖狀態的充分條件是:當且僅當S狀態的資源分配圖是不可完全簡化的。

  資源分配圖

  (1) 把N 分為兩個互斥的子集,即一組進程結點P={p1,p2,…,pn}和一組資源結點 R={r1,r2,…,rn},N=P∪R。(2) 凡屬於E中的一個邊e∈E,都連接着P中的一個結點和R中的一個結點,e={pi,rj}是資源請求邊,由進程pi指向資源rj,它表示進程pi請求一個單位的rj資源。e={rj,pi}是資源分配邊,由資源rj指向進程pi,它表示把一個單位的資源rj分配給進程pi。

 

  資源分配圖簡化

  1. 在資源分配圖中,找出一個既不阻塞又非獨立的進程結點Pi。在順利的情況下,Pi可獲得所需資源而繼續運行,直至運行完畢,再釋放其所占有的全部資源,這相當於消去pi所求的請求邊和分配邊,使之成為孤立的結點。將圖a中p1的兩個分配邊和一個請求邊消去,便形成圖(b)所示的情況。
  2. p1釋放資源后,便可使p2獲得資源而繼續運行,直至p2完成后又釋放出它所占有的全部資源,形成圖(c)所示的情況。
  3. 在進行一系列的簡化后,若能消去圖中所有的邊,使所有的進程結點都成為孤立結點,則稱該圖是可完全簡化的;若不能通過任何過程使該圖完全簡化,則稱該圖是不可完全簡化的。

 

  解除死鎖

  與檢測死鎖相配套的一種措施。常采用解除死鎖的兩種方法是:

  • (1) 剝奪資源。從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態。
  • (2) 撤消進程。最簡單的撤消進程的方法是使全部死鎖進程都夭折掉;稍微溫和一點的方法是按照某種順序逐個地撤消進程,直至有足夠的資源可用,使死鎖狀態消除為止。

  在出現死鎖時,可采用各種策略來撤消進程。例如,為解除死鎖狀態所需撤消的進程數目最小;或者,撤消進程所付出的代價最小等。

 

 


免責聲明!

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



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