進餐問題及其他訊號量

2022-06-23 12:39:14 字數 1370 閱讀 4737

哲學家問題

五個哲學家圍坐在一圓桌旁,桌**有一盤通心粉,沒人面前有乙隻空盤子,每兩人之間放乙隻叉子。每個哲學家的行為是思考,感到飢餓,然後吃通心粉。為了吃通心粉,每個哲學家必須拿到兩隻叉子,並且每個人只能直接從自己的左邊或有百年去取叉子

使用p、v操作解決

每乙隻叉子用乙個訊號量表示,通過對訊號量執行p操作取得叉子,執行v操作放下叉子

設定訊號量:

semaphore  fork[n];//n=5,公用訊號量,用於互斥

fork[i]=1;//設定初值,i=1,2,,, ,5

第i個哲學家程序

while(1)

帶來的問題:

死鎖--每個人拿起而且只拿起了乙隻叉子,並且都不放下,僵在這

飢餓--每個人都拿起了叉子,然後動作很協調又同時放下,反覆重複這個過程(長時間得不到響應)

原因:p、v操作本身可以很好的解決同步互斥問題,但是實際中遇到的問題並不都是同步互斥問題,並且p、v操作本身也存在著缺點:操作繁瑣,同步互斥操作被分散在各個程序中,使得易讀性、維護性差,複雜性高,對於一些複雜問題實現不方便,存在隱患。

如何解決?--提出了一些高階資料結構

訊號量集--and型訊號量集

and型訊號量集是指同時需要多種資源且每種占用乙個時的訊號量操作

and型訊號量集的基本思想:在乙個原語中申請整段**需要的多個臨界資源,要麼全部分配給它,要麼乙個都不分配

and型訊號量集p原語為swait

and型訊號量集v原語為ssignal

swait(s1,s2, ,,, ,sn)//p原語

break;

}else

} }

ssignal(s1, s2, …, sn)

else}}

}一般訊號量集

一般訊號量集是指同時需要多種資源、每種資源占用的數目不同、且可分配的資源還存在乙個臨界值時的訊號量處理

一般訊號量集的基本思路就是在and型訊號量集的基礎上進行擴充,在一次原語操作中完成所有的資源申請

程序對訊號量si的

測試值為 ti (表示訊號量的判斷條件,要求si≥ti,即當資源數量低於ti時,便不予分配)

占用值為di(表示資源的申請量,即si=si-di)

對應的p、v原語格式為:

swait(s1,t1,d1;,,,;sn,tn,dn);

ssignal(s1,d1,;,,,;sn,dn);

一般訊號量可以用於各種情況的資源分配和釋放,幾種特殊情況:

swait(s,d,d)表示每次申請d個資源,當少於d個時,便不分配)

swait(s,1,1)表示互斥訊號量

swait(s,1,0)可作為乙個可控開關(當s≥1時,允許多個程序進入臨界區;當s=0時,禁止任何程序進入臨界區)

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...

python訊號量 Python訊號量

python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...

訊號 訊號量

訊號是由 系統或者程序傳送給目標程序的資訊,以通知目標程序某個狀態的改變或系統異常。linux訊號可以由如下條件產生 1 對於前台程序,使用者可以通過輸入特殊的終端字元來給它傳送訊號。比如輸入ctrl c通常或給程序傳送乙個中斷訊號 2 系統異常。比如浮點異常和非法記憶體段訪問。3 系統狀態變化 4...