用訊號量機制實現 程序互斥 同 步 前驅關係

2021-10-10 14:28:51 字數 1802 閱讀 5430

1.分析併發程序的關鍵活動,劃定臨界區(如:對臨界資源印表機的訪問就應放在臨界區)

2.設定互斥訊號量 mutex,初值為1

3.在臨界區之前執行p(mutex)

4.在臨界區之後執行v(mutex)

注意:對不同的臨界資源需要設定不同的互斥訊號量。p、v操作必須成對出現。缺少p(mutex)就不能保證臨界資源的互斥訪問。缺少v(mutex)會導致資源永不被釋放,等待程序永不被喚醒。

程序同步:要讓各併發程序按要求有序地推進。

比如,p1、p2併發執行,由於存在非同步性,因此二者交替推進的次序是不確定的。

若p2的「**4」要基於p1的「**1」和「**2」的執行結果才能執行,那麼我們就必須保證「**4」一定是在「**2」之後才會執行。

這就是程序同步問題,讓本來非同步併發的程序互相配合,有序推進。

用訊號量實現程序同步

1.分析什麼地方需要實現「同步關係」,即必須保證「一前一後」執行的兩個操作(或兩句**)

2.設定同步訊號量s,初始為0

3.在「前操作」之後執行v(s)

4.在「後操作」之前執行p(s)

若先執行到v(s)操作,則s++後s=1。之後當執行到p(s)操作

時,由於s=1,表示有可用資源,會執行s- -,s的值變回0,

p2程序不會執行bock原語,而是繼續往下執行**4。

若先執行到p(s)操作,由於s=0,s- -後s= -1,表示此時沒有

可用資源,因此p操作中會執行 block原語,主動請求阻塞。

之後當執行完**2,繼而執行v(s)操作,s++,使s變回0

由於此時有程序在該訊號量對應的阻塞佇列中,因此會在v

操作中執行 wakeup原語,喚醒在阻塞佇列中的p2程序。這樣p2就可以繼續

執行**4了。

其實每一對前驅關係都是乙個程序同步問題(需要保證一前一後的操作)

因此:1.要為每一對前驅關係各設定乙個同步變數

2.在「前操作」之後對相應的同步變數執行ⅴ操作

3.在「後操作」之前對相應的同步變數執行p操作

例:程序p1中有句**s1,p2中有句**s2.p3…p6中有句**s6。這些**要求按如下前驅圖所示的順序來執行

訊號量 實現同步互斥

了解訊號量之前,要先了解臨界資源 同步與互斥的概念 1.臨界資源 在同一時間只能被乙個程序呼叫的資源,也稱互斥資源。2.同步 保證訪問的時序可控性,使呼叫資源的的順序合理。3.互斥 在程序呼叫臨界資源是,不同程序之間要競爭該資源,那麼乙個程序呼叫了該資源,另乙個程序無法再呼叫該資源的情形就叫互斥!4...

用訊號量程序同步與互斥

1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?用訊號解決生產者和消費者的同步與互斥,要求能自己寫出來。結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品...

用訊號量程序同步與互斥

1.理解生產者和消費者問題 沒有引入訊號量時的生產者和消費者程序,什麼情況下會出現結果不唯一?什麼情況下會出現永遠等待?出現結果不唯一 假如當前的產品數為8,如果生產者生產一件產品投入快取區,擬執行產品數加一操作 同時消費者取走一樣產品,擬執行產品數減一操作 假如兩者交替執行加一或減一操作,取決於其...