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

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設計報告</p><p>  生產者與消費者算法的實現(xiàn)</p><p>  課程名稱:計算機操作系統(tǒng)課程設計</p><p><b>  小組成員:</b></p><p><b>  班 級:</b></p><p>  時 間

2、:2010-10-18</p><p><b>  目錄</b></p><p>  1 課設簡介:1</p><p>  1.1課程設計題目1</p><p>  1.2課程設計小組成員1</p><p>  1.3小組成員任務分配情況及每人所占工作比例1</p><

3、;p>  2生產者和消費者原理分析1</p><p>  3 生產者與消費者功能描述:1</p><p>  4 數(shù)據(jù)結構分析2</p><p>  5 生產者與消費者實現(xiàn)代碼2</p><p><b>  6心得體會7</b></p><p><b>  參考文

4、獻:7</b></p><p><b>  相關工具:8</b></p><p><b>  致謝:8</b></p><p><b>  1 課設簡介:</b></p><p><b>  1.1課程設計題目</b></p>

5、;<p>  生產者與消費者算法的實現(xiàn)</p><p>  1.2課程設計小組成員</p><p><b>  張洋、巢蕾、段敏</b></p><p>  1.3小組成員任務分配情況及每人所占工作比例</p><p>  張 洋 負責:分析設計消費一個產品方法和主方法并且畫出流程圖,后期組織組內成員

6、成果匯總進行本組總體報告撰寫。</p><p>  巢 蕾 負責:分析設計生產者的行為方法和消費者的行為方法,并且畫出流程圖</p><p>  段 敏 負責:分析設計生產產品的方法和把新生產的產品放入緩沖區(qū),并且畫出流程圖。</p><p>  生產者和消費者原理分析</p><p>  在同一個進程地址空間內執(zhí)行的兩個線程。生

7、產者線程生產物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當生產者線程生產物品時,如果沒有空緩沖區(qū)可用,那么生產者線程必須等待消費者線程釋放出一個空緩沖區(qū)。當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產出來。</p><p>  3 生產者與消費者功能描述:</p><p>  3.1生產者功能

8、描述</p><p>  在同一個進程地址空間內執(zhí)行的兩個線程。生產者線程生產物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當生產者線程生產物品時,如果沒有空緩沖區(qū)可用,那么生產者線程必須等待消費者線程釋放出一個空緩沖區(qū)。</p><p>  3.2消費者功能描述</p><p>  消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當消費者線程消費物品時,如果

9、沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產出來。</p><p><b>  3.3程序結構圖:</b></p><p><b>  4 數(shù)據(jù)結構分析</b></p><p>  生產者與消費者實現(xiàn):</p><p>  這其中主要是通過多線程,來實現(xiàn)生產者和消費者之間的協(xié)調問題。

10、</p><p>  生產者(producer)——消費者(consumer):</p><p>  通過一些記錄性變量,來記錄模擬實現(xiàn)生產者的行為,通過輸入語句的提示</p><p>  程序采用OO設計模式,緩存區(qū)采用數(shù)組結構存儲。</p><p>  5 生產者與消費者實現(xiàn)代碼</p><p>  #includ

11、e <windows.h></p><p>  #include <iostream></p><p>  const unsigned short SIZE_OF_BUFFER = 10; //緩沖區(qū)長度</p><p>  unsigned short ProductID = 0; //產品號</p><p>

12、;  unsigned short ConsumeID = 0; //將被消耗的產品號</p><p>  unsigned short in = 0; //產品進緩沖區(qū)時的緩沖區(qū)下標</p><p>  unsigned short out = 0; //產品出緩沖區(qū)時的緩沖區(qū)下標</p><p>  int g_buffer[SIZE_

13、OF_BUFFER]; //緩沖區(qū)是個循環(huán)隊列</p><p>  bool g_continue = true; //控制程序結束</p><p>  HANDLE g_hMutex; //用于線程間的互斥</p><p>  HANDLE g_hFullSemaphore; //當緩沖區(qū)滿時迫使生產者等待</p>

14、<p>  HANDLE g_hEmptySemaphore; //當緩沖區(qū)空時迫使消費者等待</p><p>  DWORD WINAPI Producer(LPVOID); //生產者線程</p><p>  DWORD WINAPI Consumer(LPVOID); //消費者線程</p><p>  int main()&l

15、t;/p><p><b>  {</b></p><p>  //創(chuàng)建各個互斥信號</p><p>  g_hMutex = CreateMutex(NULL,FALSE,NULL);</p><p>  g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZ

16、E_OF_BUFFER-1,NULL);</p><p>  g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);</p><p>  //調整下面的數(shù)值,可以發(fā)現(xiàn),當生產者個數(shù)多于消費者個數(shù)時,</p><p>  //生產速度快,生產者經常等待消費者;反之,消費者經常等待 </

17、p><p>  const unsigned short PRODUCERS_COUNT = 3; //生產者的個數(shù)</p><p>  const unsigned short CONSUMERS_COUNT = 1; //消費者的個數(shù)</p><p><b>  //總的線程數(shù)</b></p><p>  const

18、 unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;</p><p>  HANDLE hThreads[PRODUCERS_COUNT]; //各線程的handle</p><p>  DWORD producerID[CONSUMERS_COUNT]; //生產者線程的標識符</p><p&

19、gt;  DWORD consumerID[THREADS_COUNT]; //消費者線程的標識符</p><p><b>  //創(chuàng)建生產者線程</b></p><p>  for (int i=0;i<PRODUCERS_COUNT;++i){</p><p>  hThreads[i]=CreateThread(NULL,0,Pro

20、ducer,NULL,0,&producerID[i]);</p><p>  if (hThreads[i]==NULL) return -1;</p><p><b>  }</b></p><p><b>  //創(chuàng)建消費者線程</b></p><p>  for (i=0;i<

21、CONSUMERS_COUNT;++i){</p><p>  hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);</p><p>  if (hThreads[i]==NULL) return -1;</p><p><b>  }<

22、;/b></p><p>  while(g_continue){</p><p>  if(getchar()){ //按回車后終止程序運行</p><p>  g_continue = false;</p><p><b>  }</b></p><p><b>  }<

23、/b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  //生產一個產品。簡單模擬了一下,僅輸出新產品的ID號</p><p>  void Produce()</p><p><b>  {

24、</b></p><p>  std::cerr << "Producing " << ++ProductID << " ... ";</p><p>  std::cerr << "Succeed" << std::endl;</p><

25、p><b>  }</b></p><p>  //把新生產的產品放入緩沖區(qū)</p><p>  void Append()</p><p><b>  {</b></p><p>  std::cerr << "Appending a product ... "

26、;;</p><p>  g_buffer[in] = ProductID;</p><p>  in = (in+1)%SIZE_OF_BUFFER;</p><p>  std::cerr << "Succeed" << std::endl;</p><p>  //輸出緩沖區(qū)當前的狀態(tài)<

27、/p><p>  for (int i=0;i<SIZE_OF_BUFFER;++i){</p><p>  std::cout << i <<": " << g_buffer[i];</p><p>  if (i==in) std::cout << " <-- 生產"

28、;</p><p>  if (i==out) std::cout << " <-- 消費";</p><p>  std::cout << std::endl;</p><p><b>  }</b></p><p><b>  }</b><

29、/p><p>  //從緩沖區(qū)中取出一個產品</p><p>  void Take()</p><p><b>  {</b></p><p>  std::cerr << "Taking a product ... ";</p><p>  ConsumeID =

30、g_buffer[out];</p><p>  out = (out+1)%SIZE_OF_BUFFER;</p><p>  std::cerr << "Succeed" << std::endl;</p><p>  //輸出緩沖區(qū)當前的狀態(tài)</p><p>  for (int i=0;i&

31、lt;SIZE_OF_BUFFER;++i){</p><p>  std::cout << i <<": " << g_buffer[i];</p><p>  if (i==in) std::cout << " <-- 生產";</p><p>  if (i==out

32、) std::cout << " <-- 消費";</p><p>  std::cout << std::endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //消耗一個

33、產品</b></p><p>  void Consume()</p><p><b>  {</b></p><p>  std::cerr << "Consuming " << ConsumeID << " ... ";</p><p

34、>  std::cerr << "Succeed" << std::endl;</p><p><b>  }</b></p><p><b>  //生產者</b></p><p>  DWORD WINAPI Producer(LPVOID lpPara)</p

35、><p><b>  {</b></p><p>  while(g_continue){</p><p>  WaitForSingleObject(g_hFullSemaphore,INFINITE);</p><p>  WaitForSingleObject(g_hMutex,INFINITE);</p>

36、<p>  Produce();</p><p><b>  Append();</b></p><p>  Sleep(1500);</p><p>  ReleaseMutex(g_hMutex);</p><p>  ReleaseSemaphore(g_hEmptySemaphore,1,NULL)

37、;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  //消費者</b></p><p>  DWORD WINAP

38、I Consumer(LPVOID lpPara)</p><p><b>  {</b></p><p>  while(g_continue){</p><p>  WaitForSingleObject(g_hEmptySemaphore,INFINITE);</p><p>  WaitForSingleObje

39、ct(g_hMutex,INFINITE);</p><p><b>  Take();</b></p><p>  Consume();</p><p>  Sleep(1500);</p><p>  ReleaseMutex(g_hMutex);</p><p>  ReleaseSemap

40、hore(g_hFullSemaphore,1,NULL);</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  } </b></p><p>  /* 一個消費者三個生產者:</p>&

41、lt;p>  /* 三個生產者三個消費者</p><p>  /*三個消費者一個生產者</p><p>  /*三個生產者四個消費者</p><p><b>  心得體會</b></p><p>  本次課程設是關于生產者與消費者之間互斥和同步的問題。問題的實質是P、V操作,實驗設一個共享緩沖區(qū),生產者和消費者互斥

42、的使用,當一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放緩沖區(qū)為止。</p><p>  生產者與消費者是一個與現(xiàn)實有關的經典問題,與“和尚挑水”問題的原理相同,通過此原理舉一反三可以解決其他類似的問題。</p><p>  通過本課程設計,我們對操作系統(tǒng)的p、v進一步的認識,深入的了解p、v操作的實質和其重要性。課本的理論知識進一步闡述了現(xiàn)實中的實際問題。</p>

43、<p>  實驗中,我們小組分工合作,共同學習,雖然在課程設計中遇到了一些問題,但在老師和同學的細心指導和熱心幫助下解決了。同時,了解到團隊精神的重要性,也為以后的學習和工作打下了堅實的基礎,同時積累了寶貴的經驗。</p><p><b>  參考文獻:</b></p><p>  [1] 湯小丹 梁紅兵 哲鳳屏 湯子瀛 計算機操作系統(tǒng)(第三版)西安電子

44、科技大學出版社 2007.12</p><p><b>  相關工具:</b></p><p>  [1] 代碼編寫、分析工具:Visual C++ </p><p>  [2] 流程圖分析工具:Microsoft visio</p><p><b>  致謝:</b></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

提交評論