版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 操作系統(tǒng)課程設(shè)計(jì)</b></p><p> 題目:進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐</p><p> 所在學(xué)院:計(jì)算機(jī)學(xué)院</p><p> 所在班級(jí): </p><p><b> 學(xué)生姓名:</b></p><p><b&
2、gt; 學(xué)生學(xué)號(hào):</b></p><p> 指導(dǎo)教師: </p><p><b> 2014年 1 月</b></p><p><b> 題目</b></p><p> Linux或Windows或Unix環(huán)境下,采用系統(tǒng)調(diào)用中的信號(hào)量、P、V操作,編程解決以下
3、問(wèn)題。</p><p> 題目:某銀行提供5個(gè)服務(wù)窗口(4個(gè)對(duì)私服務(wù)窗口,1個(gè)對(duì)公服務(wù)窗口)和10個(gè)供顧客等待的座位。顧客到達(dá)銀行時(shí),若有空座位,則到取號(hào)機(jī)上領(lǐng)取一個(gè)號(hào),等待叫號(hào);若沒(méi)有空座位,則在門(mén)外等待或離開(kāi)。取號(hào)機(jī)每次僅允許一位顧客使用,有對(duì)公和對(duì)私兩類(lèi)號(hào),每位顧客只能選取其中一個(gè)。當(dāng)營(yíng)業(yè)員空閑時(shí),通過(guò)叫號(hào)選取一位顧客,并為其服務(wù)。請(qǐng)用P、V操作寫(xiě)出進(jìn)程的同步算法。</p><p>
4、;<b> 說(shuō)明</b></p><p> (1)可模擬設(shè)立一個(gè)服務(wù)時(shí)間區(qū)間如9:00-17:00,也可限定最大服務(wù)人數(shù)</p><p> (2)顧客達(dá)到時(shí)間隨機(jī),辦理對(duì)私或?qū)珮I(yè)務(wù)隨機(jī),可通過(guò)隨機(jī)數(shù)產(chǎn)生。</p><p><b> 要求打?。?lt;/b></p><p><b>
5、初始狀態(tài)</b></p><p><b> 中間變化的狀態(tài)信息</b></p><p> 以及最終狀態(tài)信息。 </p><p><b> 二、原理及算法</b></p><p> 顧客來(lái)了先判斷銀行內(nèi)是否還有空座位,如果沒(méi)有,則選擇等待或離開(kāi);如果有,便坐下,直到取號(hào)機(jī)無(wú)人使用再
6、去取號(hào),取完號(hào)顧客繼續(xù)等待服務(wù),服務(wù)完了顧客離開(kāi);</p><p> 五、主要數(shù)據(jù)結(jié)構(gòu)和流程</p><p><b> 1、主要數(shù)據(jù)結(jié)構(gòu)</b></p><p> 定義兩個(gè)全局變量統(tǒng)計(jì)顧客的號(hào)碼和在門(mén)外等待顧客的數(shù)量,定義四個(gè)線程句柄數(shù)組,定義一個(gè)座位信號(hào)量來(lái)通知可分配的座位資源,通知等待營(yíng)業(yè)員對(duì)私信號(hào)量通知可分配的等待對(duì)私資源,通知等待
7、營(yíng)業(yè)員對(duì)公信號(hào)量等待對(duì)公資源,通知對(duì)私叫號(hào)信號(hào)量通知可分配的等待通知對(duì)私服務(wù)資源,通知對(duì)公叫號(hào)信號(hào)量通知等待對(duì)公服務(wù)資源。在設(shè)置一個(gè)互斥信號(hào)量用于取號(hào)。再設(shè)置兩個(gè)臨界區(qū)來(lái)防止程序運(yùn)行重疊。</p><p><b> 2、PV流程</b></p><p> Semaphore seat;</p><p> seat.value=10;<
8、;/p><p> Semaphore privatewindow;</p><p> privatewindow.value=1;</p><p> Semaphore publicwindow;</p><p> publicwindow.value=4;</p><p> Semaphore machine;
9、</p><p> machine.value=1;</p><p> Semaphore privatecustomer;</p><p> privatecustomer.value=0;</p><p> Semaphore publiccustomer;</p><p> publiccustomer
10、.value=0;</p><p> process privatecustomer</p><p><b> {</b></p><p> if(seat=0)</p><p><b> {</b></p><p><b> 等待或離開(kāi);</b&g
11、t;</p><p><b> }</b></p><p><b> p(&seat);</b></p><p> p(&machine);</p><p><b> 取號(hào);</b></p><p> v(&machin
12、e);</p><p> P(&privatewindow);</p><p><b> 被服務(wù);</b></p><p><b> v(seat);</b></p><p><b> }</b></p><p> process pr
13、ivateserve</p><p><b> {</b></p><p> p(&privatecustomer);</p><p><b> 服務(wù);</b></p><p> v(&privatewindow);</p><p><b>
14、 }</b></p><p> process publiccustomer</p><p><b> {</b></p><p> if(seat=0)</p><p><b> {</b></p><p><b> 等待或離開(kāi);</
15、b></p><p><b> }</b></p><p><b> p(&seat);</b></p><p> p(&machine);</p><p><b> 取號(hào);</b></p><p> v(&mac
16、hine);</p><p> p(&publicwindow);</p><p><b> 被服務(wù);</b></p><p><b> v(seat);</b></p><p><b> }</b></p><p> process
17、publicserve</p><p><b> {</b></p><p> p(&publiccustomer);</p><p><b> 服務(wù);</b></p><p> v(&publicwindow);</p><p><b>
18、 }</b></p><p><b> 六、源程序清單</b></p><p> #include"stdafx.h"</p><p> #include"windows.h"</p><p> #include "time.h"</p
19、><p> #include<iostream></p><p> using namespace std;</p><p> #define StaticServer 1//私有服務(wù)</p><p> #define PublicServer 4//公有服務(wù)</p><p> #defi
20、ne Seat 10//桌位量</p><p> #define ServeTime 3000//服務(wù)時(shí)間</p><p> #define Customer_num 20//顧客數(shù)量</p><p> #define Customer_time 1000//顧客來(lái)的最大間隔時(shí)間</p><p> int n
21、umber = 0;//取號(hào)號(hào)碼</p><p> int seat_num=10;</p><p> HANDLE seat,s1,s2,cs1,cs2;</p><p> HANDLE mutex;//互斥量</p><p> HANDLE c1[10],c2[10],ss1[StaticServer],s
22、s2[PublicServer];//顧客,營(yíng)業(yè)員線程</p><p> CRITICAL_SECTION c_seat;//臨界區(qū),防止重疊</p><p> CRITICAL_SECTION x;</p><p> DWORD WINAPI server1(PVOID s1pv) //營(yíng)業(yè)員對(duì)私線程代碼</p><p><
23、b> {</b></p><p> while(true)</p><p><b> {</b></p><p> WaitForSingleObject(cs1,INFINITE);//p(&cs1)</p><p> Sleep(ServeTime);</p><
24、;p> EnterCriticalSection(&x);</p><p> cout<<"對(duì)私窗口叫號(hào)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p> ReleaseSemaphore(s1,1,NULL);//v(&s1)&
25、lt;/p><p> EnterCriticalSection(&c_seat);</p><p> seat_num++;</p><p> LeaveCriticalSection(&c_seat);</p><p><b> }</b></p><p><b>
26、 return 0;</b></p><p><b> }</b></p><p> DWORD WINAPI server2(PVOID s2pv) //營(yíng)業(yè)員對(duì)公線程代碼</p><p><b> {</b></p><p> while(true)</p>
27、<p><b> {</b></p><p> WaitForSingleObject(cs2,INFINITE);//p(&cs2)</p><p> Sleep(ServeTime);</p><p> EnterCriticalSection(&x);</p><p> cout
28、<<"對(duì)公窗口叫號(hào)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p> ReleaseSemaphore(s2,1,NULL);//v(&s2)</p><p> EnterCriticalSection(&c_seat);</p&g
29、t;<p> seat_num++;</p><p> LeaveCriticalSection(&c_seat);</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b>
30、</p><p> DWORD WINAPI consumer1(PVOID c1pv)//顧客對(duì)私線程代碼</p><p><b> {</b></p><p> srand((unsigned)time(0));</p><p> int n=rand()%2;</p><p> i
31、f(seat_num<=0&&n==1)</p><p><b> {</b></p><p> EnterCriticalSection(&x);</p><p> cout<<"座位已滿(mǎn),該顧客離開(kāi)!"<<endl;</p><p>
32、LeaveCriticalSection(&x);</p><p><b> }</b></p><p> else if(seat_num<=0)</p><p><b> {</b></p><p> seat_num--;</p><p> En
33、terCriticalSection(&x);</p><p> cout<<"該顧客在門(mén)外等待,已有"<<- seat_num<<"顧客在門(mén)外等待"<<endl;</p><p> LeaveCriticalSection(&x);</p><p><
34、b> }</b></p><p> EnterCriticalSection(&c_seat);</p><p> seat_num--;</p><p> LeaveCriticalSection(&c_seat);</p><p> WaitForSingleObject(seat,INFINI
35、TE);//p(&seat)</p><p> WaitForSingleObject(mutex,INFINITE);//p(&mutex)</p><p><b> number++;</b></p><p> int temp=number;</p><p> EnterCriticalSe
36、ction(&x);</p><p> cout<<"顧客"<<temp<<"已取號(hào),為"<<temp<<"號(hào)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p>
37、 ReleaseMutex(mutex);//v(&mutex)</p><p> ReleaseSemaphore(cs1,1,NULL);//v(&cs1)</p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<&
38、lt;"等待對(duì)私服務(wù)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p> Sleep(ServeTime);</p><p> WaitForSingleObject(s1,INFINITE);//p(&s1)</p><p> En
39、terCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"正在被服務(wù)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p> Sleep(ServeTime);&
40、lt;/p><p> ReleaseSemaphore(seat,1,NULL);//v(&seat)</p><p> seat_num++;</p><p> if(seat_num<=0)</p><p><b> {</b></p><p> EnterCritical
41、Section(&x);</p><p> cout<<"門(mén)外還剩"<<-seat_num<<"人在等待。"<<endl;</p><p> LeaveCriticalSection(&x);</p><p><b> }</b><
42、;/p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"已經(jīng)被對(duì)私服務(wù),已離開(kāi)!"<<endl;</p><p> LeaveCriticalSection(&x);</p>&
43、lt;p><b> return 0;</b></p><p><b> }</b></p><p> DWORD WINAPI consumer2(PVOID c2pv)//顧客對(duì)公線程代碼</p><p><b> {</b></p><p> srand(
44、(unsigned)time(0));</p><p> int n=rand()%2;</p><p> if( seat_num<=0&&n==1)</p><p><b> {</b></p><p> EnterCriticalSection(&x);</p>
45、<p> cout<<"座位已滿(mǎn),該顧客離開(kāi)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p><b> }</b></p><p> else if(seat_num<=0)</p><p&g
46、t;<b> {</b></p><p> seat_num--;</p><p> EnterCriticalSection(&x);</p><p> cout<<"該顧客在門(mén)外等待,已有"<<- seat_num<<"顧客在門(mén)外等待"<<
47、;endl;</p><p> LeaveCriticalSection(&x);</p><p><b> }</b></p><p> EnterCriticalSection(&c_seat);</p><p> seat_num--;</p><p> Leave
48、CriticalSection(&c_seat);</p><p> WaitForSingleObject(seat,INFINITE);//p(&seat)</p><p> WaitForSingleObject(mutex,INFINITE);//p(&mutex)</p><p><b> number++;<
49、/b></p><p> int temp=number;</p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"已取號(hào),為"<<temp<<"號(hào)!"<
50、;<endl;</p><p> LeaveCriticalSection(&x);</p><p> ReleaseMutex(mutex);//v(&mutex)</p><p> ReleaseSemaphore(cs2,1,NULL);//v(&cs2)</p><p> EnterCritica
51、lSection(&x);</p><p> cout<<"顧客"<<temp<<"等待對(duì)公服務(wù)!"<<endl;</p><p> LeaveCriticalSection(&x);</p><p> Sleep(ServeTime);</p>
52、<p> WaitForSingleObject(s2,INFINITE);//p(&s2)</p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"正在被服務(wù)!"<<endl;</p>
53、<p> LeaveCriticalSection(&x);</p><p> Sleep(ServeTime);</p><p> ReleaseSemaphore(seat,1,NULL);//v(&seat)</p><p> seat_num++;</p><p> if(seat_num<
54、;=0)</p><p><b> {</b></p><p> EnterCriticalSection(&x);</p><p> cout<<"門(mén)外還剩"<<-seat_num<<"人在等待。"<<endl;</p><
55、;p> LeaveCriticalSection(&x);</p><p><b> }</b></p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"已經(jīng)被對(duì)公服務(wù),已離開(kāi)!&
56、quot;<<endl;</p><p> LeaveCriticalSection(&x);</p><p><b> return 0;</b></p><p><b> }</b></p><p> int main(void)//主程序</p>&l
57、t;p> {//創(chuàng)建信號(hào)量和線程</p><p> cout<<"顧客您好,歡迎來(lái)到我行,很高興為您服務(wù)!"<<endl;</p><p> seat = CreateSemaphore(NULL,Seat , Seat, NULL);</p><p> s1 = CreateSemaphore(NULL,
58、0 , StaticServer , NULL);</p><p> s2 = CreateSemaphore(NULL, 0 , PublicServer , NULL);</p><p> cs1 = CreateSemaphore(NULL, 0 , Seat , NULL);</p><p> cs2 = CreateSemaphore(NULL, 0
59、 , Seat , NULL);</p><p> mutex = CreateMutex(NULL,FALSE,NULL);</p><p> InitializeCriticalSection(&x);</p><p> InitializeCriticalSection(&c_seat);</p><p><
60、b> int n,n1;</b></p><p> for(n=0;n<StaticServer;n++)</p><p> CreateThread(NULL,0,server1,NULL,0,NULL);</p><p> for(n=0;n<PublicServer;n++)</p><p> C
61、reateThread(NULL,0,server2,NULL,0,NULL);</p><p> srand( (unsigned)time( NULL ) );</p><p><b> n=0;n1=0;</b></p><p> for(;number<Customer_num;)//用隨機(jī)數(shù)來(lái)判斷顧客是對(duì)私還是對(duì)公&
62、lt;/p><p><b> {</b></p><p> int m=rand()%Customer_time;</p><p><b> Sleep(m);</b></p><p> int i=rand()%2;</p><p><b> if(i==0
63、)</b></p><p><b> {</b></p><p> CreateThread(NULL,0,consumer1,NULL,0,NULL);</p><p><b> n++;</b></p><p><b> }</b></p>
64、<p><b> else</b></p><p><b> {</b></p><p> CreateThread(NULL,0,consumer2,NULL,0,NULL);</p><p><b> n1++;</b></p><p><b>
65、; }</b></p><p><b> } </b></p><p> Sleep(2000);</p><p> cout<<"銀行結(jié)束服務(wù),祝您愉快!"<<endl;</p><p><b> return 0;</b><
66、/p><p><b> }</b></p><p> 七、實(shí)驗(yàn)結(jié)果及程序分析</p><p><b> 1、實(shí)驗(yàn)結(jié)果:</b></p><p><b> 2、結(jié)果分析:</b></p><p> 當(dāng)顧客來(lái)了,首先查看是否有桌位,沒(méi)有桌位顧客選擇在門(mén)
67、口等待或者離開(kāi),若有桌位就去取號(hào),取完號(hào)之后等待服務(wù),當(dāng)營(yíng)業(yè)員叫號(hào)以后開(kāi)始被服務(wù),服務(wù)完了之后離開(kāi)。當(dāng)所有線程執(zhí)行完了之后程序結(jié)束。</p><p><b> 八、課設(shè)總結(jié)</b></p><p> 通過(guò)此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)操作系PV操作,在設(shè)計(jì)過(guò)程中雖然遇到了一些問(wèn)題,但經(jīng)過(guò)一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我
68、在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過(guò)親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。</p><p> 過(guò)而能改,善莫大焉。在課程設(shè)計(jì)過(guò)程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,本身就是在踐行“過(guò)而能改,善莫大焉”的知行觀。這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多問(wèn)題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會(huì)的發(fā)展和學(xué)習(xí)實(shí)踐過(guò)程中,一定要不懈努力,不能遇到問(wèn)題就想到要退縮,一定要不厭其煩的發(fā)
69、現(xiàn)問(wèn)題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會(huì)及他人對(duì)你的認(rèn)可!</p><p> 我認(rèn)為,在這學(xué)期的實(shí)驗(yàn)中,不僅培養(yǎng)了獨(dú)立思考、動(dòng)手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實(shí)驗(yàn)課上,我們學(xué)會(huì)了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對(duì)社會(huì)的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)
70、踐,再學(xué)習(xí)、再實(shí)踐。這對(duì)于我們的將來(lái)也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂(lè),找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國(guó)提倡的艱苦奮斗一樣,我們都可以在實(shí)驗(yàn)結(jié)束之后變的更加成熟,會(huì)面對(duì)需要面對(duì)的事情。</p><p> 回顧起此課程設(shè)計(jì),至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說(shuō)得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐
- 算法課程設(shè)計(jì)---進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—多進(jìn)程同步橘子蘋(píng)果問(wèn)題
- 進(jìn)程同步典型例題操作系統(tǒng)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程的軟中斷通信與管道通信
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程控制課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程的創(chuàng)建
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 進(jìn)程之間的同步互斥與通信理發(fā)師問(wèn)題操作系統(tǒng)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論