用信號量進程同步與互斥
1.理解生產者和消費者問題
沒有引入信號量時的生產者和消費者進程,什麽情況下會出現結果不唯一?什麽情況下會出現永遠等待?
用信號解決生產者和消費者的同步與互斥,要求能自己寫出來。
答:在兩個進程同時進行時,結果會不唯一,因為不同步。
由於異常的中斷,導致判斷條件的重復錯誤,最後導致永遠等待。
2.哲學家吃面問題
3.讀寫文件問題
4.理發師問題
5.在一間酒吧裏有三個音樂愛好者隊列,第一隊的音樂愛好者只有隨身聽,第二隊只有音樂磁帶,第三隊只有電池。而要聽音樂就必須隨身聽、音樂磁帶和電池這三種物品俱全。酒吧老板一次出售這三種物品中的任意兩種。當一名音樂愛好者得到這三種物品並聽完一首樂曲後,酒吧老板才能再一次出售這三種物品中的任意兩種。於是第二名音樂愛好者得到這三種物品,並開始聽樂曲。全部買賣就這樣進行下去。試用P,v操作正確解決這一買賣。
答: Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};
Semaphore limit = new Semaphore(4);
for(int i=0;i<5;i++){
final int index=i;
new Thread(()->{
while(true){
try {
limit.acquire();
forks[index].acquire(); //P(index)
forks[(index+1)%5].acquire();//P((index+1)%mod5)
System.out.println("第"+index+"個哲學家在通心粉");
forks[index].release();
forks[(index+1)%5].release();
limit.release();
System.out.println("第"+index+"個哲學家吃完了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
6.某銀行有人民幣儲蓄業務,由n個儲蓄員負責。每個顧客進入銀行後先取一個號,並且等著叫號。當一個儲蓄人員空閑下來,就叫下一個號。請用P,V操作正確編寫儲蓄人員和顧客進程的程序。
答:semaphore mutex=A, customer_count=0:
main()
{
Cobegin
Customeri()
{
p(mutex);
取號碼,進入隊列;
v(mutex);
v(customer_count);
}
serversi()
{
while(A)
{
p(customer_count);
p(mutex);
從隊列中取下一個號碼;
v(mutex);
}
end
Coend
7.下面是兩個並發執行的進程。它們能正確運行嗎?若不能請舉例說明,並改正之。(5分)
parbegin
var X:integer;
process P1 process P2
var y,z:integer: var t,u:integer;
begin begin
x:=1; x:=0:
y:=0: t=0;
if x≥l then y:=y十1; if x≤l then t:=t+2;
z:=y; u:=t;
end; end;
parend.
答:能。
8.九、在一個盒子裏,混裝了相等數量的黑棋子和白棋子,現要用自動分揀系統把黑棋子和白棋子分開,該系統由兩個並發執行的進程P1和P2組成,其中進程P1專門揀黑子,進程P2專門揀白子。規定兩個進程輪流揀子且每個進程每次只揀一個子。當一個進程在揀子時不允許另一個進程去揀子,並設P1先揀。請用P,V操作管理這兩個並發進程,使其能正確實現上述功能。
答:var S1,S2:semaphore;
S1:=1;S2:=0;
cobegin
{
process P1
begin
repeat
P(S1);
揀白子
V(S2);
until false;
end
process P2
begin
repeat
P(S2);
揀黑子
V(S1);
until false;
end
}
coend.
用信號量進程同步與互斥