恢復流程例項的流程監控


如果多個程序因條件 x 而掛起,並且某個程序執行了 x.signal() 操作,那麼我們可以透過一個簡單的解決方案來確定接下來應該恢復哪個掛起的程序:使用先到先服務 (FCFS) 順序,以便最先等待的程序首先恢復。然而,在許多情況下,這種簡單的排程方案是不夠的。因此,可以使用條件等待結構。此結構具有以下形式

x.wait(c);

這裡 c 是一個整數表示式,在執行 wait() 操作時計算。c 的值稱為優先順序數字,然後與掛起程序的名稱一起儲存。當執行 x.signal() 時,優先順序數字最小的程序將被恢復。為了說明這種新機制,請考慮下面程式碼中所示的 ResourceAllocator 監視器,它控制單個資源在競爭程序之間的分配。

示例

monitor ResourceAllocator{
   boolean busy;
   condition x;
   void acquire(int time){
   if (busy)
      x.wait(time);
      busy = true;
   }
   void release(){
      busy = false;
      x.signal();
   }
   initialization code(){
      busy = false;
   }
}

當每個程序請求分配此資源時,都會指定其計劃使用資源的最長時間。監視器將資源分配給時間分配請求最短的程序。需要訪問上面問題中資源的程序必須遵循以下順序:

R.acquire(t);
...
access the resource;
…
R.release();

其中 R 是 ResourceAllocator 型別的例項。

不幸的是,監視器概念無法保證會遵守上述訪問順序,可能會發生以下問題:

  • 程序可能在未首先獲得對資源的訪問許可權的情況下訪問資源。

  • 一旦程序被授予對資源的訪問許可權,它可能永遠不會釋放資源。

  • 程序可能會嘗試釋放其從未請求過的資源。

  • 程序可能會兩次請求相同的資源(而沒有首先釋放該資源)。

當前問題的可能解決方案是將資源訪問操作包含在 ResourceAllocator 監視器中。但是,使用此解決方案意味著排程將根據內建的監視器排程演算法而不是我們編寫的排程演算法進行。

我們必須檢查所有使用 ResourceAllocator 監視器及其管理資源的程式,以確保程序遵守相應的順序。必須建立兩個條件才能確保此係統的正確性。首先,使用者程序必須始終以正確的順序對其進行監視器呼叫,其次,必須確保不合作的程序不會簡單地忽略監視器提供的互斥閘道器,並嘗試直接訪問共享資源,而不使用訪問協議。只有在確保這兩個條件的情況下,我們才能保證不會發生與時間相關的錯誤,並且排程演算法不會被破壞。

更新於: 2019年10月17日

604 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.