pv操作是典型的同步機制之一。用乙個訊號量與乙個訊息聯絡起來,當訊號量的值為0時,表示期望的訊息尚未產生;當訊號量的值非0時,表示期望的訊息已經存在。用pv操作實現程序同步時,呼叫p操作測試訊息是否到達,呼叫v操作傳送訊息。概念
臨界區**指的是乙個訪問共用資源(例如:共用裝置或是共用儲存器)的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。
臨界區排程原則:
1、如果有若干程序要求進入空閒的臨界區,一次僅允許乙個程序進入。
2、任何時候,處於臨界區內的程序不可多於乙個。如已有程序進入自己的臨界區,則其它所有試圖進入臨界區的程序必須等待。
3、進入臨界區的程序要在有限時間內退出,以便其它程序能及時進入自己的臨界區。
4、如果程序不能進入自己的臨界區,則應讓出cpu,避免程序出現「忙等」現象。
訊號量(semaphore): 可用於程序間同步也可用於同乙個程序間的執行緒同步。
訊號量有乙個使用計數器,這個使用計數器,是訊號量的最大資源計數和當前資源計數的差值。
計數器的值大於0時,表示當前可用資源個數。
計數器的值小於0時,表等待使用資源的程序個數。
計數器的值為0則既沒有可用資源也沒有等待資源的程序
假設s的為訊號量的計數器的值:
p操作:執行一次p操作意味著請求分配乙個單位的資源,因此s的值減1,當s<0時,表示已經沒有可用資源,請求者必須等待別的程序釋放該類資源,它才能繼續執行。
v操作:執行一次v操作意味著釋放乙個資源,因此s的值加1,當s<0,表示有某些程序正在等待資源,因此要喚醒乙個等待狀態的程序,使之繼續執行。
例項pv操作解決問題可以套用乙個固定的**demo~就是乙個while裡套三個部分:開頭乙個p結尾乙個v中間是臨界區,
使用pv操作來解決問題:爸爸放蘋果,女兒拿蘋果,媽媽放橘子,兒子拿橘子。
由題可以看出需要4個程序,爸爸和媽媽的程序需要執行放的操作,我們分別套用模型即可
#include #include #include #include #include #include#define p sem_wait
#define v sem_post
#define full_orange &fullb
#define empty &empty_aha
sem_t fulla;
sem_t fullb;
sem_t empty_aha;
int num=0;
void* dad(void *p)
}void* dangter(void *p)
}void* mum(void *p)
}void* son(void *p)
}int main()
作業系統P V操作,司機 售票員問題 c語言實現
設公共汽車上,司機和售票員的活動分別是 司機 啟動車輛 正常行駛 到站停車 售票員 關車門 售票 開車門 訊號量 semaphore 的資料結構為乙個值和乙個指標,指標指向等待該訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量 當它的值小於0時,其絕對...
用pv操作實現 吃水果問題(C 語言)
功能 實現吃水果問題 題目內容 桌子有乙隻盤子,只允許放乙個水果,父親專向盤子放蘋果,母親專向盤子放桔子 兒子專等吃盤子的桔子,女兒專等吃盤子的蘋果。只要盤子為空,父親或母親就可以向盤子放水果,僅當盤子有自己需要的水果時,兒子和女兒可從盤子取出。請給出四個人之間的同步關係,並用 pv操作實現四個人的...
C語言實現鍊錶基本操作
之前說過順序表的基本操作。顯然,順序表有乙個很大的缺點,就是做插入刪除操作的時候,往往要做很大量的元素移動的操作。這裡我們討論另外一種線性表的表示方法 鏈式儲存結構。由於它不需要邏輯上的相鄰的元素在物理位置上也相鄰,因此它沒有順序儲存結構所具有的弱點,但是同時也失去了順序表的可隨機訪問的有點。inc...