2013-05-08 62 views
0

下面是問題: 每個進程可能處於不同的狀態,不同的事件會導致進程從一個狀態轉移到另一個狀態;這可以用狀態圖表示。使用狀態圖來解釋如何實現暫停隊列信號量。 [10分]如何繪製暫停隊列信號量的狀態圖?

我的圖是否正確,或者我誤解了這個問題?

我的理解是,掛起隊列信號量會保留一個阻塞進程的列表,從當前進程完成其臨界區時(或許隨機)選擇一個進程來解除阻塞。因此狀態圖中的等待狀態。

suspended_queue_semaphore的僞代碼。

struct suspended_queue_semaphore 
{ 
    int count; 
    queueType queue; 
}; 
void up(suspended_queue_semaphore s) 
{ 
    if (s.count == 0) 
    { 
    /* place this process in s.queue /* 
    /* block this process */ 
    } 
    else 
    { 
    s.count = s.count - 1; 
    } 
} 
void down(suspended_queue_semaphore s) 
{ 
    if (s.queue is not empty) 
    { 
    /* remove a process from s.queue using FIFO */ 
    /* unblock the process */ 
    } 
    else 
    { 
    s.count = s.count + 1; 
    } 
} 

回答

1

是進程或信號量的狀態圖,以及您在討論哪種信號量。 在最簡單的信號量中:一個二進制信號量(即只有一個進程可以運行),帶有操作wait(),即請求訪問共享資源和信號(),即完成訪問資源。

該進程的狀態圖只有兩種狀態:排隊(Q)和運行(R)以及開始和終止狀態。 狀態圖將是:

 
START = wait.CAN_RUN 
CAN_RUN = suspend.QUEUED + run.RUNNING 
QUEUED = run.RUNNING 
RUNNING = signal.END 

信號燈具有空和滿 兩個狀態信號量狀態圖將是:

 
START = EMPTY 
EMPTY = wait.RUN_PROCCESS + RUN_PROCESS 
RUN_PROCESS = run.FULL 
FULL = signal.EMPTY + wait.SUSPEND_PROCESS 
SUSPEND_PROCESS = suspend.FULL 

編輯:固定狀態圖的符號(狀態向後抱歉我的進程微積分生鏽)並添加了內部進程CAN_RUN,SUSPEND_PROCESS和RUN_PROCESS;並且內部消息運行並暫停。

說明: 該進程調用'等待'方法(在您的僞代碼中)並進入CAN_RUN狀態,從那裏它可以開始RUNNING或成爲QUEUED根據它是否得到'運行'或'暫停「消息。如果QUEUED接收到「運行」消息,則它可以開始運行。如果正在運行,則在完成前使用「信號」(在僞代碼中)。

信號量啓動EMPTY,如果它得到一個'等待'它進入RUN_PROCESS發出一個'運行'消息並且變成FULL。一旦完成,任何進一步的「等待」都會將其發送到SUSPEND_PROCESS狀態,在該狀態下它會向進程發出「掛起」。當收到一個'signal'時,它會回到EMPTY,並且它可以保持在那裏,或者根據隊列是否爲空來再次進入RUN_PROCESS狀態(我沒有對這些內部狀態建模,也沒有將隊列建模爲系統。 )

+0

謝謝,請您提供一篇文章的鏈接以供進一步閱讀?我相信這個問題是要求在一個進程中顯示暫停隊列信號量的實現(以及影響),所以從兩種就緒狀態(你的排隊)和運行到三種就緒狀態(你的排隊),運行並等待。 – 2013-05-08 15:32:42

+0

這就是爲什麼我問你指的是哪個信號量。它支持哪些方法(即傳遞哪些消息)。在進程微積分中,信號量將被建模爲兩個進程之間的交互:信號量和它同步的井進程/線程/任務。 AFAIK暫停隊列信號量是暫停進程放入隊列(即先到先服務)的信號量。我不知道你的三狀態信號量的語義,它們是否類似於有兩個隊列的C#監視器(一個用於準備運行,另一個用於等待脈衝?)。 – 2013-05-08 23:38:32

+0

進一步思考這個問題,我認爲信號量可能會干擾從已準備好運行的「已調度」箭頭並將箭頭推​​向等待狀態。我不知道如何在圖表上顯示 – 2013-05-08 23:38:37