

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