課程設計哲學家就餐問題_第1頁
課程設計哲學家就餐問題_第2頁
課程設計哲學家就餐問題_第3頁
課程設計哲學家就餐問題_第4頁
課程設計哲學家就餐問題_第5頁
已閱讀5頁,還剩14頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、操作系統課程設計報告院(系): 計算機科學學院 專業: 計算機科學與技術專業 學生姓名: 李海軍 班級:計本(2)班 學號: 200881010215 題目:模擬仿真哲學家進餐問題的解決過程及方法起訖日期: 2010.6.30-2010.7.11 指導 教師: 何珍祥 完成日期: 2010 年 7 月 10 日目錄1設計題目與要求21.1實驗目的21.3 初始條件22 總體設計思想及相關知識32.1總體設計思想32.2 臨界區互斥編程原理32.3開發環境與工具43數據結構與模塊說明43.1 數據結構43.2程序各模塊流程圖63.2.1 主程序模塊63.2.2 狀態改變模塊73.2.3 返回哲學

2、家狀態模塊83.2.4 返回餐具狀態模塊94. 源程序代碼105. 測試及結果156. 課設總結17參考文獻181設計題目與要求1.1實驗目的通過實現哲學家進餐問題的同步,深入了解和掌握進程同步和互斥的原理。1.2設計要求哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數、餐桌上的布置自行設定,實現刀和叉的互斥使用算法的程序實現。1.3 初始條件(1)操作系統:windows(2)程序設計語言:C+(3)設定圓桌上有六個哲學家,三對刀叉,如下圖擺放:圖1-1 哲學家進餐問題設定圖2 總體設計思想及相關知識

3、2.1總體設計思想哲學家的生活就是思考和吃飯,即思考,就餐,再思考,往復循環。要求是:每一個哲學家只有在拿到位于他左右的刀叉后,才能夠就餐;哲學家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同時去抓他旁邊的兩把餐具,也不能從其他哲學家手中搶奪餐具;哲學家每次就餐后必須放下他手中的兩把餐具后恢復思考,不能強抓住餐具不放。設計一個程序,能夠顯示當前各哲學家的狀態和桌上餐具的使用情況,并能無死鎖的推算出下一狀態各哲學家的狀態和桌上餐具的使用情況。即設計一個能安排哲學家正常生活的程序。為哲學家設計3種狀態,即“等待”“進餐”“思考”。每個哲學家重復進行“等待”->“進餐”->“思考”的行

4、動循環。其中:“等待”->“進餐”:只有一個哲學家處于等待進餐狀態,且左右手兩邊的餐具都處于“空閑”狀態時,可以發生這種狀態改變。此狀態改變發生后,哲學家拿起左右手兩邊的餐具?!斑M餐”->“思考”:此狀態改變發生后,哲學家放下左右手上的餐具。餐具狀態由“使用中”轉變為“空閑”?!八伎肌?>“等待”:哲學家思考結束后,無條件轉入等待狀態。由上所述,程序中應設置6個元素的信號量數組,tools6,用來保持哲學家之間的同步。2.2 臨界區互斥編程原理不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。每個進程中訪問臨界資源的那段代碼稱為臨界區(Critical S

5、ection)。 每個進程中訪問臨界資源的那段程序稱為臨界區(Critical Section)(臨界資源是一次僅允許一個進程使用的共享資源)。每次只準許一個進程進入臨界區,進入后不允許其他進程進入。不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。本程序主要使用了EnterCriticalSection (&cs)和LeaveCriticalSection (&cs)兩個函數實現臨界區互斥。EnterCriticalSection (&cs)用來進入臨界區,LeaveCriticalSection (&cs)用來離開臨界區。2.3開發環境與

6、工具系統平臺:WINDOW環境實現語言:C+開發工具:VC+6.03數據結構與模塊說明3.1 數據結構Philosopher-number:int-status:int+Philosopher(in num:int)+find() const:int+getinfo() const:int+Change():void圖3-1 哲學家類的UML圖程序中定義一個哲學家類,包含兩個私有對象和四個公有對象。Number對象:哲學家的編號。Status對象:用于保存當前該哲學家的狀態,0表示正在等待(即處于饑餓狀態)1表示得到餐具正在吃飯,2表示正在思考Philosopher(int num)方法:哲學

7、家類構造函數,參數num表示哲學家編號find() const方法:返回該哲學家編號getinfo() const方法:返回哲學家當前狀態Change()方法:根據題目要求改變哲學家的狀態(等待->進餐->思考->等待)另外,程序中包含一個公有對象,bool類型數組tools6,用來保存6把餐具當前狀態:true表示該餐具當前空閑,false表示該餐具當前正被使用。程序中還包含兩個公有函數:print和toolstatus。Print用來返回一個哲學家的狀態,toolstatus用來返回一個餐具的狀態。3.2程序各模塊流程圖3.2.1 主程序模塊圖3-2 主程序模塊流程圖3.

8、2.2 狀態改變模塊圖3-3 狀態改變模塊Change()流程圖3.2.3 返回哲學家狀態模塊圖3-4 返回哲學家狀態模塊print()流程圖3.2.4 返回餐具狀態模塊圖3-5 返回餐具狀態模塊toolstatus(bool a)流程圖4. 源程序代碼/實驗目的:通過實現哲學家進餐問題的同步深入了解和掌握進程同步和互斥的原理。/設計要求:哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,/每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數、/餐桌上的布置自行設定,實現刀和叉的互斥使用算法的程序實現。#include <windows.h>

9、#include <time.h> #include <string> #include <iostream> #include <assert.h> using namespace std; /控制活動線程數目的信號量(保護線程共享資源)bool tools6;/全局變量,用餐工具CRITICAL_SECTION cs; /信號量, 在線程中使用,臨界區class Philosopher private: int number;int status; /*標記當前哲學家的狀態,0表示正在等待(即處于饑餓狀態),1表示得到兩支筷子正在吃飯,2表示

10、正在思考*/public:Philosopher(int num=0): status(2), number(num) int find() const return number; int getinfo() const return status; void Change() ; /狀態改變函數; void Philosopher:Change() EnterCriticalSection (&cs) ; /進入臨界區if(status=1)/正在進餐toolsnumber%6=true; /放下左手工具tools(number-1)%6=true; /放下右手工具status=2

11、;/改變狀態為思考 else if(status=2)/思考中 status=0; /改變狀態為等待 else if(status=0)/等待中 if(toolsnumber%6&&tools(number-1)%6) /左右手兩邊工具均為空閑狀態toolsnumber%6=false; /拿起左手工具tools(number-1)%6=false; /拿起右手工具status=1; LeaveCriticalSection (&cs) ; string print(Philosopher *pA) /pA->Change(); int i=pA->geti

12、nfo(); string str; if(i=0) str="等待" else if(i=1) str="就餐" else str="思考" return str; string toolstatus(bool a)string state;if(a=true)state="閑"if(a=false)state="用"return state;int main() char con = 'y' /判斷是否繼續for(int i=0;i<6;i+) toolsi=true;

13、 /3組刀叉都未使用,初始化Philosopher P1(1),P2(2),P3(3),P4(4),P5(5),P6(6); InitializeCriticalSection (&cs) ; /初始化初始化臨界區cout<<"-狀態說明示意圖:-"<<endl;cout<<""<<"哲學家0號的狀態"<<""<<endl;cout<<"哲學家5號的狀態"<<""<&

14、lt;"叉3的狀態"<<""<<"刀1的狀態"<<""<<"哲學家1號的狀態"<<endl;cout<<" "<<"刀3的狀態"<<" "<<"叉1的狀態"<<endl;cout<<"哲學家4號的狀態"<<""<<"

15、;叉2的狀態"<<""<<"刀2的狀態"<<""<<"哲學家2號的狀態"<<endl;cout<<""<<"哲學家3號的狀態"<<""<<endl;cout<<"餐具的狀態,“用”表示使用中,“閑”表示空閑中。"<<endl;cout<<"-"<<end

16、l;cout<<"哲學家們開始生活:"<<endl;cout<<endl;cout<<endl;while(con='y') P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();P6.Change();cout<<"當前狀態為:"<<endl;cout<<""<<P1.find()<<print(&P1)<<"&qu

17、ot;<<endl;cout<<P6.find()<<print(&P6)<<""<<toolstatus(tools0)<<""<<toolstatus(tools1)<<""<<P2.find()<<print(&P2)<<endl;cout<<" "<<toolstatus(tools5)<<" "<&

18、lt;toolstatus(tools2)<<endl;cout<<P5.find()<<print(&P5)<<""<<toolstatus(tools4)<<""<<toolstatus(tools3)<<""<<P3.find()<<print(&P3)<<endl;cout<<""<<P4.find()<<print(&P4)<<""<<endl;cout<<"-"<<endl;cout<<"若要繼續下一狀態,輸入y;輸入其他,結束程序

溫馨提示

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

評論

0/150

提交評論