操作系統生產者與消費者課程設計報告_第1頁
操作系統生產者與消費者課程設計報告_第2頁
操作系統生產者與消費者課程設計報告_第3頁
操作系統生產者與消費者課程設計報告_第4頁
操作系統生產者與消費者課程設計報告_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課 程 設 計 報 告課程名稱:操作系統課程設計設計題目:生產者消費者問題系別:計算機系專業:計算機科學與技術組別:第二組學生姓名:學號起止日期: 2010 年 7 月 18 日 2010 年 7 月 23 日指導教師:1 目錄1.概述. 2 1.1 問題描述 . 2 1.2 開發計劃 . 2 1.3 開發環境及開發工具 . 2 2.需求分析 . 2 2.1 設計任務 . 2 2.2 設計思想 . 2 2.3 設計要求 . 3 3.概要設計 . 3 3.1 方法及原理 . 3 3.2 流程圖 . 4 4.詳細設計 . 4 4.1 數據結構及信號量說明 . 4 4.2 部分代碼 . 5 5.測試

2、結果 . 8 6.結果分析 . 9 7.總結和體會 . 9 致謝. 9 參考文獻 . 10 2 1.概述1.1 問題描述以生產者 / 消費者模型為依據,在windows xp環境下創建一個控制臺進程,在該進程中創建 n 個線程模擬生產者和消費者,實現進程( 線程) 的同步與互斥。1.2 開發計劃第一天:完成整體的規劃工作,用什么方法,能完成什么工作,如何設計構造方法;第二天:完成操作界面的設計與編碼,設計一個美觀,易于操作的界面;第三天:完成并發設計內核的結構與實現工作;第四天:基本完成程序設計工作;第五天:完成代碼的優化工作,添加一些功能;第六天:完成實驗報告;第七天:交給老師審核。1.3

3、開發環境及開發工具硬件:普通 pc386以上微機;一張軟盤或u盤。軟件:操作系統: windows 2000/xp。開發工具: vc+6.0 。 vc是一個集成開發環境,其中包含了windows sdk 所有工具和定義。2.需求分析2.1 設計任務(1) 掌握基本的同步與互斥算法,理解生產者消費者模型。(2) 學習使用 windows 2000/xp中基本的同步對象,掌握相關api 使用方法。(3) 了解 windows 2000/xp中多線程的并發執行機制,實現進程同步與互斥。2.2 設計思想生產者消費者問題是一種同步問題的抽象描述。計算機系統中的每個進程都可以消費或生產某類資源。當系統中某

4、一進程使用某一資源時,可以看作是消耗,且該進程稱為消費者。3 而當某個進程釋放資源時,則它就相當一個生產者。在同一時刻只能有一個生產者或一個消費者使用緩沖區,有互斥信號量可以控制各個生產者和消費者之間互斥,使得生產和消費的工作能夠有序的進行,而不至于發生死鎖。通過一個有界緩沖區 ( 用數組來實現,類似循環隊列) 把生產者和消費者聯系起來。假定生產者和消費者的優先級是相同的,只要緩沖區未滿, 生產者就可以生產產品并將產品送入緩沖區。類似地,只要緩沖區未空, 消費者就可以從緩沖區中去走產品并消費它。 應該禁止生產者向滿的緩沖區送入產品,同時也應該禁止消費者從空的緩沖區中取出產品,這一機制有生產者線

5、程和消費者線程之間的互斥關系來實現。2.3 設計要求1)每個生產者和消費者對有界緩沖區進行操作后,即時顯示有界緩沖區的全部內容、當前指針位置和生產者消費者線程的標識符。2)生產者和消費者各有兩個以上。3)多個生產者或多個消費者之間須共享對緩沖區進行操作的函數代碼。3.概要設計3.1 方法及原理1閱讀操作系統的進程管理章節內容,對進程的同步和互斥,以及信號量機制有深入理解。著名的生產者消費者問題是典型的進程同步問題,操作系統中實現進程同步的常用機制有信號量和pv操作等。除賦初值外,信號量僅由同步原語p和 v對其進行操作, pv操作的不分割性確保執行的原子性及信號量值的完整性。信號量按用途分兩種:

6、(1)公用信號量,用于實現進程互斥;(2)私有信號量,多用于并發進程同步。按取值又分兩種:(1)兩元信號量,主要用于解決進程互斥問題;(2)一般信號量,主要解決進程同步問題。4 2掌握 visual c+ 6.0語言的使用。 c+語言是從 c語言發展演變的一種面向對象的程序設計語言,主要特點變現在兩方面:一是全面兼容c;二是支持面向對象的方法。面向對象的方法將數據及對數據的操作方法封裝在一起,作為一個相互依存、不可分割的整體對象。對同類型對象抽象出共性,形成類。類中的大多數數據,只能用本類的方法進行處理。類通過一個簡單的外部接口,與外界發生關系,對象與對象間通過消息進行通信。同時,通過繼承與多

7、態性,使程序具有很高的可重用性,使得軟件的開發和維護都更為方便。3.2 流程圖4.詳細設計4.1 數據結構及信號量說明(1)程序中的主要的結構void produce(void *p); 圖 3-1 流程圖輸入數據創建“生產者”線程緩沖區是否阻塞n 創建“消費者”線程y “生產者”生產產品后被喚醒n y 緩沖區是否為空“消費者”阻塞“生產者”等待,“消費者”取出緩沖區數據5 void consume(void *p); bool ifinotherrequest(int); int findproducepositon(); int findbufferposition(int); int m

8、ain(void) (2)信號量定義如下:#define max_buffer_num 10 /本程序允許的最大臨界區數;#define inte_per_sec 1000 /秒到微秒的乘法因子;#define max_thread_num 64 / 本程序允許的生產和消費線程的總數;int buffer_criticalmax_buffer_num; /緩沖區聲明,用于存放產品;handle h_threadmax_thread_num; / 用于存儲每個線程句柄的數組;threadinfo thread_infomax_thread_num; /線程信息數組;handle empty_se

9、maphore; / 一個信號量;handle h_mutex; / 一個互斥量;dword n_thread = 0; /實際的線程的數目;dword n_buffer_or_critical; /實際的緩沖區或者臨界區的數目;handle h_semaphoremax_thread_num; /生產者允許消費者開始消費的信號量;4.2 部分代碼(1)創建生產者和消費者線程for(i =0;iserial; m_delay = (dword)(threadinfo*)(p)-delay *inte_per_sec); sleep(m_delay); /開始請求生產printf( 生產者 %d

10、 發出生產請求 .n,m_serial); /確認有空緩沖區可供生產, 同時將空位置數 empty 減 1;用于生產者和消費者的同步;wait_for_semaphore = waitforsingleobject(empty_semaphore,-1); /互斥訪問下一個可用于生產的空臨界區,實現寫寫互斥;wait_for_mutex = waitforsingleobject(h_mutex,-1); int producepos = findproduceposition(); releasemutex(h_mutex); /生產者在獲得自己的空位置并做上標記后,以下的寫操作在生產者之間

11、可以并發;/核心生產步驟中, 程序將生產者的id 作為產品編號放入, 方便消費者識別 ; printf( 生產者 %d 開始生產,并且把其產品放在位置%2d.n,m_serial, producepos); buffer_criticalproducepos = m_serial; printf( 生產者 %2d 生產完畢 .n ,m_serial); printf( 位置%2d:%3d n ,producepos,buffer_criticalproducepos); /使生產者寫的緩沖區可以被多個消費者使用,實現讀寫同步;releasesemaphore(h_semaphorem_seri

12、al,n_thread,null); (3)消費者進程void consume(void * p) /局部變量聲明;7 dword wait_for_semaphore,m_delay; int m_serial,m_requestnum; /消費者的序列號和請求的數目;int m_thread_requestmax_thread_num;/ 本消費線程的請求隊列;/提取本線程的信息到本地;m_serial = (threadinfo*)(p)-serial; m_delay = (dword)(threadinfo*)(p)-delay *inte_per_sec); m_requestnu

13、m = (threadinfo *)(p)-n_request; for (int i = 0;ithread_requesti; sleep(m_delay); /循環進行所需產品的消費for(i =0;ithread_requesti =-1; if(!ifinotherrequest(m_thread_requesti) buffer_criticalbufferpos = -1;/ 標記緩沖區為空;printf( 消費者 %2d消費完畢 %2d.n ,m_serial,m_thread_requesti); printf( 位置%2d:%3d n ,bufferpos,buffer_c

14、riticalbufferpos); releasesemaphore(empty_semaphore,1,null); 8 else printf( 消費者 %2d消費完畢 %2d.n ,m_serial,m_thread_requesti); /離開臨界區leavecriticalsection(&pc_criticalbufferpos); 5.測試結果圖 5-1 測試結果圖9 其中測試數據是:2 1 p 1 2 p 2 3 p 3 4 c 4 3 2 5 c 5 1 6.結果分析1、在每個程序中坐須先做p(mutex) ,后做 v(mutex) ,二者要成對出現。夾在二者中間的

15、代碼段就是該進程的臨界區。2、對同步信號量 full和 empty 的 p,v操作同樣必須成對出現,但它們分別位于不同的程序中。3、無論在生產者進程中還是在消費者進程中,兩個 p操作的次序不能顛倒 : 應先執行同 步信號量的 p操作,然后執行互斥信號量的p操作。否則可能造成進程死鎖。7.總結和體會 . 此系統中使用的是用vc+6.0 實現的,由于我的經驗不足及閱歷頗淺,因此,在設計方面還有很多不足,比如代碼不夠優化等問題,我會在以后的學習、工作的過程中, 根據工作的具體要求不斷的修改,完善,爭取使該系統慢慢趨向完美。學習任何知識,僅從理論上去求知,而不去實踐、探索是不夠的,所以在學習完后進行課程設計是很及時、很必要的,這樣不僅能加深我們對所學知識的了解,而且還及時、真正的做到了學以致用。在這次課程設計過程中,遇到了很多問題。尤其是設計方面有些困難,但是通過上網,查書,向別人請教解決了,這次課程設計讓我學到了很多, 不僅是鞏固了先前學的的理論知識,而且也培養了我的動手能力,更令我的創造性思維得到拓展。致謝在本設計是我第一次嘗試這方面的軟件編程。在剛開發完畢準備開始寫論文時我對論文的寫法是一片空白, 所以只能問同學和上網查資料, 所以首先感謝在程序上幫助我的同學, 再次感謝網上貼出同類資料的友士,最后謝謝王老師對我10 們的指

溫馨提示

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

評論

0/150

提交評論