作業系統概念 第五部分 死鎖

2021-07-27 10:54:00 字數 1246 閱讀 2140

概念解釋:計算機存在若干種資源,一任務可能需要若干個資源才能執行完成。如果幾個程序都僅僅保持獲得一部分資源,但都沒有獲得執行完成所需的所有資源,它們都在等待其他程序釋放自己所需的資源,那麼沒有任何乙個程序可以前進、執行完成,這種僵局叫做死鎖。

互斥:乙個資源只可以被獨享

占有並等待:程序占有乙個資源不釋放,並且等待其他資源

非搶占:資源不能被搶占,只能等待任務完成被釋放

迴圈等待:有一組程序(p0,p1,p2……pn),p0等待的資源被p1占有,p1等待的資源被p2占有……pn等待的資源被p0占有

資源分配圖中由一組表示程序的點,一組表示資源的點,以及一組表示請求資源的有向邊(申請邊),一組表示正在占有資源的有向邊(分配邊)表示,其中,同一種資源的若干個點用矩形括起來,申請邊僅僅指向矩形,而分配邊則從矩形中的資源點出發,指向表示程序的點。

資源分配圖中如果沒有環,則一定沒有死鎖,如果有環,則可能有死鎖;如果每種資源只有乙個例項,則有環一定死鎖。

解決占有並等待:

方法一:程序申請資源時,只有所有資源都可用時才能分配給程序

方法二:程序申請資源時,可以允許有些資源不可用,在程序執行中需要使用其他資源時,要釋放目前擁有的所有資源。

上述兩種方法也有缺點:第一是會導致資源利用率低,分配了的資源可能長時間不會使用;第二是可能會發生飢餓,如果乙個程序需要很多資源,程序可能一直等不到導致餓死。

解決非搶占:

當乙個程序申請其他資源而等待時,當前它說擁有的資源可以被其他程序搶占。這種方法通常應用於狀態可以儲存的資源,比如cpu,暫存器和記憶體,而不適用於其他資源,比如印表機和 硬碟驅動器。

解決迴圈等待

可以給所有資源型別乙個權值,幾個程序如果要申請資源,一定要按資源權重的公升序序列申請,同時,同種資源的多個例項必須一起申請。

死鎖恢復的方法大體上有兩種:

程序終止:一次性終止所有程序或者乙個個地終止程序直到死鎖解除。這裡需要注意的問題是如果是乙個個地終止程序,如何選擇首先被終止的程序,需要考慮程序優先順序,程序的已經進行的計算量,程序的型別等

資源搶占:允許系統資源被搶占,發生死鎖時,程序搶占資源直到死鎖解除。這裡需要注意的問題是如何選擇犧牲的程序(這個程序的資源被其他程序搶占),以及被犧牲的程序需要回滾操作,以便重啟。另外,如果乙個程序經常被選為犧牲品,進而被餓死是不行的,所以一般選擇犧牲品時,需要把程序回滾的次數考慮在內。

譯 Reduce(軟體編寫)(第五部分)

本文講的是 譯 reduce 軟體編寫 第五部分 array.reduce reducer accumulator any,current any any,initialvalue any accumulator any 2,4,6 reduce acc,n acc n,0 12const summ...

Python學習手冊(第五部分 模組)

注意 匯入只發生一次!如果需要乙個模組的 通過某種匯入後再一次執行,需要使用內建函式reload來實現。最好使用import直接匯入模組,使用from import 語句匯入的變數名可能會有問題。import匯入模組包的語句中的目錄路徑只能是以點號間隔的變數。相對匯入與絕對匯入 絕對匯入的格式為 i...

Job 儲存和持久化 第五部分

十.使用資料庫儲存 scheduler 資訊 載入 job 到資料庫中 在前面有一節,使用記憶體儲存 scheduler 資訊 我們談到關於在使用 ramjobstore 時如何載入 job 和 trigger 資訊到記憶體中。那麼 job 和 trigger 又是如何載入到資料庫中的呢?存在以下幾...