文章目錄
- 一、前言🚀🚀🚀
- 二、正文:??????
- 題型一:利用信號量實現前驅關系
- 題型二:利用信號量實現資源同步與互斥
一、前言🚀🚀🚀
本文簡介:這是一篇基于b站up主chenchen的小馬的一篇個人筆記,視頻鏈接https://www.bilibili.com/video/BV1XG4y1V7M9/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=12384b61e0b367d92ce270fa4eb8fb68! 講的真的很通俗易懂,所以我便做了如下的筆記。
二、正文:??????
題型一:利用信號量實現前驅關系
??給出下圖,讓你利用信號量實現前驅關系
解題方法:
①有n個箭頭,就設n個信號量
②從根節點開始
③有n個前驅節點,就寫n個wait(),有n個后繼節點,就寫n個signal()
#代碼塊
Semaphore a,b,c,d,e,f,g = 0,0,0,0,0,0,0 # 聲明信號量beginparbeginbegin S1;signal(a);signal(b);end;begin wait(a);S2;signal(c);signal(d);end;begin wait(b);S3;signal(e);end;begin wait(c);S4;signal(f);end;begin wait(d);S5;signal(g);end;begin wait(e);wait(f);wait(g);S6;end;parendend
??
題型二:利用信號量實現資源同步與互斥
題:輸入進程Input和計算進程Compute共享大小為n的緩沖區,輸入進程負責讀入數據,并把輸入數據放到緩沖區中,計算進程負責從緩沖區中取出數據進行計算,請用信號量機制描述上述進程間的同步關系。
解題步驟:
①有幾類進程?(1類:競爭關系;多類:競爭和協作關系)
②確定臨界資源
③互斥信號量mutex初值為1,資源信號量初值看題目(大小為n的緩沖區)
④打框架,每個進程做什么事
⑤補充P、V操作(先申請資源信號量,再申請互斥信號量。)
解:①2類進程:輸入Input、計算compute
②緩沖區 ③mutex=1;empty=n;full=0;
# 代碼塊
Semaphore mutex=1;empty=n;full=0;parbeginInput(){while(true){wait(empty); # 先申請資源信號量wait(mutex); # 后申請互斥信號量讀數據放緩沖區 # 訪問臨界資源signal(mutex);signal(full);}}compute(){while(true){wait(full); wait(mutex);取數據進行計算 # 訪問臨界資源signal(mutex);signal(empty);}}parend
注意: 上面代碼中,Input()函數中:剛開始wait(empty); 先申請空的緩沖區后會變成滿的,所以釋放的時候是釋放signal(full);
第二個函數compute()同理,先申請full(這里已經是滿的緩沖區),然后完了再釋放signal(empty)。
??
??
??