操作系統(tǒng)課程設(shè)計--進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)課程設(shè)計</b></p><p>  題目:進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)踐</p><p>  所在學(xué)院:計算機(jī)學(xué)院</p><p>  所在班級: </p><p><b>  學(xué)生姓名:</b></p><p><b&

2、gt;  學(xué)生學(xué)號:</b></p><p>  指導(dǎo)教師: </p><p><b>  2014年 1 月</b></p><p><b>  題目</b></p><p>  Linux或Windows或Unix環(huán)境下,采用系統(tǒng)調(diào)用中的信號量、P、V操作,編程解決以下

3、問題。</p><p>  題目:某銀行提供5個服務(wù)窗口(4個對私服務(wù)窗口,1個對公服務(wù)窗口)和10個供顧客等待的座位。顧客到達(dá)銀行時,若有空座位,則到取號機(jī)上領(lǐng)取一個號,等待叫號;若沒有空座位,則在門外等待或離開。取號機(jī)每次僅允許一位顧客使用,有對公和對私兩類號,每位顧客只能選取其中一個。當(dāng)營業(yè)員空閑時,通過叫號選取一位顧客,并為其服務(wù)。請用P、V操作寫出進(jìn)程的同步算法。</p><p>

4、;<b>  說明</b></p><p>  (1)可模擬設(shè)立一個服務(wù)時間區(qū)間如9:00-17:00,也可限定最大服務(wù)人數(shù)</p><p>  (2)顧客達(dá)到時間隨機(jī),辦理對私或?qū)珮I(yè)務(wù)隨機(jī),可通過隨機(jī)數(shù)產(chǎn)生。</p><p><b>  要求打?。?lt;/b></p><p><b>  

5、初始狀態(tài)</b></p><p><b>  中間變化的狀態(tài)信息</b></p><p>  以及最終狀態(tài)信息。 </p><p><b>  二、原理及算法</b></p><p>  顧客來了先判斷銀行內(nèi)是否還有空座位,如果沒有,則選擇等待或離開;如果有,便坐下,直到取號機(jī)無人使用再

6、去取號,取完號顧客繼續(xù)等待服務(wù),服務(wù)完了顧客離開;</p><p>  五、主要數(shù)據(jù)結(jié)構(gòu)和流程</p><p><b>  1、主要數(shù)據(jù)結(jié)構(gòu)</b></p><p>  定義兩個全局變量統(tǒng)計顧客的號碼和在門外等待顧客的數(shù)量,定義四個線程句柄數(shù)組,定義一個座位信號量來通知可分配的座位資源,通知等待營業(yè)員對私信號量通知可分配的等待對私資源,通知等待

7、營業(yè)員對公信號量等待對公資源,通知對私叫號信號量通知可分配的等待通知對私服務(wù)資源,通知對公叫號信號量通知等待對公服務(wù)資源。在設(shè)置一個互斥信號量用于取號。再設(shè)置兩個臨界區(qū)來防止程序運(yùn)行重疊。</p><p><b>  2、PV流程</b></p><p>  Semaphore seat;</p><p>  seat.value=10;<

8、;/p><p>  Semaphore privatewindow;</p><p>  privatewindow.value=1;</p><p>  Semaphore publicwindow;</p><p>  publicwindow.value=4;</p><p>  Semaphore machine;

9、</p><p>  machine.value=1;</p><p>  Semaphore privatecustomer;</p><p>  privatecustomer.value=0;</p><p>  Semaphore publiccustomer;</p><p>  publiccustomer

10、.value=0;</p><p>  process privatecustomer</p><p><b>  {</b></p><p>  if(seat=0)</p><p><b>  {</b></p><p><b>  等待或離開;</b&g

11、t;</p><p><b>  }</b></p><p><b>  p(&seat);</b></p><p>  p(&machine);</p><p><b>  取號;</b></p><p>  v(&machin

12、e);</p><p>  P(&privatewindow);</p><p><b>  被服務(wù);</b></p><p><b>  v(seat);</b></p><p><b>  }</b></p><p>  process pr

13、ivateserve</p><p><b>  {</b></p><p>  p(&privatecustomer);</p><p><b>  服務(wù);</b></p><p>  v(&privatewindow);</p><p><b>

14、  }</b></p><p>  process publiccustomer</p><p><b>  {</b></p><p>  if(seat=0)</p><p><b>  {</b></p><p><b>  等待或離開;</

15、b></p><p><b>  }</b></p><p><b>  p(&seat);</b></p><p>  p(&machine);</p><p><b>  取號;</b></p><p>  v(&mac

16、hine);</p><p>  p(&publicwindow);</p><p><b>  被服務(wù);</b></p><p><b>  v(seat);</b></p><p><b>  }</b></p><p>  process

17、publicserve</p><p><b>  {</b></p><p>  p(&publiccustomer);</p><p><b>  服務(wù);</b></p><p>  v(&publicwindow);</p><p><b> 

18、 }</b></p><p><b>  六、源程序清單</b></p><p>  #include"stdafx.h"</p><p>  #include"windows.h"</p><p>  #include "time.h"</p

19、><p>  #include<iostream></p><p>  using namespace std;</p><p>  #define StaticServer 1//私有服務(wù)</p><p>  #define PublicServer 4//公有服務(wù)</p><p>  #defi

20、ne Seat 10//桌位量</p><p>  #define ServeTime 3000//服務(wù)時間</p><p>  #define Customer_num 20//顧客數(shù)量</p><p>  #define Customer_time 1000//顧客來的最大間隔時間</p><p>  int n

21、umber = 0;//取號號碼</p><p>  int seat_num=10;</p><p>  HANDLE seat,s1,s2,cs1,cs2;</p><p>  HANDLE mutex;//互斥量</p><p>  HANDLE c1[10],c2[10],ss1[StaticServer],s

22、s2[PublicServer];//顧客,營業(yè)員線程</p><p>  CRITICAL_SECTION c_seat;//臨界區(qū),防止重疊</p><p>  CRITICAL_SECTION x;</p><p>  DWORD WINAPI server1(PVOID s1pv) //營業(yè)員對私線程代碼</p><p><

23、b>  {</b></p><p>  while(true)</p><p><b>  {</b></p><p>  WaitForSingleObject(cs1,INFINITE);//p(&cs1)</p><p>  Sleep(ServeTime);</p><

24、;p>  EnterCriticalSection(&x);</p><p>  cout<<"對私窗口叫號!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  ReleaseSemaphore(s1,1,NULL);//v(&s1)&

25、lt;/p><p>  EnterCriticalSection(&c_seat);</p><p>  seat_num++;</p><p>  LeaveCriticalSection(&c_seat);</p><p><b>  }</b></p><p><b>

26、  return 0;</b></p><p><b>  }</b></p><p>  DWORD WINAPI server2(PVOID s2pv) //營業(yè)員對公線程代碼</p><p><b>  {</b></p><p>  while(true)</p>

27、<p><b>  {</b></p><p>  WaitForSingleObject(cs2,INFINITE);//p(&cs2)</p><p>  Sleep(ServeTime);</p><p>  EnterCriticalSection(&x);</p><p>  cout

28、<<"對公窗口叫號!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  ReleaseSemaphore(s2,1,NULL);//v(&s2)</p><p>  EnterCriticalSection(&c_seat);</p&g

29、t;<p>  seat_num++;</p><p>  LeaveCriticalSection(&c_seat);</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b>

30、</p><p>  DWORD WINAPI consumer1(PVOID c1pv)//顧客對私線程代碼</p><p><b>  {</b></p><p>  srand((unsigned)time(0));</p><p>  int n=rand()%2;</p><p>  i

31、f(seat_num<=0&&n==1)</p><p><b>  {</b></p><p>  EnterCriticalSection(&x);</p><p>  cout<<"座位已滿,該顧客離開!"<<endl;</p><p>  

32、LeaveCriticalSection(&x);</p><p><b>  }</b></p><p>  else if(seat_num<=0)</p><p><b>  {</b></p><p>  seat_num--;</p><p>  En

33、terCriticalSection(&x);</p><p>  cout<<"該顧客在門外等待,已有"<<- seat_num<<"顧客在門外等待"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p><

34、b>  }</b></p><p>  EnterCriticalSection(&c_seat);</p><p>  seat_num--;</p><p>  LeaveCriticalSection(&c_seat);</p><p>  WaitForSingleObject(seat,INFINI

35、TE);//p(&seat)</p><p>  WaitForSingleObject(mutex,INFINITE);//p(&mutex)</p><p><b>  number++;</b></p><p>  int temp=number;</p><p>  EnterCriticalSe

36、ction(&x);</p><p>  cout<<"顧客"<<temp<<"已取號,為"<<temp<<"號!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>

37、  ReleaseMutex(mutex);//v(&mutex)</p><p>  ReleaseSemaphore(cs1,1,NULL);//v(&cs1)</p><p>  EnterCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<&

38、lt;"等待對私服務(wù)!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  Sleep(ServeTime);</p><p>  WaitForSingleObject(s1,INFINITE);//p(&s1)</p><p>  En

39、terCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<<"正在被服務(wù)!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  Sleep(ServeTime);&

40、lt;/p><p>  ReleaseSemaphore(seat,1,NULL);//v(&seat)</p><p>  seat_num++;</p><p>  if(seat_num<=0)</p><p><b>  {</b></p><p>  EnterCritical

41、Section(&x);</p><p>  cout<<"門外還剩"<<-seat_num<<"人在等待。"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p><b>  }</b><

42、;/p><p>  EnterCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<<"已經(jīng)被對私服務(wù),已離開!"<<endl;</p><p>  LeaveCriticalSection(&x);</p>&

43、lt;p><b>  return 0;</b></p><p><b>  }</b></p><p>  DWORD WINAPI consumer2(PVOID c2pv)//顧客對公線程代碼</p><p><b>  {</b></p><p>  srand(

44、(unsigned)time(0));</p><p>  int n=rand()%2;</p><p>  if( seat_num<=0&&n==1)</p><p><b>  {</b></p><p>  EnterCriticalSection(&x);</p>

45、<p>  cout<<"座位已滿,該顧客離開!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p><b>  }</b></p><p>  else if(seat_num<=0)</p><p&g

46、t;<b>  {</b></p><p>  seat_num--;</p><p>  EnterCriticalSection(&x);</p><p>  cout<<"該顧客在門外等待,已有"<<- seat_num<<"顧客在門外等待"<<

47、;endl;</p><p>  LeaveCriticalSection(&x);</p><p><b>  }</b></p><p>  EnterCriticalSection(&c_seat);</p><p>  seat_num--;</p><p>  Leave

48、CriticalSection(&c_seat);</p><p>  WaitForSingleObject(seat,INFINITE);//p(&seat)</p><p>  WaitForSingleObject(mutex,INFINITE);//p(&mutex)</p><p><b>  number++;<

49、/b></p><p>  int temp=number;</p><p>  EnterCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<<"已取號,為"<<temp<<"號!"<

50、;<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  ReleaseMutex(mutex);//v(&mutex)</p><p>  ReleaseSemaphore(cs2,1,NULL);//v(&cs2)</p><p>  EnterCritica

51、lSection(&x);</p><p>  cout<<"顧客"<<temp<<"等待對公服務(wù)!"<<endl;</p><p>  LeaveCriticalSection(&x);</p><p>  Sleep(ServeTime);</p>

52、<p>  WaitForSingleObject(s2,INFINITE);//p(&s2)</p><p>  EnterCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<<"正在被服務(wù)!"<<endl;</p>

53、<p>  LeaveCriticalSection(&x);</p><p>  Sleep(ServeTime);</p><p>  ReleaseSemaphore(seat,1,NULL);//v(&seat)</p><p>  seat_num++;</p><p>  if(seat_num<

54、;=0)</p><p><b>  {</b></p><p>  EnterCriticalSection(&x);</p><p>  cout<<"門外還剩"<<-seat_num<<"人在等待。"<<endl;</p><

55、;p>  LeaveCriticalSection(&x);</p><p><b>  }</b></p><p>  EnterCriticalSection(&x);</p><p>  cout<<"顧客"<<temp<<"已經(jīng)被對公服務(wù),已離開!&

56、quot;<<endl;</p><p>  LeaveCriticalSection(&x);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int main(void)//主程序</p>&l

57、t;p>  {//創(chuàng)建信號量和線程</p><p>  cout<<"顧客您好,歡迎來到我行,很高興為您服務(wù)!"<<endl;</p><p>  seat = CreateSemaphore(NULL,Seat , Seat, NULL);</p><p>  s1 = CreateSemaphore(NULL,

58、0 , StaticServer , NULL);</p><p>  s2 = CreateSemaphore(NULL, 0 , PublicServer , NULL);</p><p>  cs1 = CreateSemaphore(NULL, 0 , Seat , NULL);</p><p>  cs2 = CreateSemaphore(NULL, 0

59、 , Seat , NULL);</p><p>  mutex = CreateMutex(NULL,FALSE,NULL);</p><p>  InitializeCriticalSection(&x);</p><p>  InitializeCriticalSection(&c_seat);</p><p><

60、b>  int n,n1;</b></p><p>  for(n=0;n<StaticServer;n++)</p><p>  CreateThread(NULL,0,server1,NULL,0,NULL);</p><p>  for(n=0;n<PublicServer;n++)</p><p>  C

61、reateThread(NULL,0,server2,NULL,0,NULL);</p><p>  srand( (unsigned)time( NULL ) );</p><p><b>  n=0;n1=0;</b></p><p>  for(;number<Customer_num;)//用隨機(jī)數(shù)來判斷顧客是對私還是對公&

62、lt;/p><p><b>  {</b></p><p>  int m=rand()%Customer_time;</p><p><b>  Sleep(m);</b></p><p>  int i=rand()%2;</p><p><b>  if(i==0

63、)</b></p><p><b>  {</b></p><p>  CreateThread(NULL,0,consumer1,NULL,0,NULL);</p><p><b>  n++;</b></p><p><b>  }</b></p>

64、<p><b>  else</b></p><p><b>  {</b></p><p>  CreateThread(NULL,0,consumer2,NULL,0,NULL);</p><p><b>  n1++;</b></p><p><b>

65、;  }</b></p><p><b>  } </b></p><p>  Sleep(2000);</p><p>  cout<<"銀行結(jié)束服務(wù),祝您愉快!"<<endl;</p><p><b>  return 0;</b><

66、/p><p><b>  }</b></p><p>  七、實(shí)驗(yàn)結(jié)果及程序分析</p><p><b>  1、實(shí)驗(yàn)結(jié)果:</b></p><p><b>  2、結(jié)果分析:</b></p><p>  當(dāng)顧客來了,首先查看是否有桌位,沒有桌位顧客選擇在門

67、口等待或者離開,若有桌位就去取號,取完號之后等待服務(wù),當(dāng)營業(yè)員叫號以后開始被服務(wù),服務(wù)完了之后離開。當(dāng)所有線程執(zhí)行完了之后程序結(jié)束。</p><p><b>  八、課設(shè)總結(jié)</b></p><p>  通過此次課程設(shè)計,使我更加扎實(shí)的掌握了有關(guān)操作系PV操作,在設(shè)計過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我

68、在這方面的知識欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。</p><p>  過而能改,善莫大焉。在課程設(shè)計過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領(lǐng)悟,本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多問題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)

69、現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會及他人對你的認(rèn)可!</p><p>  我認(rèn)為,在這學(xué)期的實(shí)驗(yàn)中,不僅培養(yǎng)了獨(dú)立思考、動手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實(shí)驗(yàn)課上,我們學(xué)會了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)

70、踐,再學(xué)習(xí)、再實(shí)踐。這對于我們的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我們都可以在實(shí)驗(yàn)結(jié)束之后變的更加成熟,會面對需要面對的事情。</p><p>  回顧起此課程設(shè)計,至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)

溫馨提示

  • 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

提交評論