操作系統(tǒng)課程設計——哲學家進餐問題_第1頁
已閱讀1頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設計報告</p><p>  院(系): 計算機科學學院 </p><p>  專業(yè): 計算機科學與技術專業(yè) </p><p>  學生姓名:   </p><p>  題目:模擬仿真"

2、哲學家進餐"問題的解決過程及方法 </p><p>  完成日期: 2010 年 7 月 10 日</p><p><b>  目錄</b></p><p>  1.設計題目與要求2</p><p><b>  1.1實驗目的2</b></p><p>  1.

3、3 初始條件2</p><p>  2 總體設計思想及相關知識3</p><p>  2.1總體設計思想3</p><p>  2.2 臨界區(qū)互斥編程原理3</p><p>  2.3開發(fā)環(huán)境與工具4</p><p>  3數據結構與模塊說明4</p><p>  3.1 數據結構

4、4</p><p>  3.2程序各模塊流程圖6</p><p>  3.2.1 主程序模塊6</p><p>  3.2.2 狀態(tài)改變模塊7</p><p>  3.2.3 返回哲學家狀態(tài)模塊8</p><p>  3.2.4 返回餐具狀態(tài)模塊9</p><p>  4. 源程序代

5、碼10</p><p>  5. 測試及結果15</p><p>  6. 課設總結17</p><p><b>  參考文獻18</b></p><p><b>  1.設計題目與要求</b></p><p><b>  1.1實驗目的</b>

6、</p><p>  通過實現哲學家進餐問題的同步,深入了解和掌握進程同步和互斥的原理。1.2設計要求</p><p>  哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數、餐桌上的布置自行設定,實現刀和叉的互斥使用算法的程序實現。</p><p><b>  1

7、.3 初始條件</b></p><p> ?。?)操作系統(tǒng):windows</p><p>  (2)程序設計語言:C++</p><p> ?。?)設定圓桌上有六個哲學家,三對刀叉,如下圖擺放:</p><p>  圖1-1 哲學家進餐問題設定圖</p><p>  2 總體設計思想及相關知識</p

8、><p><b>  2.1總體設計思想</b></p><p>  哲學家的生活就是思考和吃飯,即思考,就餐,再思考,往復循環(huán)。要求是:每一個哲學家只有在拿到位于他左右的刀叉后,才能夠就餐;哲學家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同時去抓他旁邊的兩把餐具,也不能從其他哲學家手中搶奪餐具;哲學家每次就餐后必須放下他手中的兩把餐具后恢復思考,不能強抓住餐具不放。

9、</p><p>  設計一個程序,能夠顯示當前各哲學家的狀態(tài)和桌上餐具的使用情況,并能無死鎖的推算出下一狀態(tài)各哲學家的狀態(tài)和桌上餐具的使用情況。即設計一個能安排哲學家正常生活的程序。</p><p>  為哲學家設計3種狀態(tài),即“等待”“進餐”“思考”。每個哲學家重復進行“等待”->“進餐”->“思考”的行動循環(huán)。其中:</p><p>  “等待”-

10、>“進餐”:只有一個哲學家處于等待進餐狀態(tài),且左右手兩邊的餐具都處于“空閑”狀態(tài)時,可以發(fā)生這種狀態(tài)改變。此狀態(tài)改變發(fā)生后,哲學家拿起左右手兩邊的餐具。</p><p>  “進餐”->“思考”:此狀態(tài)改變發(fā)生后,哲學家放下左右手上的餐具。餐具狀態(tài)由“使用中”轉變?yōu)椤翱臻e”。</p><p>  “思考”->“等待”:哲學家思考結束后,無條件轉入等待狀態(tài)。</p&g

11、t;<p>  由上所述,程序中應設置6個元素的信號量數組,tools[6],用來保持哲學家之間的同步。</p><p>  2.2 臨界區(qū)互斥編程原理</p><p>  不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。每個進程中訪問臨界資源的那段代碼稱為臨界區(qū)(Critical Section)。 </p><p>  每個進

12、程中訪問臨界資源的那段程序稱為臨界區(qū)(Critical Section)(臨界資源是一次僅允許一個進程使用的共享資源)。每次只準許一個進程進入臨界區(qū),進入后不允許其他進程進入。不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。</p><p>  本程序主要使用了EnterCriticalSection (&cs)和LeaveCriticalSection (&cs)兩個函數實

13、現臨界區(qū)互斥。</p><p>  EnterCriticalSection (&cs)用來進入臨界區(qū),LeaveCriticalSection (&cs)用來離開臨界區(qū)。</p><p>  2.3開發(fā)環(huán)境與工具</p><p>  系統(tǒng)平臺:WINDOW環(huán)境</p><p><b>  實現語言:C++</

14、b></p><p>  開發(fā)工具:VC++6.0</p><p>  3數據結構與模塊說明</p><p><b>  3.1 數據結構</b></p><p>  圖3-1 哲學家類的UML圖</p><p>  程序中定義一個哲學家類,包含兩個私有對象和四個公有對象。</p&g

15、t;<p>  Number對象:哲學家的編號。</p><p>  Status對象:用于保存當前該哲學家的狀態(tài),0表示正在等待(即處于饑餓狀態(tài))1表示得到餐具正在吃飯,2表示正在思考</p><p>  Philosopher(int num)方法:哲學家類構造函數,參數num表示哲學家編號</p><p>  find() const方法:返回該

16、哲學家編號</p><p>  getinfo() const方法:返回哲學家當前狀態(tài)</p><p>  Change()方法:根據題目要求改變哲學家的狀態(tài)(等待->進餐->思考->等待…………)</p><p>  另外,程序中包含一個公有對象,bool類型數組tools[6],用來保存6把餐具當前狀態(tài):true表示該餐具當前空閑,false表

17、示該餐具當前正被使用。</p><p>  程序中還包含兩個公有函數:print和toolstatus。Print用來返回一個哲學家的狀態(tài),toolstatus用來返回一個餐具的狀態(tài)。</p><p>  3.2程序各模塊流程圖</p><p>  3.2.1 主程序模塊</p><p>  圖3-2 主程序模塊流程圖</p>

18、<p>  3.2.2 狀態(tài)改變模塊</p><p>  圖3-3 狀態(tài)改變模塊Change()流程圖</p><p>  3.2.3 返回哲學家狀態(tài)模塊</p><p>  圖3-4 返回哲學家狀態(tài)模塊print()流程圖</p><p>  3.2.4 返回餐具狀態(tài)模塊</p><p>  圖3-5 返回

19、餐具狀態(tài)模塊toolstatus(bool a)流程圖</p><p><b>  4. 源程序代碼</b></p><p>  //實驗目的:通過實現哲學家進餐問題的同步深入了解和掌握進程同步和互斥的原理。</p><p>  //設計要求:哲學家有N個,也定全體到達后開始討論:在討論的間隙哲學家進餐,</p><p&g

20、t;  //每人進餐時都需使用刀、叉各一把,所有哲學家刀和叉都拿到后才能進餐。哲學家的人數、</p><p>  //餐桌上的布置自行設定,實現刀和叉的互斥使用算法的程序實現。</p><p>  #include <windows.h> </p><p>  #include <time.h> </p><p>  

21、#include <string> </p><p>  #include <iostream> </p><p>  #include <assert.h> </p><p>  using namespace std; //控制活動線程數目的信號量(保護線程共享資源)</p><p>  bool

22、tools[6];//全局變量,用餐工具</p><p>  CRITICAL_SECTION cs; //信號量, 在線程中使用,臨界區(qū)</p><p>  class Philosopher</p><p><b>  { </b></p><p><b>  private: </b>&l

23、t;/p><p>  int number;</p><p>  int status; /*標記當前哲學家的狀態(tài),0表示正在等待(即處于饑餓狀態(tài)),1表示得到兩支筷子正在吃飯,2表示正在思考*/</p><p><b>  public:</b></p><p>  Philosopher(int num=0): st

24、atus(2), number(num) { }</p><p>  int find() const { return number; } </p><p>  int getinfo() const { return status; } </p><p>  void Change() ; //狀態(tài)改變函數</p><p><

25、;b>  }; </b></p><p>  void Philosopher::Change() </p><p><b>  { </b></p><p>  EnterCriticalSection (&cs) ; //進入臨界區(qū)</p><p>  if(status==1)//正在進

26、餐</p><p><b>  {</b></p><p>  tools[number%6]=true; //放下左手工具</p><p>  tools[(number-1)%6]=true; //放下右手工具</p><p>  status=2;//改變狀態(tài)為思考 </p><p&g

27、t;<b>  } </b></p><p>  else if(status==2)//思考中</p><p><b>  { </b></p><p>  status=0; //改變狀態(tài)為等待 </p><p><b>  } </b></p><

28、;p>  else if(status==0)//等待中 </p><p><b>  { </b></p><p>  if(tools[number%6]&&tools[(number-1)%6]) //左右手兩邊工具均為空閑狀態(tài)</p><p><b>  {</b></p>

29、<p>  tools[number%6]=false; //拿起左手工具</p><p>  tools[(number-1)%6]=false; //拿起右手工具</p><p>  status=1; </p><p><b>  }</b></p><p><b>  }</b

30、></p><p>  LeaveCriticalSection (&cs) ; </p><p><b>  } </b></p><p>  string print(Philosopher *pA) </p><p><b>  { </b></p><p&g

31、t;  //pA->Change(); </p><p>  int i=pA->getinfo(); </p><p>  string str; </p><p><b>  if(i==0) </b></p><p>  str="等待"; </p><p>

32、  else if(i==1) </p><p>  str="就餐"; </p><p>  else str="思考"; </p><p>  return str; </p><p><b>  } </b></p><p>  string tool

33、status(bool a)</p><p><b>  {</b></p><p>  string state;</p><p>  if(a==true)</p><p>  state="閑";</p><p>  if(a==false)</p><

34、;p>  state="用";</p><p>  return state;</p><p><b>  }</b></p><p>  int main() </p><p><b>  { </b></p><p>  char con = &

35、#39;y'; //判斷是否繼續(xù)</p><p>  for(int i=0;i<6;i++) </p><p>  tools[i]=true; //3組刀叉都未使用,初始化</p><p>  Philosopher P1(1),P2(2),P3(3),P4(4),P5(5),P6(6); </p><p>  Initia

36、lizeCriticalSection (&cs) ; //初始化初始化臨界區(qū)</p><p>  cout<<"-----------------------狀態(tài)說明示意圖:-----------------------"<<endl;</p><p>  cout<<""<<&quo

37、t;哲學家0號的狀態(tài)"<<""<<endl;</p><p>  cout<<"哲學家5號的狀態(tài)"<<""<<"叉3的狀態(tài)"<<""<<"刀1的狀態(tài)"<<"&qu

38、ot;<<"哲學家1號的狀態(tài)"<<endl;</p><p>  cout<<" "<<"刀3的狀態(tài)"<<" "<<"叉1的狀態(tài)"<<endl;</p><p>  cout&l

39、t;<"哲學家4號的狀態(tài)"<<""<<"叉2的狀態(tài)"<<""<<"刀2的狀態(tài)"<<""<<"哲學家2號的狀態(tài)"<<endl;</p><p>  cout<<&q

40、uot;"<<"哲學家3號的狀態(tài)"<<""<<endl;</p><p>  cout<<"餐具的狀態(tài),\“用\”表示使用中,\“閑\”表示空閑中。"<<endl;</p><p>  cout<<"-------------

41、-------------"<<endl;</p><p>  cout<<"哲學家們開始生活:"<<endl;</p><p>  cout<<endl;</p><p>  cout<<endl;</p><p>  while(con=='

42、y') </p><p><b>  { </b></p><p>  P1.Change();</p><p>  P2.Change();</p><p>  P3.Change();</p><p>  P4.Change();</p><p>  P5.C

43、hange();</p><p>  P6.Change();</p><p>  cout<<"當前狀態(tài)為:"<<endl;</p><p>  cout<<""<<P1.find()<<print(&P1)<<""

44、;<<endl;</p><p>  cout<<P6.find()<<print(&P6)<<""<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<""<<P2.find()&

45、lt;<print(&P2)<<endl;</p><p>  cout<<" "<<toolstatus(tools[5])<<" "<<toolstatus(tools[2])<<endl;</p><p>  cout<<

46、P5.find()<<print(&P5)<<""<<toolstatus(tools[4])<<""<<toolstatus(tools[3])<<""<<P3.find()<<print(&P3)<<endl;</p><

47、;p>  cout<<""<<P4.find()<<print(&P4)<<""<<endl;</p><p>  cout<<"--------------------------"<<endl;</p><p>  c

48、out<<"若要繼續(xù)下一狀態(tài),輸入y;輸入其他,結束程序:";</p><p><b>  cin>>con;</b></p><p>  Sleep(20); </p><p><b>  } </b></p><p>  DeleteCriticalS

49、ection (&cs) ; //退出資源區(qū)</p><p>  return 0; </p><p><b>  }</b></p><p><b>  5. 測試及結果</b></p><p>  圖5-1 程序運行開始界面</p><p>  圖5-2 哲學家狀

50、態(tài)1</p><p>  圖5-3 哲學家狀態(tài)2</p><p>  圖5-4 哲學家狀態(tài)3</p><p>  圖5-5 哲學家狀態(tài)4</p><p><b>  圖5-6 退出程序</b></p><p><b>  6. 課設總結</b></p><

51、p>  經過了前后共2周的時間,我完成了這次課程設計。</p><p>  通過這次課程設計,我學到了許多課本上學不到的知識,注意到了許多課本上沒有提到的東西。</p><p>  而且,通過這次設計,我得到了一個很好的理論聯(lián)系實際的機會,鍛煉了通過理論解決實際問題的能力。正所謂“實踐出真知”,有些代碼看上去沒什么問題,但是實際運行起來就是不出正確結果。代碼內部可能存在邏輯或語法等方

52、面我們平時不會注意到的小問題,通過這次課程設計,我積累了不少這樣小問題的解決方法。</p><p>  設計中總會遇到這樣那樣的問題,遇到問題勢必要自己分析問題,通過各種渠道解決問題,比如利用互聯(lián)網。這次課程設計也加強了我上網查數檢索問題的能力。有些時候,學習到的知識是次要的,重要的是學習知識的方法。</p><p><b>  參考文獻</b></p>

53、<p>  [1]宗大華,宗濤,陳吉人著 操作系統(tǒng) 北京:人民郵電出版社,2009</p><p>  [2]李愛華,程磊著 面相對象程序設計(C++語言) 北京: 清華大學出版社,2010</p><p>  [3]宋曉宇 , windows操作系統(tǒng)核心編程實驗教程 中國鐵道出版社</p><p>  [4]張麗芬 劉利雄 王金玉編著 操作系

溫馨提示

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

評論

0/150

提交評論