版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 操作系統(tǒng)課程設(shè)計</b></p><p> 題目:進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐</p><p> 所在學(xué)院:計算機(jī)學(xué)院</p><p> 所在班級: </p><p><b> 學(xué)生姓名:</b></p><p><b&
2、gt; 學(xué)生學(xué)號:</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)用中的信號量、P、V操作,編程解決以下
3、問題。</p><p> 題目:某銀行提供5個服務(wù)窗口(4個對私服務(wù)窗口,1個對公服務(wù)窗口)和10個供顧客等待的座位。顧客到達(dá)銀行時,若有空座位,則到取號機(jī)上領(lǐng)取一個號,等待叫號;若沒有空座位,則在門外等待或離開。取號機(jī)每次僅允許一位顧客使用,有對公和對私兩類號,每位顧客只能選取其中一個。當(dāng)營業(yè)員空閑時,通過叫號選取一位顧客,并為其服務(wù)。請用P、V操作寫出進(jìn)程的同步算法。</p><p>
4、;<b> 說明</b></p><p> (1)可模擬設(shè)立一個服務(wù)時間區(qū)間如9:00-17:00,也可限定最大服務(wù)人數(shù)</p><p> (2)顧客達(dá)到時間隨機(jī),辦理對私或?qū)珮I(yè)務(wù)隨機(jī),可通過隨機(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> 顧客來了先判斷銀行內(nèi)是否還有空座位,如果沒有,則選擇等待或離開;如果有,便坐下,直到取號機(jī)無人使用再
6、去取號,取完號顧客繼續(xù)等待服務(wù),服務(wù)完了顧客離開;</p><p> 五、主要數(shù)據(jù)結(jié)構(gòu)和流程</p><p><b> 1、主要數(shù)據(jù)結(jié)構(gòu)</b></p><p> 定義兩個全局變量統(tǒng)計顧客的號碼和在門外等待顧客的數(shù)量,定義四個線程句柄數(shù)組,定義一個座位信號量來通知可分配的座位資源,通知等待營業(yè)員對私信號量通知可分配的等待對私資源,通知等待
7、營業(yè)員對公信號量等待對公資源,通知對私叫號信號量通知可分配的等待通知對私服務(wù)資源,通知對公叫號信號量通知等待對公服務(wù)資源。在設(shè)置一個互斥信號量用于取號。再設(shè)置兩個臨界區(qū)來防止程序運(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> 等待或離開;</b&g
11、t;</p><p><b> }</b></p><p><b> p(&seat);</b></p><p> p(&machine);</p><p><b> 取號;</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> 等待或離開;</
15、b></p><p><b> }</b></p><p><b> p(&seat);</b></p><p> p(&machine);</p><p><b> 取號;</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ù)時間</p><p> #define Customer_num 20//顧客數(shù)量</p><p> #define Customer_time 1000//顧客來的最大間隔時間</p><p> int n
21、umber = 0;//取號號碼</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è)員線程</p><p> CRITICAL_SECTION c_seat;//臨界區(qū),防止重疊</p><p> CRITICAL_SECTION x;</p><p> DWORD WINAPI server1(PVOID s1pv) //營業(yè)員對私線程代碼</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<<"對私窗口叫號!"<<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è)員對公線程代碼</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、<<"對公窗口叫號!"<<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)//顧客對私線程代碼</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<<"座位已滿,該顧客離開!"<<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<<"該顧客在門外等待,已有"<<- seat_num<<"顧客在門外等待"<<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<<"已取號,為"<<temp<<"號!"<<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;"等待對私服務(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<<"門外還剩"<<-seat_num<<"人在等待。"<<endl;</p><p> LeaveCriticalSection(&x);</p><p><b> }</b><
42、;/p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"已經(jīng)被對私服務(wù),已離開!"<<endl;</p><p> LeaveCriticalSection(&x);</p>&
43、lt;p><b> return 0;</b></p><p><b> }</b></p><p> DWORD WINAPI consumer2(PVOID c2pv)//顧客對公線程代碼</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<<"座位已滿,該顧客離開!"<<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<<"該顧客在門外等待,已有"<<- seat_num<<"顧客在門外等待"<<
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<<"已取號,為"<<temp<<"號!"<
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<<"等待對公服務(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<<"門外還剩"<<-seat_num<<"人在等待。"<<endl;</p><
55、;p> LeaveCriticalSection(&x);</p><p><b> }</b></p><p> EnterCriticalSection(&x);</p><p> cout<<"顧客"<<temp<<"已經(jīng)被對公服務(wù),已離開!&
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)建信號量和線程</p><p> cout<<"顧客您好,歡迎來到我行,很高興為您服務(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ù)來判斷顧客是對私還是對公&
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)顧客來了,首先查看是否有桌位,沒有桌位顧客選擇在門
67、口等待或者離開,若有桌位就去取號,取完號之后等待服務(wù),當(dāng)營業(yè)員叫號以后開始被服務(wù),服務(wù)完了之后離開。當(dāng)所有線程執(zhí)行完了之后程序結(jié)束。</p><p><b> 八、課設(shè)總結(jié)</b></p><p> 通過此次課程設(shè)計,使我更加扎實(shí)的掌握了有關(guān)操作系PV操作,在設(shè)計過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我
68、在這方面的知識欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。</p><p> 過而能改,善莫大焉。在課程設(shè)計過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領(lǐng)悟,本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多問題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)
69、現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會及他人對你的認(rèn)可!</p><p> 我認(rèn)為,在這學(xué)期的實(shí)驗(yàn)中,不僅培養(yǎng)了獨(dú)立思考、動手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實(shí)驗(yàn)課上,我們學(xué)會了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)
70、踐,再學(xué)習(xí)、再實(shí)踐。這對于我們的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我們都可以在實(shí)驗(yàn)結(jié)束之后變的更加成熟,會面對需要面對的事情。</p><p> 回顧起此課程設(shè)計,至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐
- 算法課程設(shè)計---進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計報告—多進(jìn)程同步橘子蘋果問題
- 進(jìn)程同步典型例題操作系統(tǒng)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進(jìn)程的軟中斷通信與管道通信
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---進(jìn)程管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)進(jìn)程控制課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---進(jìn)程的創(chuàng)建
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進(jìn)程調(diào)度算法
- 進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計
評論
0/150
提交評論