2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)課程設(shè)計</b></p><p><b>  目 錄</b></p><p>  1. 課程設(shè)計目的3</p><p><b>  2. 設(shè)計要求3</b></p><p>  3. 問題具體描述3</p><p

2、><b>  4. 設(shè)計分析3</b></p><p><b>  5. 設(shè)計分工4</b></p><p>  6. 數(shù)據(jù)結(jié)構(gòu)說明4</p><p>  7. 系統(tǒng)結(jié)構(gòu)說明4</p><p>  8. 系統(tǒng)調(diào)用說明4</p><p>  9. 分工設(shè)計說明

3、5</p><p>  10. 算法流程圖5</p><p>  11. 分工代碼6</p><p>  12. 整體代碼7</p><p>  13. 程序運行10</p><p><b>  14. 總結(jié)11</b></p><p><b>  課程

4、設(shè)計目的</b></p><p>  1.內(nèi)容圍繞操作系統(tǒng)原理中最重要的基本概念和基本原理展開</p><p>  2.鞏固對原理知識的學(xué)習(xí)效果</p><p>  3.加深對基本概念的理解</p><p>  4.學(xué)習(xí)如何將基本原理和實際設(shè)計、應(yīng)用有機結(jié)合</p><p>  5.鍛煉本專業(yè)的基本能力&l

5、t;/p><p><b>  設(shè)計要求</b></p><p>  1: 進程間通信、并發(fā)(同步/互斥)、文件讀寫</p><p>  2: 內(nèi)存管理、Dll、Windows消息機制、IO (尚未最終定型)</p><p><b>  問題具體描述</b></p><p>  1

6、.完成N個生產(chǎn)者和M個消費者之間的并發(fā)控制,N、M不低于5,數(shù)據(jù)發(fā)送和接收緩沖區(qū) 大小不小于10個。</p><p>  2.某個生產(chǎn)者進程生產(chǎn)的消息供K個消費者進程消費。K《=M。某些消費進程消費多個生產(chǎn)者生產(chǎn)的消息。生產(chǎn)者和消費者之間的對應(yīng)關(guān)系可以在程序開始有一個文件中讀入,也可以動態(tài)調(diào)整。</p><p>  3.每個生產(chǎn)進程生產(chǎn)M個消息后結(jié)束運行。如果一個消費者進程沒有對應(yīng)的生產(chǎn)者

7、進程在運行后,也結(jié)束運行。</p><p><b>  設(shè)計分析</b></p><p>  課程設(shè)計的主要目的是了解并且掌握進程之間的同步互斥,和進程之間的通信問題。結(jié)合課本上的生產(chǎn)者與消費者問題可以從這方面來實現(xiàn)一個多進程的小系統(tǒng),并且解決多個進程之間的通信,并發(fā)等問題,以此來達到課程設(shè)計的目的。理發(fā)師問題是將顧客看做生產(chǎn)者,將理發(fā)師作為消費者。設(shè)置一定數(shù)量的椅子

8、的數(shù)目來作為緩存區(qū)的大小。顧客來到的時候坐在椅子上,將自己作為“產(chǎn)品”,理發(fā)師理發(fā)的時候從椅子上叫走顧客,相當(dāng)于消費“產(chǎn)品”,從而達到了課程設(shè)計要求的前一個要求。</p><p>  顧客作為生產(chǎn)者,每到來一個就使計數(shù)器count增加1,以便讓理發(fā)師理發(fā)(相當(dāng)于消費)至最后一個顧客(相當(dāng)于產(chǎn)品)。并且,第1個到來的顧客應(yīng)負責(zé)喚醒理發(fā)師;如果不是第1個到達的顧客,則在有空椅子的情況下坐下等待,否則離開理發(fā)店(該消息

9、可由計數(shù)器count獲得)。主要有以下一些函數(shù)來實現(xiàn)整個問題的實現(xiàn)過程:</p><p>  用隨機函數(shù)random()來產(chǎn)生進入理發(fā)店的顧客。</p><p> ?。?)定義理發(fā)師的理發(fā)函數(shù)cuthair()用來實現(xiàn)理發(fā)操作。</p><p> ?。?)定義顧客被理發(fā)的函數(shù)gethaircut()用來實現(xiàn)顧客被理發(fā)的操作。</p>&l

10、t;p> ?。?)用顧客線程customer實現(xiàn)對顧客行為的控制。</p><p> ?。?)用理發(fā)師線程barber實現(xiàn)對理發(fā)師行為的控制。</p><p> ?。?)定義主函數(shù)main實現(xiàn)對兩個線程的控制和執(zhí)行操作。</p><p><b>  設(shè)計分工</b></p><p><b>  成員:李寧

11、 侯紹立</b></p><p><b>  分工:</b></p><p>  理發(fā)師進程、信號量的設(shè)置、理發(fā)師函數(shù) :xxx</p><p>  顧客進程、顧客函數(shù)、主函數(shù):xx</p><p><b>  數(shù)據(jù)結(jié)構(gòu)說明</b></p><p>  本程序用到

12、了數(shù)據(jù)結(jié)構(gòu)中的隊列,理發(fā)的顧客由隨機函數(shù)產(chǎn)生,顧客遵從先到先理發(fā)的原則,但隊列的長度限制為輸入的理發(fā)店中的椅子的個數(shù),當(dāng)理發(fā)店的椅子沒有空位的時候,到來的顧客主動退出加入隊列。理發(fā)師對隊列中的顧客進行先到先服務(wù)的原則理發(fā)。</p><p><b>  7. 系統(tǒng)結(jié)構(gòu)說明</b></p><p><b> ?。ㄒ唬╊^文件聲明</b></p&g

13、t;<p>  #include "windows.h"</p><p>  #include "iostream.h"</p><p>  #include "math.h"</p><p><b>  (二)定義各種變量</b></p><p>

14、;  int long waiting(0); </p><p>  int chairs; </p><p>  char open_door; </p><p>  char close_door; </p><p>  int

15、 count(0); </p><p>  int finish(0); </p><p><b> ?。ㄈ┬盘柫康亩x</b></p><p>  HANDLE Mutex =::CreateMutex(NULL, FALSE, "Mutex"); </p&g

16、t;<p>  HANDLE barbers =::CreateSemaphore(NULL, 1,1, "barbers"); </p><p>  HANDLE customers =::CreateSemaphore(NULL,0,3,"customers");</p><p><b>  8. 系統(tǒng)調(diào)用說明<

17、/b></p><p>  (1)CreateThread():創(chuàng)建線程</p><p> ?。?)CreateMutex():找出當(dāng)前系統(tǒng)是否已經(jīng)存在指定進程的實例。如果沒有則創(chuàng)建一個互斥體,用來同步。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。CreateMutex()函數(shù)可用來創(chuàng)建一個有名或無名的互斥量對象</p>

18、<p>  (3)CreateSemaphore():CreateSemaphore() 是系統(tǒng)提供的API,包含在Windows.h 中,應(yīng)用在同步的處理中。作用是創(chuàng)建一個新的信號機,執(zhí)行成功,返回信號機對象的句柄;零表示出錯。一旦不再需要,一定記住用CloseHandle關(guān)閉信號機的句柄。它的所有句柄都關(guān)閉以后,對象自己也會刪除。一旦值大于零,信號機就會觸發(fā)(發(fā)出信號)。Semaphore是一個同步問題機制,不論是Even

19、t或Mutex,其他Process在執(zhí)WaitForSingleObject時,就看當(dāng)時的物件是Signal或UnSignal而決定是否等待,而Semaphore也相同,但是它要變成Signal /UnSignal的狀態(tài),卻有些不同,它是提供一個計數(shù)值,它允許在這個計數(shù)值之內(nèi),任何執(zhí)行到WaitForSingleObject的Thread都不會停下來,而且每執(zhí)行WaitForSingleObject一次,計數(shù)值就減一,當(dāng)計數(shù)值變成0時,

20、該Semaphore才會處於UnSignal的狀態(tài),而某個Thread ReleaseSemaphore時,便會將計數(shù)值增加,以便其他的Thr</p><p> ?。?)ReleaseSemaphore():ReleaseSemaphore()函數(shù)的作用是增加信號機的計數(shù)。如果成功,就調(diào)用信號機上的一個等待函數(shù)來減少它的計數(shù)。</p><p> ?。?)WaitForSingleObjec

21、t():函數(shù)用來檢測hHandle事件的信號狀態(tài),在某一線程中調(diào)用該函數(shù)時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內(nèi),線程所等待的對象變?yōu)橛行盘枲顟B(tài),則該函數(shù)立即返回;如果超時時間已經(jīng)到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態(tài),函數(shù)照樣返回。參數(shù)dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數(shù)立即返回;若為INFINITE,則線程一

22、直被掛起,直到hHandle所指向的對象變?yōu)橛行盘枲顟B(tài)時為止。</p><p> ?。?)ResumeThread():線程恢復(fù)函數(shù),使用該函數(shù)能激活線程的運行,使CPU分配資源讓線程恢復(fù)運行。</p><p>  (7)ReleaseMutex():釋放由線程擁有的一個互斥體</p><p>  (8)Sleep():睡眠等待</p><p&g

23、t;<b>  9. 分工設(shè)計說明</b></p><p><b>  需要用到的信號量:</b></p><p>  HANDLE Mutex =::CreateMutex(NULL, FALSE, "Mutex"); </p><p>  實現(xiàn)顧客與理發(fā)師對公用緩存區(qū)的互斥操作</p&g

24、t;<p>  HANDLE barbers =::CreateSemaphore(NULL, 1,1, "barbers"); </p><p>  HANDLE customers =::CreateSemaphore(NULL,0,3,"customers");</p><p>  ::WaitForSingleObject(

25、customers,INFINITE); 等待顧客進程的V(customer)操作</p><p>  ::WaitForSingleObject(Mutex,INFINITE); 申請操作顧客與理發(fā)師公用的緩存區(qū) </p><p>  ::ReleaseSemapho

26、re(barbers,1,NULL); 釋放信號量barbers</p><p>  ::ReleaseMutex(Mutex); 釋放信號量Mutex,允許顧客操作緩存區(qū)</p><p><b>  算法流程圖</b></p><p><b>  分工代碼</b></p><p>  #incl

27、ude "windows.h"</p><p>  #include "iostream.h"</p><p>  #include "math.h"</p><p>  int long waiting(0); //等待理發(fā)的顧客人數(shù)</p><p>  int

28、 chairs; //店中椅子的總數(shù)目</p><p>  char open_door; //開門</p><p>  char close_door; //關(guān)門</p><p>  int count(0); //顧客的序號</p>

29、<p>  int finish(0); //已經(jīng)理完發(fā)的顧客人數(shù)</p><p><b>  DWORD a;</b></p><p>  HANDLE Mutex =::CreateMutex(NULL, FALSE, "Mutex"); //用來實現(xiàn)進程的互斥 </p>&l

30、t;p>  HANDLE barbers =::CreateSemaphore(NULL, 1,1, "barbers"); //定義信號量來進行線程間的同步</p><p>  HANDLE customers =::CreateSemaphore(NULL,0,3,"customers"); //定義信號量來進行線程間的同步</p><p&

31、gt;  int random()</p><p>  //定義隨機函數(shù)來產(chǎn)生顧客,并使兩個顧客間的時間少于15秒</p><p><b>  {</b></p><p>  return (rand()*15000)/RAND_MAX;</p><p><b>  }</b></p>

32、<p>  void cuthair()</p><p>  //理發(fā)師的理發(fā)函數(shù),用時15秒</p><p><b>  { </b></p><p>  ::Sleep (15000);</p><p>  cout<<"理發(fā)結(jié)束 !"<<endl;</p

33、><p><b>  }</b></p><p>  DWORD WINAPI barber(LPVOID pParm1)</p><p><b>  //理發(fā)師線程</b></p><p><b>  {</b></p><p>  while(true)

34、 </p><p><b>  {</b></p><p>  ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顧客</p><p>  ::WaitForSingleObject(Mutex,INFINITE); //等待互斥量<

35、/p><p>  waiting--; //等待的人數(shù)減1</p><p>  ::ReleaseSemaphore(barbers,1,NULL); //釋放信號量</p><p>  ::ResumeThread(barbers); //喚醒顧客進程</p&g

36、t;<p>  ::ReleaseMutex(Mutex); //v(mutex); </p><p>  cuthair(); </p><p>  finish++; </p><p><

37、;b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  整體代碼</b></p><p>  #include "windows.h"</p&g

38、t;<p>  #include "iostream.h"</p><p>  #include "math.h"</p><p>  int long waiting(0); //等待理發(fā)的顧客人數(shù)</p><p>  int chairs; //店中椅子的

39、總數(shù)目</p><p>  char open_door; //開門</p><p>  char close_door; //關(guān)門</p><p>  int count(0); //顧客的序號</p><p>  int finish(0);

40、 //已經(jīng)理完發(fā)的顧客人數(shù)</p><p><b>  DWORD a;</b></p><p>  HANDLE Mutex =::CreateMutex(NULL, FALSE, "Mutex"); //用來實現(xiàn)進程的互斥 </p><p>  HANDLE barbers =::Crea

41、teSemaphore(NULL, 1,1, "barbers"); //定義信號量來進行線程間的同步</p><p>  HANDLE customers =::CreateSemaphore(NULL,0,3,"customers"); //定義信號量來進行線程間的同步</p><p>  int random()</p><

42、p>  //定義隨機函數(shù)來產(chǎn)生顧客,并使兩個顧客間的時間少于15秒</p><p><b>  {</b></p><p>  return (rand()*15000)/RAND_MAX;</p><p><b>  }</b></p><p>  void cuthair()</p&

43、gt;<p>  //理發(fā)師的理發(fā)函數(shù),用時15秒</p><p><b>  { </b></p><p>  ::Sleep (15000);</p><p>  cout<<"理發(fā)結(jié)束 !"<<endl;</p><p><b>  }</b

44、></p><p>  void gethaircut()</p><p>  // 顧客被理發(fā)的函數(shù)</p><p><b>  {</b></p><p>  ::Sleep (15001); //顧客被理發(fā)的函數(shù),為了和理發(fā)師之間有所區(qū)別,比理發(fā)師理發(fā)時間長1毫秒</p>&l

45、t;p>  cout<<"第"<<finish<<"個顧客理發(fā)完畢,離開 "<<endl; </p><p><b>  }</b></p><p>  DWORD WINAPI customer(LPVOID pParm2)</p><p><

46、;b>  // 顧客線程</b></p><p><b>  {</b></p><p>  ::WaitForSingleObject(Mutex ,INFINITE); //P(mutex)來進行互斥操作</p><p>  count++;

47、 //來的是第幾個顧客</p><p>  cout<<"顧客敲門!第 "<<count<<" 個顧客到來 "<<endl; </p><p>  if (waiting<chairs) //如果有空椅子</p><p>&

48、lt;b>  { </b></p><p>  if (waiting!=0)</p><p><b>  {</b></p><p>  cout<<"現(xiàn)在有"<<waiting <<" 個人在等待理發(fā)"<<endl;</p>

49、;<p><b>  }</b></p><p><b>  else</b></p><p>  cout<<"無人在等待理發(fā)"<<endl; //輸出有多少人在等待</p><p>  waiting++;</p><p&g

50、t;  cout<<"剩余"<<chairs-waiting+1<<"個座位"<<endl;</p><p>  cout<<"有空位,顧客已坐下"<<endl;</p><p>  ::ReleaseSemaphore(customers,1,NULL);

51、//V(customer)</p><p>  ::ResumeThread(customers);//喚醒理發(fā)師進程</p><p>  ::ReleaseMutex(Mutex);//釋放互斥量,以便其他線程使用</p><p>  ::WaitForSingleObject(barbers,INFINITE);//等待理發(fā)</p>

52、<p>  gethaircut();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"沒有空椅子,第"&

53、lt;<count<<"個顧客離開理發(fā)店"<<endl; //沒有椅子,顧客直接離開</p><p>  ::ReleaseMutex(Mutex);</p><p><b>  }</b></p><p><b>  return 0;</b></p>&l

54、t;p><b>  }</b></p><p>  DWORD WINAPI barber(LPVOID pParm1)</p><p><b>  //理發(fā)師線程</b></p><p><b>  {</b></p><p>  while(true)

55、 </p><p><b>  {</b></p><p>  ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顧客</p><p>  ::WaitForSingleObject(Mutex,INFINITE); //等待互斥量</p>

56、<p>  waiting--; //等待的人數(shù)減1</p><p>  ::ReleaseSemaphore(barbers,1,NULL); //釋放信號量</p><p>  ::ResumeThread(barbers); //喚醒顧客進程</p><

57、p>  ::ReleaseMutex(Mutex); //v(mutex); </p><p>  cuthair(); </p><p>  finish++; </p><p><b> 

58、 }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int main(int argc, char* argv[])</p><p><b>  //實現(xiàn)線程的操作</b></p&g

59、t;<p><b>  {</b></p><p>  cout<<"輸入理發(fā)店中的椅子個數(shù):";</p><p>  cin>>chairs;</p><p>  cout<<"店中有"<<chairs<<"把椅子&qu

60、ot;<<endl; //設(shè)置椅子數(shù)目</p><p>  cout<<"是否開始接待顧客?Y/N"<<endl; //是否開門營業(yè)</p><p>  cin>>open_door;</p><p>  while (open_door!='y')</p>

61、<p><b>  {</b></p><p>  cout<<endl<<"尚未營業(yè)!"<<endl;</p><p>  cout<<"是否開始接待顧客?Y/N"<<endl;</p><p>  cin>>open_

62、door;</p><p><b>  }</b></p><p>  HANDLE hThread1;</p><p>  HANDLE hThread2;</p><p>  hThread2=::CreateThread (NULL,0,barber,NULL,0,NULL); //產(chǎn)生一個理發(fā)師進程</p&

63、gt;<p>  while(close_door!='y')</p><p><b>  { </b></p><p>  ::Sleep(random());//函數(shù)實現(xiàn)顧客隨機到來</p><p>  hThread1=::CreateThread(NULL,0,customer,NULL,a,NULL);&

64、lt;/p><p>  cout<<endl<<"正在營業(yè),請進!"<<endl; </p><p>  if (finish>=8 && waiting==0)</p><p>  //如果完成數(shù)超過8并且沒有人等待</p><p><b>  {</

65、b></p><p>  cout<<"已經(jīng)為"<<finish<<"個顧客理發(fā)了,是否停止?fàn)I業(yè)?"<<endl; //提示是否關(guān)門</p><p>  cin>>close_door;</p><p>  return close_door; </p&g

66、t;<p><b>  }</b></p><p><b>  }</b></p><p>  if (close_door=='y') </p><p><b>  {</b></p><p>  cout<<"暫停營業(yè)!歡

67、迎下次光臨!"<<endl;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p&

68、gt;<p><b>  程序運行</b></p><p><b>  開始</b></p><p><b>  輸入椅子數(shù)目</b></p><p><b>  選擇是否接待顧客</b></p><p><b>  接待顧客<

69、;/b></p><p><b>  理發(fā)完畢</b></p><p><b>  總結(jié)</b></p><p>  通過這個課程設(shè)計,對于課本上的關(guān)于進程之間的同步、互斥有了更深層的認識,而且有了具體上直觀上的理解。雖然對于第二個課程設(shè)計要求沒有達到,但我也學(xué)到了許多。進程作為系統(tǒng)的基本的操作單位,其之間的互斥、同

70、步是非常重要的。生產(chǎn)者與消費者這一個問題中,生產(chǎn)者與消費者公用一個緩存區(qū),這就涉及到了兩個進程對緩存區(qū)的互斥操作,否者將會產(chǎn)生許多不切實際的問題,這也就失去的系統(tǒng)操作的實際意義。而通過一個互斥信號量Mutex便很好的解決了這一個問題,兩個進程在操作緩存區(qū)之前必須先申請使用,如果信號量表示已有進程正在對緩存區(qū)進行操作則必須等待其完成方可。在做這個設(shè)計的時候也遇到了許多問題,例如信號量的設(shè)置。由于這個問題中不僅涉及到理發(fā)師與顧客之間的互斥同

71、步問題,還設(shè)計到各個顧客進程之間的互斥同步問題,所以起初信號量設(shè)置不足而導(dǎo)致問題出錯。</p><p>  總的來講,此次課程設(shè)計對我們操作系統(tǒng)知識的鞏固起了重要作用,讓我們受到了很多啟發(fā),懂得了怎樣更好的去學(xué)習(xí)操作系統(tǒng)課程。操作系統(tǒng)不在是一個模糊的概念存在,許多實際的例子,問題都能涉及到操作系統(tǒng)方面的知識。這也看出了操作系統(tǒng)對于整個計算機學(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論