操作系統(tǒng)課程設(shè)計-哲學家進餐問題_第1頁
操作系統(tǒng)課程設(shè)計-哲學家進餐問題_第2頁
操作系統(tǒng)課程設(shè)計-哲學家進餐問題_第3頁
操作系統(tǒng)課程設(shè)計-哲學家進餐問題_第4頁
操作系統(tǒng)課程設(shè)計-哲學家進餐問題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄TOC\o"1-5"\h\z\o"CurrentDocument"1.設(shè)計題目與要求 1\o"CurrentDocument"1.1實驗目的 1\o"CurrentDocument"1.3初始條件 1\o"CurrentDocument"2總體設(shè)計思想及相關(guān)知識 2\o"CurrentDocument"2.1總體設(shè)計思想 2\o"CurrentDocument"2.2臨界區(qū)互斥編程原理 2\o"CurrentDocument"2.3開發(fā)環(huán)境與工具 3\o"CurrentDocument"3數(shù)據(jù)結(jié)構(gòu)與模塊說明 3\o"CurrentDocument"3.1數(shù)據(jù)結(jié)構(gòu) 33.2程序各模塊流程圖 53.2.1主程序模塊 5\o"CurrentDocument"3.2.2狀態(tài)改變模塊 6\o"CurrentDocument"3.2.3返回哲學家狀態(tài)模塊 .7\o"CurrentDocument"3.2.4返回餐具狀態(tài)模塊 8\o"CurrentDocument"源程序代碼 9\o"CurrentDocument"測試及結(jié)果 14\o"CurrentDocument"課設(shè)總結(jié) 16\o"CurrentDocument"參考文獻 171.設(shè)計題目與要求1.1實驗目的通過實現(xiàn)哲學家進餐問題的同步深入了解和掌握進程同步和互斥的原理。1.2設(shè)計要求哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數(shù)、餐桌上的布置自行設(shè)定,實現(xiàn)刀和叉的互斥使用算法的程序?qū)崿F(xiàn)。1.3初始條件(1) 操作系統(tǒng):windows(2) 程序設(shè)計語言:C++(3) 設(shè)定圓桌上有六個哲學家,三對刀叉,如下圖擺放:哲學家編號圖1-1哲學家進餐問題設(shè)定圖2總體設(shè)計思想及相關(guān)知識2.1總體設(shè)計思想哲學家的生活就是思考和吃飯,即思考,餓了就餐,再思考,循環(huán)往復。要求是:每一個哲學家只有在拿到位于他左右的刀叉后,才能夠就餐;哲學家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同時去抓他旁邊的兩把餐具,也不能從其他哲學家手中搶奪餐具;哲學家每次就餐后必須放下他手中的兩把餐具后恢復思考,不能強抓住餐具不放。設(shè)計一個程序,能夠顯示當前各哲學家的狀態(tài)和桌上餐具的使用情況,并能無死鎖的推算出下一狀態(tài)各哲學家的狀態(tài)和桌上餐具的使用情況。即設(shè)計一個能安排哲學家正常生活的程序。為哲學家設(shè)計3種狀態(tài),即“等待”“進餐”“思考”。每個哲學家重復進行“等待”-〉“進餐”-〉“思考”的行動循環(huán)。其中:“等待”-〉“進餐”:只有一個哲學家處于等待進餐狀態(tài),且左右手兩邊的餐具都處于“空閑”狀態(tài)時,可以發(fā)生這種狀態(tài)改變。此狀態(tài)改變發(fā)生后,哲學家拿起左右手兩邊的餐具。“進餐”-〉“思考”:此狀態(tài)改變發(fā)生后,哲學家放下左右手上的餐具。餐具狀態(tài)由“使用中”轉(zhuǎn)變?yōu)椤翱臻e”?!八伎肌?〉“等待”:哲學家思考結(jié)束后,無條件轉(zhuǎn)入等待狀態(tài)。由上所述,程序中應設(shè)置6個元素的信號量數(shù)組,tools[6],用來保持哲學家之間的同步。2.2臨界區(qū)互斥編程原理不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。每個進程中訪問臨界資源的那段代碼稱為臨界區(qū)(CriticalSection)。每個進程中訪問臨界資源的那段程序稱為臨界區(qū)(CriticalSection)(臨界資源是一次僅允許一個進程使用的共享資源)。每次只準許一個進程進入臨界區(qū),進入后不允許其他進程進入。不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。本程序主要使用了EnterCriticalSection(&cs)和LeaveCriticalSection(&cs)兩個函數(shù)實現(xiàn)臨界區(qū)互斥。EnterCriticalSection(&cs)用來進入臨界區(qū),LeaveCriticalSection(&cs)用來離開臨界區(qū)。2.3開發(fā)環(huán)境與工具系統(tǒng)平臺:WINDOW環(huán)境實現(xiàn)語言:C++開發(fā)工具:VC++6.03數(shù)據(jù)結(jié)構(gòu)與模塊說明3.1數(shù)據(jù)結(jié)構(gòu)Philosopher-number:int-status:int+Philosopher(innum:int)+find()const:int+getinfo()const:int+Change():void圖3-1哲學家類的UML圖程序中定義一個哲學家類,包含兩個私有對象和四個公有對象。Number對象:報訊哲學家的編號。Status對象:用于保存當前該哲學家的狀態(tài),0表示正在等待(即處于饑餓狀態(tài))1表示得到餐具正在吃飯,2表示正在思考Philosopher(intnum)方法:哲學家類構(gòu)造函數(shù),參數(shù)num表示哲學家編號find()const方法:返回該哲學家編號getinfo()const方法:返回哲學家當前狀態(tài)Change()方法:根據(jù)題目要求改變哲學家的狀態(tài)(等待->進餐->思考->等待 )另外,程序中包含一個公有對象,bool類型數(shù)組tools[6],用來保存6把餐當前狀態(tài):true表示該餐具當前空閑,false表示該餐具當前正被使用。程序中還包含兩個公有函數(shù):print和toolstatus。Print用來返回一個哲學家的狀態(tài),toolstatus用來返回一個餐具的狀態(tài)。3.2程序各模塊流程圖3.2.1主程序模塊是結(jié)束圖3-2主程序模塊流程圖3.2.2狀態(tài)改變模塊圖3-3狀態(tài)改變模塊Change()流程圖3.2.3返回哲學家狀態(tài)模塊圖3-4返回哲學家狀態(tài)模塊print()流程圖3.2.4返回餐具狀態(tài)模塊圖3-5返回餐具狀態(tài)模塊toolstatus(boola)流程圖源程序代碼//實驗目的:通過實現(xiàn)哲學家進餐問題的同步深入了解和掌握進程同步和互斥的原理。//設(shè)計要求:哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,//每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數(shù)、//餐桌上的布置自行設(shè)定,實現(xiàn)刀和叉的互斥使用算法的程序?qū)崿F(xiàn)。#include<windows.h>#include<time.h>#include<string>#include<iostream>#include<assert.h>usingnamespacestd;booltools[6]; 〃全局變量,用餐工具CRITICAL_SECTIONcs;//信號量,在線程中使用,臨界區(qū)classPhilosopher{private:intnumber;intstatus;/*標記當前哲學家的狀態(tài),0表示正在等待(即處于饑餓狀態(tài)),1表示得到兩支筷子正在吃飯,2表示正在思考*/public:Philosopher(intnum=0):status(2),number(num){}intfind()const{returnnumber;}intgetinfo()const{returnstatus;}voidChange(); 〃狀態(tài)改變函數(shù)};voidPhilosopher::Change(){EnterCriticalSection(&cs);〃進入臨界區(qū)if(status==1)//正在進餐{tools[number%6]=true;〃放下左手工具tools[(number-1)%6]=true;〃放下右手工具status=2; 〃改變狀態(tài)為思考}elseif(status==2)//思考中{status=0; 〃改變狀態(tài)為等待}elseif(status==0)//等待中{if(tools[number%6]&&tools[(number-1)%6]) //左右手兩邊工具均為空閑狀態(tài){tools[number%6]=false;〃拿起左手工具tools[(number-1)%6]=false;〃拿起右手工具status=1;}}LeaveCriticalSection(&cs);}stringprint(Philosopher*pA){//pA->Change();inti=pA->getinfo();stringstr;if(i==0)str="等待";elseif(i==1)str="就餐";elsestr="思考";returnstr;}stringtoolstatus(boola){stringstate;if(a==true)state="閑";if(a==false)state="用”;returnstate;}intmain(){charcon='y';〃判斷是否繼續(xù)for(inti=0;i<6;i++)tools[i]=true;//3組刀叉都未使用,初始化PhilosopherP1(1),P2(2),P3(3),P4(4),P5(5),P6(6);InitializeCriticalSection(&cs);//初始化初始化臨界區(qū)cout<<" 狀態(tài)說明示意圖: "<<endl;cout<<" "<<"哲學家0號的狀態(tài)"<<" "<<endl;cout<<"哲學家5號的狀態(tài)"<<" "<<"叉3的狀態(tài)"<<" "<<"刀1的狀態(tài)"<<" "<<"哲學家1號的狀態(tài)"<<endl;cout<<""<<"刀3的狀態(tài)"<<" "<<"叉1的狀態(tài)"<<endl;cout<<"哲學家4號的狀態(tài)"<<" ,,<<,,叉2的狀態(tài)"<<" "<<"刀2的狀態(tài)<<" "<<"哲學家2號的狀態(tài)"<<endl;cout<<" "<<"哲學家3號的狀態(tài)"<<" "<<endl;cout<<"餐具的狀態(tài),“用”表示使用中,“閑”表示空閑中。"<<endl;cout<<" "<<endl;cout<<"哲學家們開始生活:"<<endl;cout<<endl;cout<<endl;while(con=='y'){P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();P6.Change();cout<<"當前狀態(tài)為:"<<endl;cout<<""<<P1.find()<<print(&P1)<<" "<<endl;cout<<P6.find()<<print(&P6)<<""<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<""<<P2.find()<<print(&P2)<<endl;cout<<""<<toolstatus(tools[5])<<”"<<toolstatus(tools[2])<<endl;cout<<P5.find()<<print(&P5)<<""<<toolstatus(tools[4])<<”"<<toolstatus(tools[3])<<""<<P3.find()<<print(&P3)<<endl;cout<<" "<<P4.find()<<print(&P4)<<" "<<endl;cout<<" "<<endl;cout<<"若要繼續(xù)下一狀態(tài),輸入尸;輸入其他,結(jié)束程序:";cin>>con;Sleep(20);}DeleteCriticalSection(&cs);//退出資源區(qū)return0;}

測試及結(jié)果m■ ■進錚司?XC^bugftphilg叩her.exe*哲學家5導的狀態(tài) 叉3的狹態(tài)京的就態(tài)哲學索礙的狀態(tài) 叉珊哧超折萱—航龍■"i兄二.=TF扁.圖1..一哲磊定的狀戀- 刀土的狀態(tài)即的狀態(tài)m的狀態(tài)哲粽1號的狀態(tài)餐旱的狀態(tài),“用"先示使用中,哲學家2號的狀態(tài)互學家們開始生活'1等待當前艾1等待&等祥善待嚅待3善待嚅待3輯待樗?奧的狀態(tài),“用'’表示使甲中.哲學家們開始生淘號前武態(tài)制詩待蟠待kl閑籍待閉閑,薯祎國3等待結(jié)更割禮V&等待螺待用用用卜朝禪用

溫馨提示

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

評論

0/150

提交評論