操作系統(tǒng)課程設(shè)計報告2_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設(shè)計報告</p><p>  一 實驗題目:理發(fā)師問題:理發(fā)店由一個等待室和一個理發(fā)室組成,等待室有N把椅子而理發(fā)室只有一把理發(fā)椅。如果沒有顧客,理發(fā)師就會在理發(fā)椅睡覺。如果一個顧客走進(jìn)理發(fā)店,發(fā)現(xiàn)理發(fā)師正在理發(fā),如果有空椅子可坐,他就坐下來等,如果沒有空椅子,他就離開;如果理發(fā)師正在理發(fā)椅上睡覺,就喚醒理發(fā)師進(jìn)行理發(fā)。</p><p><b>

2、  二 實驗?zāi)康模?lt;/b></p><p>  掌握基本的同步與互斥算法</p><p>  學(xué)會用pv操作來描述算法思想</p><p>  真正理解信號量的作用,理解臨界區(qū)</p><p>  掌握相關(guān)的API的使用方法</p><p>  了解Windows中的多線程的并發(fā)執(zhí)行機(jī)制,實現(xiàn)進(jìn)程的同步與互

3、斥</p><p><b>  三 實驗要求:</b></p><p>  采用系統(tǒng)調(diào)用信號量、p、v操作來描述解決理發(fā)師問題的算法思想,并編程實現(xiàn)該算法。</p><p><b>  四 實驗環(huán)境</b></p><p>  操作系統(tǒng):Windows 7</p><p> 

4、 編譯環(huán)境:VS2008</p><p><b>  五PV操作代碼</b></p><p>  int waiting=0 ; //顧客數(shù) </p><p>  int chairs=n; //椅子數(shù) </p><p>  semaphore customers=0, barbers=0,mutex=1; </p

5、><p><b>  barber() </b></p><p><b>  { </b></p><p>  while(TRUE); //理完一人,還有顧客嗎? </p><p>  P(cutomers); //無顧客則理發(fā)師睡眠 </p><p>  P(mutex);

6、//進(jìn)程互斥 </p><p>  waiting := waiting – 1; </p><p>  V(barbers); //用一個理發(fā)師去為這個顧客理發(fā) </p><p>  V(mutex); //開放臨界區(qū) </p><p>  cut-hair( ); //理發(fā)} </p><p>  customer

7、() </p><p><b>  { </b></p><p>  P(mutex); //進(jìn)程互斥 </p><p>  if (waiting) </p><p>  { waiting := waiting+1; </p><p>  V(customers); //之前無顧客,此時有顧客

8、時,喚醒理發(fā)師 </p><p>  V(mutex); //開放臨界區(qū) </p><p>  P(barbers); //無理發(fā)師, 顧客等待 </p><p>  get-haircut( ); //顧客理發(fā)完走下理發(fā)椅 } </p><p><b>  else </b></p><p> 

9、 V(mutex); //沒座位了}</p><p><b>  六 源代碼</b></p><p>  #include <windows.h></p><p>  #include <conio.h></p><p>  #include <stdio.h></p>

10、<p>  #include <stdlib.h></p><p>  #define CUSNUM 8</p><p>  #define CHAIRS 5</p><p>  char customer_name[]="WAIT_CUSTOMERS";</p><p>  char barker_

11、name[]="SLEEP_BARKER";</p><p>  char cutting_name[]="CUTTING_HAIR";</p><p>  char mutex_name[]="MUTEX_SLEEP_BARKER";</p><p>  HANDLE customer,barker,cu

12、tting;</p><p>  HANDLE mutex;</p><p>  BOOL IsOpen=true;</p><p>  DWORD WINAPI Barker( LPVOID lpParam );</p><p>  DWORD WINAPI Customer( LPVOID lpParam );</p>&l

13、t;p>  int waitting = 0;</p><p>  int finishNum = 0;</p><p>  void cutting_hair()</p><p><b>  {</b></p><p>  Sleep(rand()%3000);</p><p>  pri

14、ntf("理發(fā)師已完成理發(fā).\n");</p><p>  finishNum++;</p><p>  ReleaseSemaphore(cutting,1,NULL);</p><p>  WaitForSingleObject(customer,INFINITE);</p><p>  if ( waitting==

15、0 && finishNum>=6)</p><p><b>  {</b></p><p>  IsOpen = false;</p><p>  ReleaseMutex(mutex);</p><p>  printf("理發(fā)師已理完至少六人,且沒人在等待,所以理發(fā)店關(guān)門.\n&qu

16、ot;);</p><p><b>  }</b></p><p><b>  else</b></p><p>  ReleaseMutex(mutex);</p><p><b>  }</b></p><p>  void hair_cut(int

17、 i)</p><p><b>  {</b></p><p>  printf("顧客%d 已經(jīng)完成理發(fā).\n\n",i);</p><p>  WaitForSingleObject(cutting,INFINITE);</p><p>  printf("顧客%d 完成理發(fā)離開了.\n

18、\n",i);</p><p><b>  }</b></p><p>  VOID main( VOID ) </p><p><b>  { </b></p><p>  DWORD dwThreadId, dwThrdParam = 1; </p><p> 

19、 HANDLE hBarkerThread;</p><p>  HANDLE hCustomerThread[8];</p><p>  customer=CreateSemaphore(NULL,0,CUSNUM,customer_name);</p><p>  barker=CreateSemaphore(NULL,0,1,barker_name);<

20、/p><p>  cutting=CreateSemaphore(NULL,0,1,cutting_name);</p><p>  mutex=CreateMutex(NULL,FALSE,mutex_name);</p><p>  hBarkerThread = CreateThread( </p><p>  NULL,

21、 </p><p>  0, </p><p>  Barker, </p><p>  &dwThrdParam, </p><p>  0, &

22、lt;/p><p>  &dwThreadId); </p><p>  int num[8];</p><p><b>  int i=1;</b></p><p>  while(i<=CUSNUM)</p><p><b>  {</b

23、></p><p><b>  num[i]=i;</b></p><p>  hCustomerThread[i-1] = CreateThread( </p><p>  NULL, </p><p>  0, &l

24、t;/p><p>  Customer,</p><p>  &num[i], </p><p>  0, </p><p>  &dwThreadId); </p><p><b>  i++;&

25、lt;/b></p><p><b>  }</b></p><p>  if (hBarkerThread == NULL) </p><p><b>  {</b></p><p>  printf("創(chuàng)建理發(fā)師線程失敗");</p><p>&

26、lt;b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  WaitForSingleObject(hBarkerThread,INFINITE);</p><p>  CloseHandle( hBarke

27、rThread );</p><p><b>  }</b></p><p><b>  } </b></p><p>  DWORD WINAPI Barker( LPVOID lpParam ) </p><p><b>  { </b></p><p&

28、gt;  while(IsOpen)</p><p><b>  {</b></p><p>  WaitForSingleObject(customer,INFINITE);</p><p>  WaitForSingleObject(mutex,INFINITE);</p><p>  waitting = wait

29、ting - 1;</p><p>  ReleaseSemaphore(barker,1,NULL);</p><p>  ReleaseMutex(mutex);</p><p>  cutting_hair();</p><p><b>  }</b></p><p><b>  

30、return 0;</b></p><p><b>  }</b></p><p>  DWORD WINAPI Customer( LPVOID lpParam ) </p><p><b>  {</b></p><p>  int i=*(int*)lpParam;</p&

31、gt;<p>  Sleep(rand()%45000);</p><p>  LONG WaitingNum;</p><p>  if (!IsOpen)</p><p><b>  {</b></p><p>  printf("理發(fā)店已經(jīng)關(guān)門了.\n");</p>

32、<p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  WaitForSingleObject(mutex,INFINITE);</p><p>  if(waitting<CHA

33、IRS)</p><p><b>  {</b></p><p>  printf("顧客%d 進(jìn)店且等待.\n\n",i);</p><p>  waitting = waitting + 1;</p><p>  ReleaseSemaphore(customer,1,&WaitingNu

34、m);</p><p>  ReleaseMutex(mutex);</p><p>  WaitForSingleObject(barker,INFINITE);</p><p>  printf("理發(fā)師準(zhǔn)備為顧客%d理發(fā).\n",i);</p><p>  hair_cut(i);</p><p&

35、gt;<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("這兒沒有位置給顧客%d ,所以他離開了.",i);</p><p>  ReleaseMutex(mute

36、x);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  } </b></p><p>  七 運(yùn)行結(jié)果截圖<

37、;/p><p><b>  八 流程圖</b></p><p><b>  九 課程設(shè)計總結(jié)</b></p><p>  這次課設(shè)收獲很多,之前在課上學(xué)的都是那些純理論的東西,感覺無法跟實際相連。所以剛開始拿到這題目感到無從下手,但是后來不斷的通過上網(wǎng)搜索和同學(xué)的討論才有點(diǎn)眉目,剛開始我就想開始寫程序,但發(fā)現(xiàn)問題很多,后來在同

溫馨提示

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

評論

0/150

提交評論