進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)_第1頁
進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)_第2頁
進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)_第3頁
進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)_第4頁
進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 操作系統(tǒng)課程設(shè)計(jì)目 錄1. 課程設(shè)計(jì)目的32. 設(shè)計(jì)要求33. 問題具體描述34. 設(shè)計(jì)分析35. 設(shè)計(jì)分工46. 數(shù)據(jù)結(jié)構(gòu)說明47. 系統(tǒng)結(jié)構(gòu)說明48. 系統(tǒng)調(diào)用說明49. 分工設(shè)計(jì)說明510. 算法流程圖511. 分工代碼612. 整體代碼713. 程序運(yùn)行1014. 總結(jié)111. 課程設(shè)計(jì)目的1.內(nèi)容圍繞操作系統(tǒng)原理中最重要的基本概念和基本原理展開2.鞏固對(duì)原理知識(shí)的學(xué)習(xí)效果3.加深對(duì)基本概念的理解4.學(xué)習(xí)如何將基本原理和實(shí)際設(shè)計(jì)、應(yīng)用有機(jī)結(jié)合5.鍛煉本專業(yè)的基本能力2. 設(shè)計(jì)要求1: 進(jìn)程間通信、并發(fā)(同步/互斥)、文件讀寫2: 內(nèi)存管理、Dll、Windows消息機(jī)制、IO (尚未

2、最終定型)3. 問題具體描述1.完成N個(gè)生產(chǎn)者和M個(gè)消費(fèi)者之間的并發(fā)控制,N、M不低于5,數(shù)據(jù)發(fā)送和接收緩沖區(qū) 大小不小于10個(gè)。2.某個(gè)生產(chǎn)者進(jìn)程生產(chǎn)的消息供K個(gè)消費(fèi)者進(jìn)程消費(fèi)。K=M。某些消費(fèi)進(jìn)程消費(fèi)多個(gè)生產(chǎn)者生產(chǎn)的消息。生產(chǎn)者和消費(fèi)者之間的對(duì)應(yīng)關(guān)系可以在程序開始有一個(gè)文件中讀入,也可以動(dòng)態(tài)調(diào)整。3.每個(gè)生產(chǎn)進(jìn)程生產(chǎn)M個(gè)消息后結(jié)束運(yùn)行。如果一個(gè)消費(fèi)者進(jìn)程沒有對(duì)應(yīng)的生產(chǎn)者進(jìn)程在運(yùn)行后,也結(jié)束運(yùn)行。4. 設(shè)計(jì)分析課程設(shè)計(jì)的主要目的是了解并且掌握進(jìn)程之間的同步互斥,和進(jìn)程之間的通信問題。結(jié)合課本上的生產(chǎn)者與消費(fèi)者問題可以從這方面來實(shí)現(xiàn)一個(gè)多進(jìn)程的小系統(tǒng),并且解決多個(gè)進(jìn)程之間的通信,并發(fā)等問題,以

3、此來達(dá)到課程設(shè)計(jì)的目的。理發(fā)師問題是將顧客看做生產(chǎn)者,將理發(fā)師作為消費(fèi)者。設(shè)置一定數(shù)量的椅子的數(shù)目來作為緩存區(qū)的大小。顧客來到的時(shí)候坐在椅子上,將自己作為“產(chǎn)品”,理發(fā)師理發(fā)的時(shí)候從椅子上叫走顧客,相當(dāng)于消費(fèi)“產(chǎn)品”,從而達(dá)到了課程設(shè)計(jì)要求的前一個(gè)要求。顧客作為生產(chǎn)者,每到來一個(gè)就使計(jì)數(shù)器count增加1,以便讓理發(fā)師理發(fā)(相當(dāng)于消費(fèi))至最后一個(gè)顧客(相當(dāng)于產(chǎn)品)。并且,第1個(gè)到來的顧客應(yīng)負(fù)責(zé)喚醒理發(fā)師;如果不是第1個(gè)到達(dá)的顧客,則在有空椅子的情況下坐下等待,否則離開理發(fā)店(該消息可由計(jì)數(shù)器count獲得)。主要有以下一些函數(shù)來實(shí)現(xiàn)整個(gè)問題的實(shí)現(xiàn)過程:(1) 用隨機(jī)函數(shù)random()來產(chǎn)生進(jìn)

4、入理發(fā)店的顧客。(2)定義理發(fā)師的理發(fā)函數(shù)cuthair()用來實(shí)現(xiàn)理發(fā)操作。(3)定義顧客被理發(fā)的函數(shù)gethaircut()用來實(shí)現(xiàn)顧客被理發(fā)的操作。(4)用顧客線程customer實(shí)現(xiàn)對(duì)顧客行為的控制。(5)用理發(fā)師線程barber實(shí)現(xiàn)對(duì)理發(fā)師行為的控制。(6)定義主函數(shù)main實(shí)現(xiàn)對(duì)兩個(gè)線程的控制和執(zhí)行操作。5. 設(shè)計(jì)分工成員:李寧 侯紹立分工:理發(fā)師進(jìn)程、信號(hào)量的設(shè)置、理發(fā)師函數(shù) :xxx顧客進(jìn)程、顧客函數(shù)、主函數(shù):xx6. 數(shù)據(jù)結(jié)構(gòu)說明本程序用到了數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列,理發(fā)的顧客由隨機(jī)函數(shù)產(chǎn)生,顧客遵從先到先理發(fā)的原則,但隊(duì)列的長度限制為輸入的理發(fā)店中的椅子的個(gè)數(shù),當(dāng)理發(fā)店的椅子沒有空

5、位的時(shí)候,到來的顧客主動(dòng)退出加入隊(duì)列。理發(fā)師對(duì)隊(duì)列中的顧客進(jìn)行先到先服務(wù)的原則理發(fā)。7. 系統(tǒng)結(jié)構(gòu)說明(一)頭文件聲明#include "windows.h"#include "iostream.h"#include "math.h"(二)定義各種變量int long waiting(0); int chairs; char open_door; char close_door; int count(0); int finish(0); (三)信號(hào)量的定義HANDLE Mutex =:CreateMutex(NULL, FALSE,

6、"Mutex"); HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); HANDLE customers =:CreateSemaphore(NULL,0,3,"customers");8. 系統(tǒng)調(diào)用說明(1)CreateThread():創(chuàng)建線程(2)CreateMutex():找出當(dāng)前系統(tǒng)是否已經(jīng)存在指定進(jìn)程的實(shí)例。如果沒有則創(chuàng)建一個(gè)互斥體,用來同步。如果一個(gè)線程獲取了互斥體,則要獲取該互斥體的第二個(gè)線程將被掛起,直到第一個(gè)線程釋放該互斥體。CreateMutex()函數(shù)

7、可用來創(chuàng)建一個(gè)有名或無名的互斥量對(duì)象(3)CreateSemaphore():CreateSemaphore() 是系統(tǒng)提供的API,包含在Windows.h 中,應(yīng)用在同步的處理中。作用是創(chuàng)建一個(gè)新的信號(hào)機(jī),執(zhí)行成功,返回信號(hào)機(jī)對(duì)象的句柄;零表示出錯(cuò)。一旦不再需要,一定記住用CloseHandle關(guān)閉信號(hào)機(jī)的句柄。它的所有句柄都關(guān)閉以后,對(duì)象自己也會(huì)刪除。一旦值大于零,信號(hào)機(jī)就會(huì)觸發(fā)(發(fā)出信號(hào))。Semaphore是一個(gè)同步問題機(jī)制,不論是Event或Mutex,其他Process在執(zhí)WaitForSingleObject時(shí),就看當(dāng)時(shí)的物件是Signal或UnSignal而決定是否等待,而S

8、emaphore也相同,但是它要變成Signal /UnSignal的狀態(tài),卻有些不同,它是提供一個(gè)計(jì)數(shù)值,它允許在這個(gè)計(jì)數(shù)值之內(nèi),任何執(zhí)行到WaitForSingleObject的Thread都不會(huì)停下來,而且每執(zhí)行WaitForSingleObject一次,計(jì)數(shù)值就減一,當(dāng)計(jì)數(shù)值變成0時(shí),該Semaphore才會(huì)處於UnSignal的狀態(tài),而某個(gè)Thread ReleaseSemaphore時(shí),便會(huì)將計(jì)數(shù)值增加,以便其他的Thread或本身可得Signal的訊號(hào),而使WaitForSingleObject停止等待。 (4)ReleaseSemaphore():ReleaseSemaphor

9、e()函數(shù)的作用是增加信號(hào)機(jī)的計(jì)數(shù)。如果成功,就調(diào)用信號(hào)機(jī)上的一個(gè)等待函數(shù)來減少它的計(jì)數(shù)。(5)WaitForSingleObject():函數(shù)用來檢測(cè)hHandle事件的信號(hào)狀態(tài),在某一線程中調(diào)用該函數(shù)時(shí),線程暫時(shí)掛起,如果在掛起的dwMilliseconds毫秒內(nèi),線程所等待的對(duì)象變?yōu)橛行盘?hào)狀態(tài),則該函數(shù)立即返回;如果超時(shí)時(shí)間已經(jīng)到達(dá)dwMilliseconds毫秒,但hHandle所指向的對(duì)象還沒有變成有信號(hào)狀態(tài),函數(shù)照樣返回。參數(shù)dwMilliseconds有兩個(gè)具有特殊意義的值:0和INFINITE。若為0,則該函數(shù)立即返回;若為INFINITE,則線程一直被掛起,直到hHandle

10、所指向的對(duì)象變?yōu)橛行盘?hào)狀態(tài)時(shí)為止。(6)ResumeThread():線程恢復(fù)函數(shù),使用該函數(shù)能激活線程的運(yùn)行,使CPU分配資源讓線程恢復(fù)運(yùn)行。(7)ReleaseMutex():釋放由線程擁有的一個(gè)互斥體(8)Sleep():睡眠等待9. 分工設(shè)計(jì)說明需要用到的信號(hào)量:HANDLE Mutex =:CreateMutex(NULL, FALSE, "Mutex"); 實(shí)現(xiàn)顧客與理發(fā)師對(duì)公用緩存區(qū)的互斥操作HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); HANDLE customers =:

11、CreateSemaphore(NULL,0,3,"customers");:WaitForSingleObject(customers,INFINITE); 等待顧客進(jìn)程的V(customer)操作:WaitForSingleObject(Mutex,INFINITE); 申請(qǐng)操作顧客與理發(fā)師公用的緩存區(qū) :ReleaseSemaphore(barbers,1,NULL); 釋放信號(hào)量barbers:ReleaseMutex(Mutex); 釋放信號(hào)量Mutex,允許顧客操作緩存區(qū)10. 算法流程圖程序開始鍵入店中的椅子數(shù)是否開始接待顧客 尚未營業(yè)Mutex理發(fā)師線程Tr

12、ue顧客線程False椅等待是離開有顧客等待休息否理發(fā)師在睡覺則喚醒理發(fā),否則繼續(xù)是11. 分工代碼#include "windows.h"#include "iostream.h"#include "math.h"int long waiting(0); /等待理發(fā)的顧客人數(shù)int chairs; /店中椅子的總數(shù)目char open_door; /開門char close_door; /關(guān)門int count(0); /顧客的序號(hào)int finish(0); /已經(jīng)理完發(fā)的顧客人數(shù)DWORD a;HANDLE Mutex =:Cr

13、eateMutex(NULL, FALSE, "Mutex"); /用來實(shí)現(xiàn)進(jìn)程的互斥 HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); /定義信號(hào)量來進(jìn)行線程間的同步HANDLE customers =:CreateSemaphore(NULL,0,3,"customers"); /定義信號(hào)量來進(jìn)行線程間的同步int random()/定義隨機(jī)函數(shù)來產(chǎn)生顧客,并使兩個(gè)顧客間的時(shí)間少于15秒 return (rand()*15000)/RAND_MAX;void cutha

14、ir()/理發(fā)師的理發(fā)函數(shù),用時(shí)15秒 :Sleep (15000);cout<<"理發(fā)結(jié)束 !"<<endl;DWORD WINAPI barber(LPVOID pParm1)/理發(fā)師線程 while(true) :WaitForSingleObject(customers,INFINITE);/p(customers),等待顧客:WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的人數(shù)減1:ReleaseSemaphore(barbers,1,NULL); /釋放信號(hào)量:Resum

15、eThread(barbers); /喚醒顧客進(jìn)程:ReleaseMutex(Mutex); /v(mutex); cuthair(); finish+; return 0;12. 整體代碼#include "windows.h"#include "iostream.h"#include "math.h"int long waiting(0); /等待理發(fā)的顧客人數(shù)int chairs; /店中椅子的總數(shù)目char open_door; /開門char close_door; /關(guān)門int count(0); /顧客的序號(hào)int fi

16、nish(0); /已經(jīng)理完發(fā)的顧客人數(shù)DWORD a;HANDLE Mutex =:CreateMutex(NULL, FALSE, "Mutex"); /用來實(shí)現(xiàn)進(jìn)程的互斥 HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); /定義信號(hào)量來進(jìn)行線程間的同步HANDLE customers =:CreateSemaphore(NULL,0,3,"customers"); /定義信號(hào)量來進(jìn)行線程間的同步int random()/定義隨機(jī)函數(shù)來產(chǎn)生顧客,并使兩個(gè)顧客間的時(shí)間少于

17、15秒 return (rand()*15000)/RAND_MAX;void cuthair()/理發(fā)師的理發(fā)函數(shù),用時(shí)15秒 :Sleep (15000);cout<<"理發(fā)結(jié)束 !"<<endl;void gethaircut()/ 顧客被理發(fā)的函數(shù):Sleep (15001); /顧客被理發(fā)的函數(shù),為了和理發(fā)師之間有所區(qū)別,比理發(fā)師理發(fā)時(shí)間長1毫秒cout<<"第"<<finish<<"個(gè)顧客理發(fā)完畢,離開 "<<endl; DWORD WINAPI cu

18、stomer(LPVOID pParm2)/ 顧客線程:WaitForSingleObject(Mutex ,INFINITE); /P(mutex)來進(jìn)行互斥操作count+; /來的是第幾個(gè)顧客cout<<"顧客敲門!第 "<<count<<" 個(gè)顧客到來 "<<endl; if (waiting<chairs) /如果有空椅子 if (waiting!=0)cout<<"現(xiàn)在有"<<waiting <<" 個(gè)人在等待理發(fā)"

19、;<<endl;elsecout<<"無人在等待理發(fā)"<<endl; /輸出有多少人在等待waiting+;cout<<"剩余"<<chairs-waiting+1<<"個(gè)座位"<<endl;cout<<"有空位,顧客已坐下"<<endl;:ReleaseSemaphore(customers,1,NULL);/V(customer):ResumeThread(customers);/喚醒理發(fā)師進(jìn)程:Rele

20、aseMutex(Mutex);/釋放互斥量,以便其他線程使用:WaitForSingleObject(barbers,INFINITE);/等待理發(fā)gethaircut();elsecout<<"沒有空椅子,第"<<count<<"個(gè)顧客離開理發(fā)店"<<endl; /沒有椅子,顧客直接離開:ReleaseMutex(Mutex);return 0;DWORD WINAPI barber(LPVOID pParm1)/理發(fā)師線程 while(true) :WaitForSingleObject(custom

21、ers,INFINITE);/p(customers),等待顧客:WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的人數(shù)減1:ReleaseSemaphore(barbers,1,NULL); /釋放信號(hào)量:ResumeThread(barbers); /喚醒顧客進(jìn)程:ReleaseMutex(Mutex); /v(mutex); cuthair(); finish+; return 0;int main(int argc, char* argv)/實(shí)現(xiàn)線程的操作 cout<<"輸入理發(fā)店中的椅子個(gè)數(shù):&q

22、uot;cin>>chairs;cout<<"店中有"<<chairs<<"把椅子"<<endl; /設(shè)置椅子數(shù)目cout<<"是否開始接待顧客?Y/N"<<endl; /是否開門營業(yè)cin>>open_door;while (open_door!='y')cout<<endl<<"尚未營業(yè)!"<<endl;cout<<"是否開始接待顧客?Y/N&

23、quot;<<endl;cin>>open_door;HANDLE hThread1;HANDLE hThread2;hThread2=:CreateThread (NULL,0,barber,NULL,0,NULL); /產(chǎn)生一個(gè)理發(fā)師進(jìn)程while(close_door!='y') :Sleep(random();/函數(shù)實(shí)現(xiàn)顧客隨機(jī)到來hThread1=:CreateThread(NULL,0,customer,NULL,a,NULL);cout<<endl<<"正在營業(yè),請(qǐng)進(jìn)!"<<endl; if (finish>=8 && waiting=0)/如果完成數(shù)超過8并且沒有人等待cout<<"已經(jīng)為"<<finish<<"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論