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

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設計報告</p><p>  題 目: 讀者寫者問題</p><p>  學 院: </p><p>  專 業(yè): </p><p>  班 級: </p><p>  學 號:

2、 </p><p>  姓 名: </p><p>  指導老師: </p><p>  目 錄</p><p>  一 設計概述……………………………………………………3</p><p>  二 設計目的與內容……………………………………………4<

3、;/p><p>  三 設計分析……………………………………………………5</p><p>  四 程序實現(xiàn)……………………………………………………6</p><p>  五 程序調試……………………………………………………7</p><p>  六 結果分析和討論……………………………………………7</p><p&g

4、t;  七 心得體會……………………………………………………8</p><p>  八 源代碼 ………………………………………………………8</p><p>  九 實驗截圖……………………………………………………14</p><p><b>  一 設計概述</b></p><p>  所謂讀者寫者問題,是指保證一個

5、writer進程必須與其他進程互斥地訪問共享對象的同步問題。</p><p>  讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是,只能有一個寫者在寫書,并且,讀者必寫者優(yōu)先,也就是說,讀者和寫者同時提出請求時,讀者優(yōu)先。當讀者提出請求時需要有一個互斥操作,另外,需要有一個信號量S來當前是否可操作。</p><p>  信

6、號量機制是支持多道程序的并發(fā)操作系統(tǒng)設計中解決資源共享時進程間的同步與互斥的重要機制,而讀者寫者問題則是這一機制的一個經典范例。</p><p>  與記錄型信號量解決讀者—寫者問題不同,信號量機制它增加了一個限制,即最多允許RN個讀者同時讀。為此,又引入了一個信號量L,并賦予初值為RN,通過執(zhí)行wait(L,1,1)操作,來控制讀者的數目,每當有一個讀者進入時,就要執(zhí)行wait(L,1,1)操作,使L的值減1。

7、當有RN個讀者進入讀后,L便減為0,第RN+1 個讀者要進入讀時,必然會因wait(L,1,1)操作失敗而堵塞。對利用信號量來解決讀者—寫者問題的描述如下:</p><p>  Var RN integer;L,mx:semaphore: =RN,1;</p><p><b>  Begin</b></p><p><b>  Par

8、begin</b></p><p>  Reader :begin</p><p><b>  Repeat</b></p><p>  Swait(L,1,1);</p><p>  Swait(mx,1,0);       .</p>

9、<p>  Perform reader operation;</p><p>  Ssignal(L,1);</p><p>  Until false;</p><p><b>  End</b></p><p>  Writer :begin</p><p><b>

10、  Repeat</b></p><p>  Swait(mx ,1,1,l,RN,0);</p><p>  Perform writer operation;</p><p>  Ssignal(mx,1);</p><p>  Until false;</p><p><b>  End&l

11、t;/b></p><p><b>  Parend</b></p><p><b>  End</b></p><p>  其中,Swait(mx,1,0)語句起著開關作用,只要無Writer進程進入些,mx=1,reader進程就都可以進入讀。但是要一旦有Writer進程進入寫時,其MX=0,則任何reader進

12、程就都無法進入讀。Swait(mx ,1,1,l,RN,0)語句表示僅當既無Write進程在寫(mx=1),又無reader進程在讀(L=RN)時,writer進程才能進入臨界區(qū)寫。</p><p>  本設計方案就是通過利用記錄型信號量對讀者寫者問題的解決過程進行模擬演示,形象地闡述記錄型信號量機制的工作原理。</p><p><b>  二 設計目的與內容</b>

13、</p><p><b>  一 實驗目的</b></p><p>  l. 用信號量來實現(xiàn)讀者寫者問題。</p><p>  2. 理解和運用信號量、PV原語、進程間的同步互斥關系等基本知識。二、二 實驗內容</p><p>  讀者寫者問題的定義如下:有一個許多進程共享的數據區(qū),這個數據區(qū)可以是一個文件或者主存的一塊

14、空間;有一些只讀取這個數據區(qū)的進程(Reader)和一些只往數據區(qū)寫數據的進程(Writer),此外還需要滿足以下條件:</p><p>  (1)    任意多個讀進程可以同時讀這個文件;</p><p> ?。?)    一次只有一個寫進程可以往文件中寫;</p><p> ?。?) 

15、0;  如果一個寫進程正在進行操作,禁止任何讀進程度文件。</p><p>  我們需要分兩種情況實現(xiàn)該問題:</p><p>  讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。</p><p>  寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完

16、成寫操作后才開始讀操作。</p><p><b>  三設計分析</b></p><p>  在Windows 7 環(huán)境下,創(chuàng)建一個包含n 個線程的控制臺進程。用這n 個線程來表示n個讀者或寫者。每個線程按相應測試數據文件的要求,進行讀寫操作。請用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。</p><p>  讀者-寫者問題的讀寫操

17、作限制:</p><p>  讀者-寫者的讀寫限制(包括讀者優(yōu)先和寫者優(yōu)先)</p><p>  1)寫-寫互斥,即不能有兩個寫者同時進行寫操作</p><p>  2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫</p><p>  3)讀讀允許,即可以有2個以上的讀者同時讀</p><p>  將所有

18、的讀者和所有的寫者分別放進兩個等待隊列中,當讀允許時就讓讀者隊列釋放一個或多個讀者,當寫允許時,釋放第一個寫者操作。讀者寫者問題的定義如下:有一個許多進程共享的數據區(qū),這個數據區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數據區(qū)的進程(Reader)和一些只往數據區(qū)寫數據的進程(Writer),此外還需要滿足以下條件:1)任意多個讀進程可以同時讀這個文件;2) 一次只有一個寫進程可以往文件中寫;3)如果一個寫進程正在進行操作,禁止

19、任何讀進程度文件。我們需要分兩種情況實現(xiàn)該問題:</p><p>  讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。</p><p><b>  四 程序實現(xiàn)  </b><

20、/p><p><b>  程序由兩部分組成:</b></p><p>  1。讀者-寫者模塊:包括系統(tǒng)調用接口,讀者-寫者活動描述主程序。系統(tǒng)接口主要功能是通過管道向父進程發(fā)送系統(tǒng)調用命令,并讀取父進程送來的返回值。</p><p>  讀者-寫者活動程序根據臨界資源的共享,互斥原則編制,具體見源程序。</p><p>  

21、2。主控模塊:主控模塊實現(xiàn)系統(tǒng)初始化系統(tǒng)調用命令接收與解釋執(zhí)行,系統(tǒng)調用功能的實現(xiàn)(包括信號量機制),及讀者-寫者活動過程記錄與顯示。</p><p>  初始化系統(tǒng)環(huán)境   </p><p>  建立通信管道      </p><p>  啟動讀者-寫者進程  &

22、#160;</p><p><b>  接收系統(tǒng)調用命令</b></p><p><b>  解釋執(zhí)行   </b></p><p><b>  五 程序調試</b></p><p><b>  測試數據文件格式:</b>&l

23、t;/p><p>  測試數據文件包括n 行測試數據,分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數據包括四個字段,各字段間用空格分隔。第一字段為一個正整數,表示線程序號。第二字段表示相應線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數,表示讀寫操作的開始時間。線程創(chuàng)建后,延時相應時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數,表示讀寫操作的持續(xù)時間。當

24、線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應時間后結束,并釋放共享資源。</p><p><b>  六 結果分析和討論</b></p><p>  在讀者寫者同時在隊列中等待申請資時,讀者優(yōu)先調用資源。而且如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作,即讀讀允許。</p><p>  進程1

25、是R操作,在時間3時進入隊列,運行時間是5,在它進入時沒有進程占用資源,它既占用資源;知道它釋放資源,等候的進程有3,4,5;</p><p>  進程2是W操作,在時間16時進入隊列,運行時間是5,在它進入時進程4占用資源,它等待資源,當4釋放時占用資源;</p><p>  進程3是R操作,在時間5時進入隊列,運行時間是2,在它進入時進程1占用資源,它等待資源,當進程1釋放資源后,由于

26、讀者優(yōu)先,進程3,5同時調運資源;</p><p>  進程4是R操作,在時間6時進入隊列,運行時間是5,在它進入時進程1占用資源,它等待資源,當進程1釋放資源后,由于讀者優(yōu)先,進程3,5占用資源,它依然等待,直到進程3,5都結束;</p><p>  進程5是W操作,在時間4時進入隊列,運行時間是3, 在它進入時進程1占用資源,它等待資源,當進程1釋放資源后,由于讀者優(yōu)先,進程3,5同時

27、調運資源;</p><p><b>  七 心得體會</b></p><p>  這一次課程設計,讓我體會很深刻。讀者-寫者問題經典的線程同步問題的一個模型。經過讀者寫者問題的編寫,我對同步機構應用有了深入的了解。懂得了運用信號量實現(xiàn)進程間的互斥。實現(xiàn)了不讓共享資源同時修改。用信號量上的原語操作使臨界段問題的解決比較簡單明了了。讀者寫者問題的編寫,花的時間很多,也學到

28、很多東西。了解支持多道程序的并發(fā)操作系統(tǒng)設計中解決資源共享時進程間的同步與互斥的信號量機制。幾天的試驗,雖然難度有點大,但只要自己花時間去學習,還是會攻克困難的。</p><p>  總之,每一次課程設計不僅是我們學習的好機會,而且是我們鍛煉實際動手能力的平臺,雖然有難度的東西總會讓人很抵觸,比如在課設過程中有很多郁悶的時候,一個小小的錯誤一不小心就花去了自己一上午的時間,所以在這個過程中能夠磨練人的意志與耐心,

29、最后感謝鄒云康老師的指導與監(jiān)督。</p><p><b>  八 源代碼</b></p><p>  #include <windows.h></p><p>  #include <ctype.h></p><p>  #include <stdio.h></p>&l

30、t;p>  #include <string.h></p><p>  #include <stdlib.h></p><p>  #include <malloc.h></p><p>  #define  MAX_PERSON   100</p><p>  #def

31、ine  READER       0 //讀者</p><p>  #define  WRITER       1 //寫者</p><p>  #define  END      

32、;   -1</p><p>  #define  R            READER</p><p>  #define  W         &

33、#160;  WRITER</p><p>  typedef struct _Person</p><p><b>  {</b></p><p>  HANDLE m_hThread;//定義處理線程的句柄</p><p>  int    m_nType;//進程類型(讀寫)

34、</p><p>  int    m_nStartTime;//開始時間</p><p>  int    m_nWorkTime;//運行時間</p><p>  int    m_nID;//進程號</p><p><b>  }Pers

35、on;</b></p><p>  Person g_Persons[MAX_PERSON];</p><p>  int    g_NumPerson = 0;</p><p>  long   g_CurrentTime= 0;//基本時間片數</p><p>  int

36、60;   g_PersonLists[] = {//進程隊列</p><p>  1, R, 3, 5,  2, W, 4, 5,  3, R, 5, 2,</p><p>  4, R, 6, 5,  5, W, 5.1, 3, END,};</p><p>  int    g_N

37、umOfReading = 0;</p><p>  int    g_NumOfWriteRequest = 0;//申請寫進程的個數</p><p>  HANDLE g_hReadSemaphore;//讀者信號</p><p>  HANDLE g_hWriteSemaphore;//寫者信號</p><p&

38、gt;  bool finished = false; //所有的讀完成</p><p>  //bool wfinished = false; //所有的寫完成</p><p>  void  CreatePersonList(int *pPersonList);</p><p>  bool  CreateReader(int StartTi

39、me,int WorkTime,int ID);</p><p>  bool  CreateWriter(int StartTime,int WorkTime,int ID);</p><p>  DWORD  WINAPI    ReaderProc(LPVOID lpParam);</p><p>  DWOR

40、D  WINAPI    WriterProc(LPVOID lpParam);</p><p>  int main()</p><p><b>  {</b></p><p>  g_hReadSemaphore  = CreateSemaphore(NULL,1,100,NULL); //

41、創(chuàng)建信號燈,當前可用的資源數為1,最大為100</p><p>  g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //創(chuàng)建信號燈,當前可用的資源數為1,最大為100</p><p>  CreatePersonList(g_PersonLists); // Create All the reader and writers<

42、;/p><p>  printf("Created all the reader and writer\n...\n");</p><p>  g_CurrentTime = 0;</p><p>  while(true)</p><p><b>  {</b></p><p>

43、  g_CurrentTime++;</p><p>  Sleep(300); // 300 ms</p><p>  printf("CurrentTime = %d\n",g_CurrentTime);</p><p>  if(finished) return 0;</p><p>  } // return 0;

44、</p><p><b>  }</b></p><p>  void CreatePersonList(int *pPersonLists)</p><p><b>  {</b></p><p><b>  int  i=0;</b></p><

45、;p>  int  *pList = pPersonLists;</p><p><b>  bool Ret;</b></p><p>  while(pList[0] != END)</p><p><b>  {</b></p><p>  switch(pList[1])&l

46、t;/p><p><b>  {</b></p><p><b>  case R:</b></p><p>  Ret = CreateReader(pList[2],pList[3],pList[0]);//351,w452,523,654</p><p>  break; case W:</

47、p><p>  Ret = CreateWriter(pList[2],pList[3],pList[0]);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  if(!Ret)</b></p>&l

48、t;p>  printf("Create Person %d is wrong\n",pList[0]);</p><p>  pList += 4; // move to next person list</p><p><b>  }</b></p><p><b>  }</b></p

49、><p>  DWORD  WINAPI ReaderProc(LPVOID lpParam)//讀過程</p><p><b>  {</b></p><p>  Person *pPerson = (Person*)lpParam;</p><p>  // wait for the start time<

50、;/p><p>  while(g_CurrentTime != pPerson->m_nStartTime)</p><p><b>  { }</b></p><p>  printf("Reader %d is Requesting ...\n",pPerson->m_nID);</p><

51、p>  printf("\n\n************************************************\n");</p><p>  // wait for the write request</p><p>  WaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReadi

52、ng ==0)</p><p><b>  {</b></p><p>  WaitForSingleObject(g_hWriteSemaphore,INFINITE); }</p><p>  g_NumOfReading++;</p><p>  ReleaseSemaphore(g_hReadSemaphore,

53、1,NULL);</p><p>  pPerson->m_nStartTime = g_CurrentTime;</p><p>  printf("Reader %d is Reading the Shared Buffer...\n",pPerson->m_nID);</p><p>  printf("\n\n***

54、*********************************************\n");</p><p>  while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)</p><p><b>  {}</b></p><p>

55、  printf("Reader %d is Exit...\n",pPerson->m_nID);</p><p>  printf("\n\n************************************************\n");</p><p>  WaitForSingleObject(g_hReadSemaphore

56、,INFINITE);</p><p>  g_NumOfReading--;</p><p>  if(g_NumOfReading == 0)</p><p>  {ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此時沒有讀者,可以寫</p><p><b>  }</b>&

57、lt;/p><p>  ReleaseSemaphore(g_hReadSemaphore,1,NULL);</p><p>  if(pPerson->m_nID == 4) finished = true; //所有的讀寫完成</p><p>  ExitThread(0);</p><p><b>  return 0;&l

58、t;/b></p><p><b>  }</b></p><p>  DWORD  WINAPI WriterProc(LPVOID lpParam)</p><p><b>  {</b></p><p>  Person *pPerson = (Person*)lpParam;

59、</p><p>  // wait for the start time</p><p>  while(g_CurrentTime != pPerson->m_nStartTime)</p><p><b>  {}</b></p><p>  printf("Writer %d is Request

60、ing ...\n",pPerson->m_nID);</p><p>  printf("\n\n************************************************\n");</p><p>  WaitForSingleObject(g_hWriteSemaphore,INFINITE);</p><

61、p>  // modify the writer's real start time</p><p>  pPerson->m_nStartTime = g_CurrentTime;</p><p>  printf("Writer %d is Writting the Shared Buffer...\n",pPerson->m_nID);&

62、lt;/p><p>  while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)</p><p><b>  {}</b></p><p>  printf("Writer %d is Exit...\n",pPerson->

63、m_nID);</p><p>  printf("\n\n************************************************\n");</p><p>  //g_NumOfWriteRequest--;</p><p>  ReleaseSemaphore(g_hWriteSemaphore,1,NULL);&l

64、t;/p><p>  if(pPerson->m_nID == 4) finished = true;//所有的讀寫完成</p><p>  ExitThread(0);</p><p><b>  return 0;</b></p><p><b>  }</b></p><

65、p>  bool CreateReader(int StartTime,int WorkTime,int ID)</p><p><b>  {</b></p><p>  DWORD dwThreadID;</p><p>  if(g_NumPerson >= MAX_PERSON)</p><p>  

66、return false;</p><p>  Person *pPerson = &g_Persons[g_NumPerson];</p><p>  pPerson->m_nID = ID;</p><p>  pPerson->m_nStartTime = StartTime;</p><p>  pPerson-&

67、gt;m_nWorkTime = WorkTime;</p><p>  pPerson->m_nType = READER;</p><p>  g_NumPerson++;</p><p>  // Create an New Thread</p><p>  pPerson->m_hThread= CreateThread(

68、NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);</p><p>  if(pPerson->m_hThread == NULL)</p><p>  return false;</p><p>  return true;</p><p><b>  }</b&

69、gt;</p><p>  bool CreateWriter(int StartTime,int WorkTime,int ID)</p><p><b>  {</b></p><p>  DWORD dwThreadID;</p><p>  if(g_NumPerson >= MAX_PERSON)

70、0;</p><p>  return false;</p><p>  Person *pPerson  = &g_Persons[g_NumPerson];</p><p>  pPerson->m_nID  = ID;</p><p>  pPerson->m_nStartTime = Start

71、Time;</p><p>  pPerson->m_nWorkTime  = WorkTime;</p><p>  pPerson->m_nType   = WRITER;</p><p>  g_NumPerson++;</p><p>  // Create an New Thread<

72、/p><p>  pPerson->m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);</p><p>  if(pPerson->m_hThread == NULL)</p><p>  return false;</p><p>

溫馨提示

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

評論

0/150

提交評論