操作系统复习笔记(四)
生活随笔
收集整理的這篇文章主要介紹了
操作系统复习笔记(四)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
10.司機(jī)和售票員之間要協(xié)同工作:一方面只有售票員把車門關(guān)好了司機(jī)才能開車,因此售票員關(guān)好車門應(yīng)通知司機(jī)開車;另一方面只有當(dāng)汽車已經(jīng)停下時(shí),售票員才能開門讓乘客上下客,司機(jī)停車后應(yīng)該通知售票員,假定某輛汽車有一名司機(jī)和兩名售票員,汽車當(dāng)前正在始法站停車上客,
分析:???活動(dòng)規(guī)律:
???????? 司機(jī)??????????????? 售票員(2名)
??????? 啟動(dòng)車輛??????????? 上乘客
??????? 正常行駛?????????????關(guān)車門
??????? 到站停車??????????? 售票
???????????????????????????????????????開車門
?????????????????????????????????????下乘客
售票員關(guān)好車門應(yīng)該通知司機(jī)開車,因此要設(shè)置一個(gè)信號(hào)量用于司機(jī)判斷是否可以啟動(dòng)車輛;此外,當(dāng)汽車到站停下時(shí),司機(jī)停車后要通知售票員,所以也要設(shè)置一個(gè)信號(hào)量用于通知售票員打開車門.由于有兩名售票員,因此相應(yīng)的信號(hào)量都需要設(shè)置兩個(gè).
?begin?
??????????????????var?stop1=0,stop2=0,run1=0,run2=0:semaphore;
????????????????????cobegin
????????????????????????process?driver
????????????????????????????begin
???????????????????????????????repeat
????????????????????????????????????p(run1);
????????????????????????????????????p(run2);
????????????????啟動(dòng)車輛;
????????正常行駛;
????????到站停車;
????????????????v(stop1);
????????????????v(stop2);
????????????????????????????end
????????????????????????process?conductor1
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關(guān)車門;
????????v(run1);
????????售票;
????????p(stop1);
????????開車門;
????????下乘客;
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關(guān)車門;
????????v(run2);
????????售票;
????????p(stop2);
????????開車門;
????????下乘客;
???????????????????????????end
???????????????coend
????end
注:這是售票員優(yōu)先的方式,若以司機(jī)優(yōu)先的方式,程序如下:
?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);
????????開車門;
????????售票;
????????關(guān)車門;
????????v(run1);
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
?????????????????p(stop2);
????????開車門;
????????售票;
????????關(guān)車門;
????????v(run2);
???????????????????????????end
???????????????coend
????end
11.兩個(gè)學(xué)校之間有一條路,其中從s到t一段路每次只允許一輛車通過,但中間有一個(gè)小的"安全島"M(同時(shí)允許兩輛車停留),可供兩輛車已經(jīng)從兩端進(jìn)入小路的情況下錯(cuò)車使用.
分析:由于安全島M僅僅允許兩輛車停留,本應(yīng)該作為臨界資源而要設(shè)置信號(hào)量,但根據(jù)題意,任意時(shí)刻進(jìn)入安全島的車不會(huì)超過兩輛(兩個(gè)方向最多各有一輛),因此,不需要為M設(shè)置信號(hào)量,在路口s和路口t都需要設(shè)置信號(hào)量,以控制來自兩個(gè)方向的車對(duì)路口資源的爭(zhēng)奪.這兩個(gè)信號(hào)量的初值都是1.此外,由于從s到t的一段路只允許一輛車通過,所以還需要設(shè)置另外的信號(hào)量用于控制,由于M的存在,可以為兩端的小路分別設(shè)置一個(gè)互斥信號(hào)量.
begin?
??????????????????var?s=1,t=1,sk=1,lt=1:semaphore;
????????????????????cobegin
????????????????????????process?p1
????????????????????????????begin
???????????????????????????????repeat
????????p(s);
????????p(sk);
????????通過sk路段;
????????進(jìn)入安全島M;
?????????????????v(sk);
????????p(lt);
????????通過lt路段;
????????v(lt);
????????v(s);
????????until?false
????????????????????????????end
??????process?p2
????????????????????????????begin
??????????????????????????repeat;
???????????????p(t);
????????p(lt);
????????通過sk路段;
????????進(jìn)入安全島M;
?????????????????v(lt);
????????p(sk);
????????通過lt路段;
????????v(sk);
????????v(t);
????????until?false
???????????????????????????end
???????????????coend
????end
12.有一個(gè)理發(fā)師,一把理發(fā)椅和n把供等候理發(fā)的顧客坐的椅子,若沒有顧客,則理發(fā)師睡覺,當(dāng)一個(gè)顧客到來時(shí),必須喚醒理發(fā)師進(jìn)行理發(fā),若理發(fā)師正在理發(fā),又有顧客到來,則若有空椅子可坐就坐下來等,若沒有空椅子就離開.
分析:需要設(shè)置一個(gè)信號(hào)量barber,初值為0,用于控制理發(fā)師和顧客之間的同步關(guān)系.還需要設(shè)置一個(gè)信號(hào)量customer,初值為0,用于離開顧客與等候顧客之間的同步控制,為了記錄等候的顧客數(shù),應(yīng)該設(shè)置一個(gè)計(jì)數(shù)器count,初值為0.當(dāng)一個(gè)顧客到達(dá)時(shí),需要在count上做加1操作,并根據(jù)count值的不同分別采取不同的動(dòng)作,當(dāng)顧客離開時(shí),要對(duì)count上做減1操作,并根據(jù)count值的不同分別采取不同的動(dòng)作;由于count是共享變量,因此要互斥使用,為此設(shè)置一個(gè)互斥信號(hào)量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);
????????理發(fā);
????????until?false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(mutex);
????????if(count<n)
????????{
????????????count?=?count?+1;
????????????v(customer);
????????????p(barber);
???????????????????理發(fā);
????????}
????????else
????????{
????????????v(mutex);
????????????離開;
????????}
????????until?false
???????????????????????????end
???????????????coend
????end
注:變形:有3個(gè)理發(fā)師,3把理發(fā)椅子,n把供等候理發(fā)的顧客坐的椅子.由于有3位理發(fā)師,所以一次同時(shí)可以為三個(gè)顧客服務(wù),設(shè)置信號(hào)量max_capacity,用于表示空閑椅子的數(shù)量,初值為n.信號(hào)量barber_chair表示空閑理發(fā)師(椅)的數(shù)量,初值為3;信號(hào)量cust_ready,finished,leave_b_chair分別表示是否有顧客到來,理發(fā)完成,離開理發(fā)椅,它們的初值都為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);
????????理發(fā);
????????until?false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(max_capacity);//是否有空閑椅子;
????????進(jìn)入店里;
????????p(barber_chair);//是否有空閑的理發(fā)椅;
????????坐在理發(fā)椅上;
????????v(cust_ready);//喚醒理發(fā)師;
????????p(finished);//是否完成理發(fā);
????????離開理發(fā)椅;
????????v(leave_b_chair);
????????離開店;
????????v(max_capacity);
????????until?false
???????????????????????????end
???????????????coend
????end
13.進(jìn)程p0,p1共享變量flag,turn;他們進(jìn)入臨界區(qū)的算法如下:
?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
????????????????????????臨界區(qū);
????????????????????????flag[i]?=?false;
????????????????????????出臨界區(qū);
????????????????end
該算法能否正確地實(shí)現(xiàn)互斥?若不能,應(yīng)該如何修改(假設(shè)flag,turn單元內(nèi)容的修改和訪問是互斥的).
分析:不能正確實(shí)現(xiàn)互斥.考慮如下情況:process0先執(zhí)行到flag[0] = true,process1開始執(zhí)行,進(jìn)入內(nèi)循環(huán)時(shí),將turn設(shè)置為1;此時(shí)進(jìn)程調(diào)度轉(zhuǎn)到process0,process0可以進(jìn)入內(nèi)循環(huán),由于flag[1]的值為true,所以process0再次將turn的值設(shè)置為0,重復(fù)上述操作,兩個(gè)進(jìn)程誰也不能進(jìn)入臨界區(qū).
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為空語句
????????????????????????臨界區(qū);
????????????????????????flag[0]?=?false;
????????????????????????出臨界區(qū);
????????????????end
??process?0
????????????while?true
????????????????do?begin
????????????????flag[1]?=true;
????turn?=?0
??????????????????while?flag[0]==true?and?turn?=?0
????????????????????????????do?skip;//skip為空語句
????????????????????????臨界區(qū);
????????????????????????flag[1]?=?false;
????????????????????????出臨界區(qū);
????????????????end
容易證明這種方法保證了互斥,對(duì)于進(jìn)程0,一旦它設(shè)置flag[0]為true,進(jìn)程1就不能進(jìn)入其臨界段.若進(jìn)程1已經(jīng)在其臨界段中,那么flag[1]=true并且進(jìn)程0被阻塞進(jìn)入臨界段.另一方面,防止了相互阻塞,假設(shè)進(jìn)程0阻塞于while循環(huán),這意味著flag[1]為true,而且turn=1,當(dāng)flag[1]為false或turn為0時(shí),進(jìn)程0就可進(jìn)入自己的臨界段了.
分析:???活動(dòng)規(guī)律:
???????? 司機(jī)??????????????? 售票員(2名)
??????? 啟動(dòng)車輛??????????? 上乘客
??????? 正常行駛?????????????關(guān)車門
??????? 到站停車??????????? 售票
???????????????????????????????????????開車門
?????????????????????????????????????下乘客
售票員關(guān)好車門應(yīng)該通知司機(jī)開車,因此要設(shè)置一個(gè)信號(hào)量用于司機(jī)判斷是否可以啟動(dòng)車輛;此外,當(dāng)汽車到站停下時(shí),司機(jī)停車后要通知售票員,所以也要設(shè)置一個(gè)信號(hào)量用于通知售票員打開車門.由于有兩名售票員,因此相應(yīng)的信號(hào)量都需要設(shè)置兩個(gè).
?begin?
??????????????????var?stop1=0,stop2=0,run1=0,run2=0:semaphore;
????????????????????cobegin
????????????????????????process?driver
????????????????????????????begin
???????????????????????????????repeat
????????????????????????????????????p(run1);
????????????????????????????????????p(run2);
????????????????啟動(dòng)車輛;
????????正常行駛;
????????到站停車;
????????????????v(stop1);
????????????????v(stop2);
????????????????????????????end
????????????????????????process?conductor1
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關(guān)車門;
????????v(run1);
????????售票;
????????p(stop1);
????????開車門;
????????下乘客;
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
???????????????????上乘客;
????????關(guān)車門;
????????v(run2);
????????售票;
????????p(stop2);
????????開車門;
????????下乘客;
???????????????????????????end
???????????????coend
????end
注:這是售票員優(yōu)先的方式,若以司機(jī)優(yōu)先的方式,程序如下:
?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);
????????開車門;
????????售票;
????????關(guān)車門;
????????v(run1);
???????????????????????????end
????????????????????????process?conductor2
????????????????????????????begin
??????????????????????repeat;
?????????????????p(stop2);
????????開車門;
????????售票;
????????關(guān)車門;
????????v(run2);
???????????????????????????end
???????????????coend
????end
11.兩個(gè)學(xué)校之間有一條路,其中從s到t一段路每次只允許一輛車通過,但中間有一個(gè)小的"安全島"M(同時(shí)允許兩輛車停留),可供兩輛車已經(jīng)從兩端進(jìn)入小路的情況下錯(cuò)車使用.
分析:由于安全島M僅僅允許兩輛車停留,本應(yīng)該作為臨界資源而要設(shè)置信號(hào)量,但根據(jù)題意,任意時(shí)刻進(jìn)入安全島的車不會(huì)超過兩輛(兩個(gè)方向最多各有一輛),因此,不需要為M設(shè)置信號(hào)量,在路口s和路口t都需要設(shè)置信號(hào)量,以控制來自兩個(gè)方向的車對(duì)路口資源的爭(zhēng)奪.這兩個(gè)信號(hào)量的初值都是1.此外,由于從s到t的一段路只允許一輛車通過,所以還需要設(shè)置另外的信號(hào)量用于控制,由于M的存在,可以為兩端的小路分別設(shè)置一個(gè)互斥信號(hào)量.
begin?
??????????????????var?s=1,t=1,sk=1,lt=1:semaphore;
????????????????????cobegin
????????????????????????process?p1
????????????????????????????begin
???????????????????????????????repeat
????????p(s);
????????p(sk);
????????通過sk路段;
????????進(jìn)入安全島M;
?????????????????v(sk);
????????p(lt);
????????通過lt路段;
????????v(lt);
????????v(s);
????????until?false
????????????????????????????end
??????process?p2
????????????????????????????begin
??????????????????????????repeat;
???????????????p(t);
????????p(lt);
????????通過sk路段;
????????進(jìn)入安全島M;
?????????????????v(lt);
????????p(sk);
????????通過lt路段;
????????v(sk);
????????v(t);
????????until?false
???????????????????????????end
???????????????coend
????end
12.有一個(gè)理發(fā)師,一把理發(fā)椅和n把供等候理發(fā)的顧客坐的椅子,若沒有顧客,則理發(fā)師睡覺,當(dāng)一個(gè)顧客到來時(shí),必須喚醒理發(fā)師進(jìn)行理發(fā),若理發(fā)師正在理發(fā),又有顧客到來,則若有空椅子可坐就坐下來等,若沒有空椅子就離開.
分析:需要設(shè)置一個(gè)信號(hào)量barber,初值為0,用于控制理發(fā)師和顧客之間的同步關(guān)系.還需要設(shè)置一個(gè)信號(hào)量customer,初值為0,用于離開顧客與等候顧客之間的同步控制,為了記錄等候的顧客數(shù),應(yīng)該設(shè)置一個(gè)計(jì)數(shù)器count,初值為0.當(dāng)一個(gè)顧客到達(dá)時(shí),需要在count上做加1操作,并根據(jù)count值的不同分別采取不同的動(dòng)作,當(dāng)顧客離開時(shí),要對(duì)count上做減1操作,并根據(jù)count值的不同分別采取不同的動(dòng)作;由于count是共享變量,因此要互斥使用,為此設(shè)置一個(gè)互斥信號(hào)量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);
????????理發(fā);
????????until?false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(mutex);
????????if(count<n)
????????{
????????????count?=?count?+1;
????????????v(customer);
????????????p(barber);
???????????????????理發(fā);
????????}
????????else
????????{
????????????v(mutex);
????????????離開;
????????}
????????until?false
???????????????????????????end
???????????????coend
????end
注:變形:有3個(gè)理發(fā)師,3把理發(fā)椅子,n把供等候理發(fā)的顧客坐的椅子.由于有3位理發(fā)師,所以一次同時(shí)可以為三個(gè)顧客服務(wù),設(shè)置信號(hào)量max_capacity,用于表示空閑椅子的數(shù)量,初值為n.信號(hào)量barber_chair表示空閑理發(fā)師(椅)的數(shù)量,初值為3;信號(hào)量cust_ready,finished,leave_b_chair分別表示是否有顧客到來,理發(fā)完成,離開理發(fā)椅,它們的初值都為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);
????????理發(fā);
????????until?false
????????????????????????????end
??????????process?customer
????????????????????????????begin
??????????????????????????repeat;
????????p(max_capacity);//是否有空閑椅子;
????????進(jìn)入店里;
????????p(barber_chair);//是否有空閑的理發(fā)椅;
????????坐在理發(fā)椅上;
????????v(cust_ready);//喚醒理發(fā)師;
????????p(finished);//是否完成理發(fā);
????????離開理發(fā)椅;
????????v(leave_b_chair);
????????離開店;
????????v(max_capacity);
????????until?false
???????????????????????????end
???????????????coend
????end
13.進(jìn)程p0,p1共享變量flag,turn;他們進(jìn)入臨界區(qū)的算法如下:
?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
????????????????????????臨界區(qū);
????????????????????????flag[i]?=?false;
????????????????????????出臨界區(qū);
????????????????end
該算法能否正確地實(shí)現(xiàn)互斥?若不能,應(yīng)該如何修改(假設(shè)flag,turn單元內(nèi)容的修改和訪問是互斥的).
分析:不能正確實(shí)現(xiàn)互斥.考慮如下情況:process0先執(zhí)行到flag[0] = true,process1開始執(zhí)行,進(jìn)入內(nèi)循環(huán)時(shí),將turn設(shè)置為1;此時(shí)進(jìn)程調(diào)度轉(zhuǎn)到process0,process0可以進(jìn)入內(nèi)循環(huán),由于flag[1]的值為true,所以process0再次將turn的值設(shè)置為0,重復(fù)上述操作,兩個(gè)進(jìn)程誰也不能進(jìn)入臨界區(qū).
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為空語句
????????????????????????臨界區(qū);
????????????????????????flag[0]?=?false;
????????????????????????出臨界區(qū);
????????????????end
??process?0
????????????while?true
????????????????do?begin
????????????????flag[1]?=true;
????turn?=?0
??????????????????while?flag[0]==true?and?turn?=?0
????????????????????????????do?skip;//skip為空語句
????????????????????????臨界區(qū);
????????????????????????flag[1]?=?false;
????????????????????????出臨界區(qū);
????????????????end
容易證明這種方法保證了互斥,對(duì)于進(jìn)程0,一旦它設(shè)置flag[0]為true,進(jìn)程1就不能進(jìn)入其臨界段.若進(jìn)程1已經(jīng)在其臨界段中,那么flag[1]=true并且進(jìn)程0被阻塞進(jìn)入臨界段.另一方面,防止了相互阻塞,假設(shè)進(jìn)程0阻塞于while循環(huán),這意味著flag[1]為true,而且turn=1,當(dāng)flag[1]為false或turn為0時(shí),進(jìn)程0就可進(jìn)入自己的臨界段了.
總結(jié)
以上是生活随笔為你收集整理的操作系统复习笔记(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算器上的十一X÷叫什么键
- 下一篇: [翻译]Windows Vista的秘密