進程同步機制與互斥-生產者消費者問題_第1頁
進程同步機制與互斥-生產者消費者問題_第2頁
進程同步機制與互斥-生產者消費者問題_第3頁
進程同步機制與互斥-生產者消費者問題_第4頁
進程同步機制與互斥-生產者消費者問題_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、進程同步機制與互斥生產者消 費者問題學習中心:專 業:年 級: 年 春/秋季學 號:學 生:題 目:進程同步與互斥 生產者-消費者問題1.談談你對本課程學習過程中的心得體會與建議?轉眼間、學習了一個學期的計算機操作系統課程即將結束。在這個學期中、 通過老師的悉心教導,讓我深切地體會到了計算機操作系統的一些原理和具體 操作過程。在學習操作系統之前,我只是很膚淺地認為操作系統只是單純地講 一些關于計算機方面的操作應用,并不了解其中的具體操作過程和實用性。通 過這一學期的學習,我才知道操作系統(Operating System ,簡稱 OS)是管理計算 機系統的全部硬件資源包括軟件資源及數據資源;控

2、制程序運行;改善人機界 面;為其它應用軟件提供支持等,使計算機系統所有資源最大限度地發揮作用, 為用戶提供方便的、有效的、友善的服務界面。操作系統這門課程并不是教你 如何使用操作系統的,而是講操作。總而言之,操作系統的一些原理在生活中 都可以找到相應的例子。結合生活中的例子、可以化抽象為具體、我們會更加 清楚地了解到其原理與操作過程。我覺得通過我們的不斷學習,結合生活中的 實際問題、我們就會把操作系統學得更好。總體來說、通過這次的對操作系統 的總結,有收獲也有遺憾、不足的地方,但我想,我已經邁入了操作系統的大 門.只要我再認真努力的去學習.去提高.肯定能讓自己的知識能力更上一層 樓.第2頁/共

3、25頁設計思路及主要代碼分析設計思路在這次設計中定義的多個緩沖區不是環形循環的,并且不需要按序訪問。其中生產者可以把產品放到某一個空緩沖區中,消費者只能消費被指定生產者生產的產品。本設計在測試用例文件中指定了所有 生產和消費的需求,并規定當共享緩沖區的數據滿足了所有有關它的 消費需求后,此共享才可以作為空閑空間允許新的生產者使用。本設計在為生產者分配緩沖區時各生產者之間必須互斥,此后各 個生產者的具體生產活動可以并發。而消費者之間只有在對同一個產第3頁/共25頁品進行消費時才需要互斥,它們在消費過程結束時需要判斷該消費者 對象是否已經消費完畢并釋放緩沖區的空間程序流程圖確定產品位置進入臨界區(

4、對同一產品進 行請求的消費者之間互斥)消費產品、并判斷是否應該 釋放產品所占緩沖區退出臨界區進入臨界區(所有生產者之間互斥)從空緩沖區中為本生產者 的產品分配一個空間退出悔界區. 4r在該緩沖區放入產品通過信號量通知等待本產 品的消費者確定產品位置進入臨界區(對同一產品進 行請求的消費者之間互斥)消費產品、并判斷是否應該 釋放產品所占緩沖區退出臨界區進入臨界區(所有生產者之間互斥)從空緩沖區中為本生產者 的產品分配一個空間退出悔界區. 4r在該緩沖區放入產品通過信號量通知等待本產 品的消費者第4頁/共25頁基本內容在設計程序時主要有三個主體部分、三個輔助函數和一個數據結 構。其中主體部分為一個

5、主函數main (),用于初始化緩沖區和各個 同步對象,并完成線程信息的讀入,最后根據該組的線程記錄啟動模 擬線程,并等待所有線程的運行結束后退出程序;生產者函數Produce ()和消費者函數Consume。,生產者和消 費者函數運行于線程中完成對緩沖區的讀、寫動作,根據此處生產消費的模型的特點,生產者和消費者之間通過使用同步對象實現了生產 和消費的同步與互斥,是本實驗的核心所在。另外三個輔助性函數被生產者和消費者函數調用,是上述生產和 消費函數中對緩沖區進行的一系列處理。定義一個數據結構,記錄在測試文件中指定的每一個線程的參 數。用一個整型數組 Buffer_Critical來代表緩沖區。

6、不管是生產產品還是對已有的產品的消費都需要訪問 該組緩沖區。進程信息ThreadInfo數據結構,包含線程的各個信息第5頁/共25頁struct Threadinfo ();3)在實現本程序的消費生產模型時,具體的通過如 下同步對象實現互斥:設一個互斥量h_mutex,以實現生產者在查詢和保留緩沖 區內的下一個位置時進行互斥。每一個生產者用一個信號量與其消費者同步,通過設置h_SemaphoreMAX_THREAD_NUM量數組實現,該組信號量用于相應的產品已產生。同時用一第6頁/共25頁 個表示空緩沖區數目的信號量 empty_semaphore進行類似的同步,只是緩沖區中是否存在空位置,以

7、便開始生產下一個產品。每一個緩沖區用一個同步對象實現該緩沖區上消費者之間的互斥,這通過設置臨界區對象數組 PC_CrilicalMAX_BUFFER_NUM 實現。1.4程序代碼#include#include#include#include#include#includedefine MAX_BUFFER_NUM10define INTE_PER_SEC 1000define MAX_THREAD_NUM64/定義一個結構,記錄在測試文件中指定的 每一個線程的參數struct ThreadInfo第7頁/共25頁/進程信息Threadinfo 數據結構,包含線 程的各個信息intserial

8、;/線程序列號charentity;是P還是Cintdelay;/線程延遲intthread_requestMAX_THREAD_NUM;/線程請求隊列intn_request;/請求個數);/每一個緩沖區用一個同步對象實現該緩沖 區上消費者之間的互斥,這通過設置臨界區對 象數組 PC_CrilicalMAX_BUFFER_NUM 實現。CRITICAL_SECTIONPC_CriticalMAX_BUFFER_NUM;/用一個整型數組Buffer_Critical來代表緩沖區。不管是生產產品還是對已有的產品的消第8頁/共25頁費都需要訪問該組緩沖區。int Buffer_CriticalMA

9、X_BUFFER_NUM; HANDLEh_ThreadMAX_THREAD_NUM; ThreadInfoThread_InfoMAX_THREAD_NUM;/設一個互斥量h_mutex ,以實現生產者在 查詢和保留緩沖區內的下一個位置時進行互 斥。HANDLE h_mutex;/每一個生產者用一個信號量與其消費者同 步, 通 過 設 置 h_SemaphoreMAX_THREAD_NUM 信 號 量數組實現,該組信號量用于相應的產品已產 生。HANDLEh_SemaphoreMAX_THREAD_NUM;/同時用一個表示空緩沖區數目的信號量 empty_semaphore 進行類似的同步,

10、只是緩 沖區中是否存在空位置,以便開始生產下一個 產品。HANDLE empty_semaphore;第9頁/共25頁DWORD n_Thread=0;DWORD n_Buffer_or_Critical;void Produce(void *p);void Consume(void *p);bool IfInOtherRuquest(int);int FindProducePosition();int FindBufferPosition(int);/函數 輸入數據,提取線程信息到數據結構 中,初始化臨界區,創建信號量,創建線程 int main(void)/聲明所需變量DWORD wait

11、_for_all;ifstream inFile;/初始化緩沖區for(int i=0;iMAX_BUFFER_NUM;i+)Buffer_Criticali=-1;/初始化每個線程的請求序列for(int j=0;jMAX_THREAD_NUM;j+)第10頁/共25頁for(intk=0;kMAX_THREAD_NUM;k+)Thread_Infoj.thread_requestk=-1;Thread_Infoj.n_request=0;/初始化臨界段對象for(i=0;in_Buffer_or_Critical;inFile.get();printf(輸入文件是:n);/顯示獲得的緩沖區

12、數目信息printf( %d 個 緩 沖 區 n”,(int)n_Buffer_or_Critical);第11頁/共25頁/提取每個線程信息到相應的數據結構中while(inFile)(inFileThread_Infon_Thread.serial;inFileThread_Infon_Thread.entity;inFileThread_Infon_Thread.delay;char c;inFile.get(c);while(c!=n& !inFile.eof() (inFileThread_Infon_Thread.thread _requestThread_Infon_Thread

13、.n_requ est+;inFile.get(c);n_Thread+;/顯示獲得的線程信息,便于確認正確性第12頁/共25頁for(j=0;j(int)n_Thread;j+)(intTemp_serial=Thread_Infoj.serial;charTemp_entity=Thread_Infoj.entity;intTemp_delay=Thread_Infoj.delay;printf( 線程 %2d %c %d , Temp_serial,Temp_entity,Temp_delay);intTemp_request=Thread_Infoj.n_request;for(int

14、 k=0;kTemp_request;k+)printf(%d,Thread_Infoj.thread_requestk);coutendl;coutendl;empty_semaphore=CreateSemaphore( NULL,n_Buffer_or_Critical,n_Buffer_or_ Critical,semaphore_for_empty);第13頁/共25頁/創建在模擬過程中的幾個信號量h_mutex=CreateMutex(NULL,FALSE, mutex_for_update);/用線程的ID號來為相應的生產線程的產 品讀寫時所使用的同步信號量命名for(j=0;j

15、(int)n_Thread;j+)std:stringlp=semaphore_for_produce_;int temp=j;while(temp)/轉換為字符char c=(char)(temp%10);lp+=c;temp/=10;h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();/生產者消費者線程第14頁/共25頁for(i=0;i(int)n_Thread;i+)(if(Thread_Infoi.entity=P)h_Threadi=CreateThread(NULL,0,(LP THREAD_START_ROUTIN

16、E)(Produce),&( Thread_Infoi),0,NULL);elseh_Threadi=CreateThread(NULL,0,(LP THREAD_START_ROUTINE)(Consume), &(Thread_Infoi),0,NULL);/主線程等待各個線程結束wait_for_all=WaitForMultipleObjects( n_Thread,h_Thread,TRUE,-1);coutendl;printf(所有的生產者和消費者已經完成了 他們的工作。n);printf(請按任意鍵退出!n);_getch();第15頁/共25頁return 0;)/確認是否還

17、有對同一產品的消費請求未執 行bool IfInOtherRequest(int req)(for(int i=0;in_Thread;i+)for(intj=0;jThread_Infoi.n_request;j+)if(Thread_Infoi.thread_requestj=req)return TRUE;return FALSE;)/找出當前可以進行產品生產的空緩沖區位置;int FindProducePosition()(/用下面這個特殊值表示本緩沖區正處于 被寫狀態;int EmptyPosition;第16頁/共25頁for(int i=1;i=n_Buffer_or_Criti

18、cal;i+) if(Buffer_Criticali=-1) (EmptyPosition=i;Buffer_Criticali=-2;break;return EmptyPosition;int FindBufferPosition(int ProPos)(int TempPos;for(int i=1;iserial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);Sleep(m_delay);/開始請求生產printf( 生產者 %2d 請求生產 n,m_serial);/確認有緩沖區可以生產,同時將空位置 數empty減1;用于

19、生產者和消費者之間的 同步;wait_for_semaphore=WaitForSingleObject(empty_semaphore,-1);/互斥訪問下一個可用于生產的空臨界區,實現寫寫互斥wait_for_mutex=WaitForSingleObject( h_mutex,-1);第18頁/共25頁intProducePos=FindProducePosition();ReleaseMutex(h_mutex);/生產者在獲得自己的空位置并做上標記后,以下寫操作在生產者之間可以并發/在核心生產步驟中,程序將生產者的ID 作為產品編號放入,方便消費者識別printf(生產者 2d 開始

20、生產在位 置 2dn,m_serial,ProducePos);Buffer_CriticalProducePos=m_serial;printf( 生產者 %2d 完成生產 n,m_serial);printf( 位 置%2d:%3d 的產品 n,ProducePos,Buffer_Critical ProducePos);/使生產者寫的緩沖區可以被多個消費者 使用,實現讀寫同步ReleaseSemaphore(h_Semaphorem_s erial,n_Thread,NULL);/消費者進程void Consume(void*p)第19頁/共25頁(DWORDwait_for_semap

21、hore,m_delay;/消費者的序列號和請求的數目int m_serial,m_requestNum;/本消費線程的請求隊列intm_thread_requestMAX_THREAD_NUM ;/提取本線程信息到本地m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_requestNum=(ThreadInfo*)(p)-n_ request;for(int i=0;ithread_requesti;Sleep(m_delay);for(i=0;ithread_requ

22、esti=- 1;if(!IfInOtherRequest(m_thread_reques ti)/標記緩沖區為空Buffer_CriticalBufferPos=0;printf(消費者 %2d 消費完成 %2d n,m_serial,m_thread_requesti);printf(位置%2d:%3dn,BufferPos,Buffer_Critical BufferPos);第22頁/共25頁/離開臨界區ReleaseSemaphore(empty_semaphore ,1,NULL);)else(printf( 消費者 %2d 消費完產 品%2dn,m_serial,m_thread_requesti); )LeaveCriticalSection(&PC_CriticalBuf ferPos);)2實驗結果及問題分析2.1測試結果測試文件內容為:5第23頁/共25頁

溫馨提示

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

評論

0/150

提交評論