日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统复习笔记(四)

發布時間:2023/12/15 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统复习笔记(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
10.司機和售票員之間要協同工作:一方面只有售票員把車門關好了司機才能開車,因此售票員關好車門應通知司機開車;另一方面只有當汽車已經停下時,售票員才能開門讓乘客上下客,司機停車后應該通知售票員,假定某輛汽車有一名司機和兩名售票員,汽車當前正在始法站停車上客,

分析:???活動規律:
???????? 司機??????????????? 售票員(2名)
??????? 啟動車輛??????????? 上乘客
??????? 正常行駛?????????????關車門
??????? 到站停車??????????? 售票
???????????????????????????????????????開車門
?????????????????????????????????????下乘客
售票員關好車門應該通知司機開車,因此要設置一個信號量用于司機判斷是否可以啟動車輛;此外,當汽車到站停下時,司機停車后要通知售票員,所以也要設置一個信號量用于通知售票員打開車門.由于有兩名售票員,因此相應的信號量都需要設置兩個.

?begin?
??????????????????var?stop1
=0,stop2=0,run1=0,run2=0:semaphore;
????????????????????cobegin
????????????????????????process?driver
????????????????????????????begin
???????????????????????????????repeat
????????????????????????????????????p(run1);
????????????????????????????????????p(run2);
????????????????啟動車輛;
????????正常行駛;
????????到站停車;
????????????????v(stop1);
????????????????v(stop2);
????????????????????????????end
????????????????????????process?conductor1
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關車門;
????????v(run1);
????????售票;
????????p(stop1);
????????開車門;
????????下乘客;
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關車門;
????????v(run2);
????????售票;
????????p(stop2);
????????開車門;
????????下乘客;
???????????????????????????end
???????????????coend
????end

注:這是售票員優先的方式,若以司機優先的方式,程序如下:
?begin?
??????????????????var?stop1
=0,stop2=0,run1=0,run2=0:semaphore;
????????????????????cobegin
????????????????????????process?driver
????????????????????????????begin
???????????????????????????????repeat
????????正常行駛;
????????到站停車;
?????????v(stop1);
????????????????v(stop2);
????????????????????????????????????p(run1);
????????????????????????????????????p(run2);
????????????????????????????end
????????????????????????process?conductor1
????????????????????????????begin
??????????????????????repeat;
????????p(stop1);
????????開車門;
????????售票;
????????關車門;
????????v(run1);
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
?????????????????p(stop2);
????????開車門;
????????售票;
????????關車門;
????????v(run2);
???????????????????????????end
???????????????coend
????end

11.兩個學校之間有一條路,其中從s到t一段路每次只允許一輛車通過,但中間有一個小的"安全島"M(同時允許兩輛車停留),可供兩輛車已經從兩端進入小路的情況下錯車使用.

分析:由于安全島M僅僅允許兩輛車停留,本應該作為臨界資源而要設置信號量,但根據題意,任意時刻進入安全島的車不會超過兩輛(兩個方向最多各有一輛),因此,不需要為M設置信號量,在路口s和路口t都需要設置信號量,以控制來自兩個方向的車對路口資源的爭奪.這兩個信號量的初值都是1.此外,由于從s到t的一段路只允許一輛車通過,所以還需要設置另外的信號量用于控制,由于M的存在,可以為兩端的小路分別設置一個互斥信號量.

begin?
??????????????????var?s
=1,t=1,sk=1,lt=1:semaphore;
????????????????????cobegin
????????????????????????process?p1
????????????????????????????begin
???????????????????????????????repeat
????????p(s);
????????p(sk);
????????通過sk路段;
????????進入安全島M;
?????????????????v(sk);
????????p(lt);
????????通過lt路段;
????????v(lt);
????????v(s);
????????until?
false
????????????????????????????end
??????process?p2
????????????????????????????begin
??????????????????????????repeat;
???????????????p(t);
????????p(lt);
????????通過sk路段;
????????進入安全島M;
?????????????????v(lt);
????????p(sk);
????????通過lt路段;
????????v(sk);
????????v(t);
????????until?
false
???????????????????????????end
???????????????coend
????end

12.有一個理發師,一把理發椅和n把供等候理發的顧客坐的椅子,若沒有顧客,則理發師睡覺,當一個顧客到來時,必須喚醒理發師進行理發,若理發師正在理發,又有顧客到來,則若有空椅子可坐就坐下來等,若沒有空椅子就離開.

分析:需要設置一個信號量barber,初值為0,用于控制理發師和顧客之間的同步關系.還需要設置一個信號量customer,初值為0,用于離開顧客與等候顧客之間的同步控制,為了記錄等候的顧客數,應該設置一個計數器count,初值為0.當一個顧客到達時,需要在count上做加1操作,并根據count值的不同分別采取不同的動作,當顧客離開時,要對count上做減1操作,并根據count值的不同分別采取不同的動作;由于count是共享變量,因此要互斥使用,為此設置一個互斥信號量mutex;

begin?
??????????????????var?barber
=0,customer=0,count=0,mutex=1:semaphore;
????????????????????cobegin
????????????????????????process?barber
????????????????????????????begin
???????????????????????????????repeat
????????p(customer);
????????p(mutex);
????????count?
=?count?-1;
?????????????????v(barber);
????????v(mutex);
????????理發;
????????until?
false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(mutex);
????????
if(count<n)
????????
{
????????????count?
=?count?+1;
????????????v(customer);
????????????p(barber);
???????????????????理發;
????????}

????????
else
????????
{
????????????v(mutex);
????????????離開;
????????}

????????until?
false
???????????????????????????end
???????????????coend
????end

注:變形:有3個理發師,3把理發椅子,n把供等候理發的顧客坐的椅子.由于有3位理發師,所以一次同時可以為三個顧客服務,設置信號量max_capacity,用于表示空閑椅子的數量,初值為n.信號量barber_chair表示空閑理發師(椅)的數量,初值為3;信號量cust_ready,finished,leave_b_chair分別表示是否有顧客到來,理發完成,離開理發椅,它們的初值都為0;

begin?
??????????????????var?max_capacity
=n,barber_chair=3,cust_ready=0,finished=0,leave_b_chair?=?0:semaphore;
????????????????????cobegin
????????????????????????process?barber
????????????????????????????begin
???????????????????????????????repeat
????????p(cust_ready);
????????理發;
????????until?
false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(max_capacity);
//是否有空閑椅子;
????????進入店里;
????????p(barber_chair);
//是否有空閑的理發椅;
????????坐在理發椅上;
????????v(cust_ready);
//喚醒理發師;
????????p(finished);//是否完成理發;
????????離開理發椅;
????????v(leave_b_chair);
????????離開店;
????????v(max_capacity);
????????until?
false
???????????????????????????end
???????????????coend
????end

13.進程p0,p1共享變量flag,turn;他們進入臨界區的算法如下:
?var?flag:array[0..1]?of?boolean;//初值為false
????????????turn:01
????????
????process?i?(0或1)
????????
while?true
????????????
do?begin
????????????????flag[i]?
=true;
????????????????
while?turn!=i
????????????????????
do?begin?
????????????????????????
while?flag[j]==false
????????????????????????????
do?skip;//skip為空語句
????????????????????????????turn?=?i
????????????????????????????end
????????????????????????臨界區;
????????????????????????flag[i]?
=?false;
????????????????????????出臨界區;
????????????????end

該算法能否正確地實現互斥?若不能,應該如何修改(假設flag,turn單元內容的修改和訪問是互斥的).

分析:不能正確實現互斥.考慮如下情況:process0先執行到flag[0] = true,process1開始執行,進入內循環時,將turn設置為1;此時進程調度轉到process0,process0可以進入內循環,由于flag[1]的值為true,所以process0再次將turn的值設置為0,重復上述操作,兩個進程誰也不能進入臨界區.

var?flag:array[0..1]?of?boolean;//初值為false
????????????turn:01
????????
????process?
0
????????
while?true
????????????
do?begin
????????????????flag[
0]?=true;
????turn?
=?1
??????????????????
while?flag[1]==true?and?turn?=?1
????????????????????????????
do?skip;//skip為空語句
????????????????????????臨界區;
????????????????????????flag[
0]?=?false;
????????????????????????出臨界區;
????????????????end

??process?
0
????????????
while?true
????????????????
do?begin
????????????????flag[
1]?=true;
????turn?
=?0
??????????????????
while?flag[0]==true?and?turn?=?0
????????????????????????????
do?skip;//skip為空語句
????????????????????????臨界區;
????????????????????????flag[
1]?=?false;
????????????????????????出臨界區;
????????????????end

容易證明這種方法保證了互斥,對于進程0,一旦它設置flag[0]為true,進程1就不能進入其臨界段.若進程1已經在其臨界段中,那么flag[1]=true并且進程0被阻塞進入臨界段.另一方面,防止了相互阻塞,假設進程0阻塞于while循環,這意味著flag[1]為true,而且turn=1,當flag[1]為false或turn為0時,進程0就可進入自己的臨界段了.

總結

以上是生活随笔為你收集整理的操作系统复习笔记(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。