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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

10、只是緩 沖區(qū)中是否存在空位置,以便開始生產(chǎn)下一個 產(chǎn)品。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);/函數(shù) 輸入數(shù)據(jù),提取線程信息到數(shù)據(jù)結(jié)構(gòu) 中,初始化臨界區(qū),創(chuàng)建信號量,創(chuàng)建線程 int main(void)/聲明所需變量DWORD wait

11、_for_all;ifstream inFile;/初始化緩沖區(qū)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);/顯示獲得的緩沖區(qū)

12、數(shù)目信息printf( %d 個 緩 沖 區(qū) n”,(int)n_Buffer_or_Critical);第11頁/共25頁/提取每個線程信息到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中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頁/創(chuàng)建在模擬過程中的幾個信號量h_mutex=CreateMutex(NULL,FALSE, mutex_for_update);/用線程的ID號來為相應(yīng)的生產(chǎn)線程的產(chǎn) 品讀寫時所使用的同步信號量命名for(j=0;j

15、(int)n_Thread;j+)std:stringlp=semaphore_for_produce_;int temp=j;while(temp)/轉(zhuǎn)換為字符char c=(char)(temp%10);lp+=c;temp/=10;h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();/生產(chǎn)者消費者線程第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);/主線程等待各個線程結(jié)束wait_for_all=WaitForMultipleObjects( n_Thread,h_Thread,TRUE,-1);coutendl;printf(所有的生產(chǎn)者和消費者已經(jīng)完成了 他們的工作。n);printf(請按任意鍵退出!n);_getch();第15頁/共25頁return 0;)/確認是否還

17、有對同一產(chǎn)品的消費請求未執(zhí) 行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;)/找出當(dāng)前可以進行產(chǎn)品生產(chǎn)的空緩沖區(qū)位置;int FindProducePosition()(/用下面這個特殊值表示本緩沖區(qū)正處于 被寫狀態(tài);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);/開始請求生產(chǎn)printf( 生產(chǎn)者 %2d 請求生產(chǎn) n,m_serial);/確認有緩沖區(qū)可以生產(chǎn),同時將空位置 數(shù)empty減1;用于

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

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

21、hore,m_delay;/消費者的序列號和請求的數(shù)目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)/標(biāo)記緩沖區(qū)為空Buffer_CriticalBufferPos=0;printf(消費者 %2d 消費完成 %2d n,m_serial,m_thread_requesti);printf(位置%2d:%3dn,BufferPos,Buffer_Critical BufferPos);第22頁/共25頁/離開臨界區(qū)ReleaseSemaphore(empty_semaphore ,1,NULL);)else(printf( 消費者 %2d 消費完產(chǎn) 品%2dn,m_serial,m_thread_requesti); )LeaveCriticalSection(&PC_CriticalBuf ferPos);)2實驗結(jié)果及問題分析2.1測試結(jié)果測試文件內(nèi)容為:5第23頁/共25頁

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論