天天看點

作業系統概念學習筆記 12 程序同步(二)管程作業系統概念學習筆記 12

基本的、進階的同步構造,即管程(monitor)類型。

管程類型提供了一組由程式員定義的、在管程内互斥的操作。管程類型的表示包括一組變量的聲明(這些變量的值定義了一個類型執行個體的狀态)和對這些變量操作的子程式和函數的實作。管程的類型表示不能直接為各個程序所使用。是以,在管程内定義的子程式隻能通路位于管程内那些局部聲明的變量和形式參數。類似的,管程的局部變量能被局部子程式通路。

管程結構確定一次隻有一個程序能在管程内活動。不需要顯示的編寫同步代碼。而對于特定同步方案,需要額外的同步機制,這些由條件(condition)結構來提供。

管程的文法:

這個解決方案要求哲學家在兩隻筷子都可以使用時才會拿起筷子。

為此,引入如下資料結構:

加入條件,哲學家i隻有在其兩個鄰居不再進餐時才能将變量state[i]設定為eating:

(state[(i+4)%5]!=eating)和(state[i+1]%5!=eating)

哲學家i必須按以下順序來調用操作

基于信号量的哲學家進餐問題的管程解法:每個管程都有一個信号量mutex(初始化為1),程序在進入管程之前,必須執行wait(mutex),在離開管程後必須執行signal(mutex)。

條件變量的實作:對于每個條件變量x,引入信号量x_sem和整數變量x_count,兩者均初始化為0。由于信号程序必須等待,引入另一個信号量next以供信号程序挂起自己,next_count以對挂起在next上的程序進行計數。

x.wait()的實作:

x.signal()的實作:

等待最長的程序先重新運作。也可以使用條件等待構造。

x.wait(c);其中c表示優先值(priority number),會與懸挂程序的名稱一起存儲。

使用管程來管理資源時,為確定系統的正确,有兩個條件是必須檢查的:

第一,使用者程序必須總是按正确順序來對管程進行調用;

第二,必須確定一個不合作的程序不能簡單地忽略由管程所提供的互斥關口,以及在不遵守協定的情況下直接通路共享資源。

繼續閱讀