




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、一 設(shè)計概述所謂讀者寫者問題,是指保證一個writer進程必須與其他進程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是,只能有一個寫者在寫書,并且,讀者必寫者優(yōu)先,也就是說,讀者和寫者同時提出請求時,讀者優(yōu)先。當(dāng)讀者提出請求時需要有一個互斥操作,另外,需要有一個信號量S來當(dāng)前是否可操作。信號量機制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計中解決資源共享時進程間的同步與互斥的重要機制,而讀者寫者問題則是這一機制的一個經(jīng)典范例。與記錄型信號量解決讀者寫者問題不同,信號量機制它增加了一個限制,即最多允許RN個讀
2、者同時讀。為此,又引入了一個信號量L,并賦予初值為RN,通過執(zhí)行wait(L,1,1)操作,來控制讀者的數(shù)目,每當(dāng)有一個讀者進入時,就要執(zhí)行wait(L,1,1)操作,使L的值減1。當(dāng)有RN個讀者進入讀后,L便減為0,第RN+1 個讀者要進入讀時,必然會因wait(L,1,1)操作失敗而堵塞。對利用信號量來解決讀者寫者問題的描述如下:Var RN integer;L,mx:semaphore: =RN,1;BeginParbegin Reader :begin Repeat Swait(L,1,1); Swait(mx,1,0); . Perform reader operation; Ssi
3、gnal(L,1);Until false; EndWriter :begin RepeatSwait(mx ,1,1,l,RN,0);Perform writer operation;Ssignal(mx,1);Until false;EndParendEnd其中,Swait(mx,1,0)語句起著開關(guān)作用,只要無Writer進程進入些,mx=1,reader進程就都可以進入讀。但是要一旦有Writer進程進入寫時,其MX=0,則任何reader進程就都無法進入讀。Swait(mx ,1,1,l,RN,0)語句表示僅當(dāng)既無Write進程在寫(mx=1),又無reader進程在讀(L=RN)時
4、,writer進程才能進入臨界區(qū)寫。本設(shè)計方案就是通過利用記錄型信號量對讀者寫者問題的解決過程進行模擬演示,形象地闡述記錄型信號量機制的工作原理。二 設(shè)計目的與內(nèi)容一 實驗?zāi)康膌. 用信號量來實現(xiàn)讀者寫者問題。2. 理解和運用信號量、PV原語、進程間的同步互斥關(guān)系等基本知識。二、二 實驗內(nèi)容讀者寫者問題的定義如下:有一個許多進程共享的數(shù)據(jù)區(qū),這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數(shù)據(jù)區(qū)的進程(Reader)和一些只往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進程(Writer),此外還需要滿足以下條件:(1) 任意多個讀進程可以同時讀這個文件;(2) 一次只有一個寫進程可以往文件中寫;(3) 如果一
5、個寫進程正在進行操作,禁止任何讀進程度文件。我們需要分兩種情況實現(xiàn)該問題:讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。三設(shè)計分析在Windows 7 環(huán)境下,創(chuàng)建一個包含n 個線程的控制臺進程。用這n 個線程來表示n個讀者或?qū)懻?。每個線程按相應(yīng)測試數(shù)據(jù)文件的要求,進行讀寫操作。請用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制:讀者-寫者的讀寫限制(包括讀者優(yōu)先和寫者優(yōu)先)1)
6、寫-寫互斥,即不能有兩個寫者同時進行寫操作2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫3)讀讀允許,即可以有2個以上的讀者同時讀將所有的讀者和所有的寫者分別放進兩個等待隊列中,當(dāng)讀允許時就讓讀者隊列釋放一個或多個讀者,當(dāng)寫允許時,釋放第一個寫者操作。讀者寫者問題的定義如下:有一個許多進程共享的數(shù)據(jù)區(qū),這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數(shù)據(jù)區(qū)的進程(Reader)和一些只往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進程(Writer),此外還需要滿足以下條件:1)任意多個讀進程可以同時讀這個文件;2) 一次只有一個寫進程可以往文件中寫;3)如果一個寫進程正在進行操作,禁止任何讀進
7、程度文件。我們需要分兩種情況實現(xiàn)該問題:讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。四 程序?qū)崿F(xiàn) 程序由兩部分組成:1。讀者-寫者模塊:包括系統(tǒng)調(diào)用接口,讀者-寫者活動描述主程序。系統(tǒng)接口主要功能是通過管道向父進程發(fā)送系統(tǒng)調(diào)用命令,并讀取父進程送來的返回值。讀者-寫者活動程序根據(jù)臨界資源的共享,互斥原則編制,具體見源程序。2。主控模塊:主控模塊實現(xiàn)系統(tǒng)初始化系統(tǒng)調(diào)用命令接收與解釋執(zhí)行,系統(tǒng)調(diào)用功能的實現(xiàn)(包括信號
8、量機制),及讀者-寫者活動過程記錄與顯示。初始化系統(tǒng)環(huán)境建立通信管道 啟動讀者-寫者進程接收系統(tǒng)調(diào)用命令解釋執(zhí)行系統(tǒng)初始化模塊管道建立模塊進程啟動模塊命令解釋模塊Wait()Signal()Wakeup()Block()五 程序調(diào)試測試數(shù)據(jù)文件格式:測試數(shù)據(jù)文件包括n 行測試數(shù)據(jù),分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括四個字段,各字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應(yīng)線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數(shù),表示讀寫操作的開始時間。線程創(chuàng)建后,延時相應(yīng)時間(單位為秒)后發(fā)出對共享資源的讀寫申請
9、。第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。當(dāng)線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應(yīng)時間后結(jié)束,并釋放共享資源。六 結(jié)果分析和討論在讀者寫者同時在隊列中等待申請資時,讀者優(yōu)先調(diào)用資源。而且如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作,即讀讀允許。進程1是R操作,在時間3時進入隊列,運行時間是5,在它進入時沒有進程占用資源,它既占用資源;知道它釋放資源,等候的進程有3,4,5;進程2是W操作,在時間16時進入隊列,運行時間是5,在它進入時進程4占用資源,它等待資源,當(dāng)4釋放時占用資源;進程3是R操作,在時間5時進入隊列,運行時間是2,在
10、它進入時進程1占用資源,它等待資源,當(dāng)進程1釋放資源后,由于讀者優(yōu)先,進程3,5同時調(diào)運資源;進程4是R操作,在時間6時進入隊列,運行時間是5,在它進入時進程1占用資源,它等待資源,當(dāng)進程1釋放資源后,由于讀者優(yōu)先,進程3,5占用資源,它依然等待,直到進程3,5都結(jié)束;進程5是W操作,在時間4時進入隊列,運行時間是3, 在它進入時進程1占用資源,它等待資源,當(dāng)進程1釋放資源后,由于讀者優(yōu)先,進程3,5同時調(diào)運資源;七 心得體會這一次課程設(shè)計,讓我體會很深刻。讀者-寫者問題經(jīng)典的線程同步問題的一個模型。經(jīng)過讀者寫者問題的編寫,我對同步機構(gòu)應(yīng)用有了深入的了解。懂得了運用信號量實現(xiàn)進程間的互斥。實現(xiàn)
11、了不讓共享資源同時修改。用信號量上的原語操作使臨界段問題的解決比較簡單明了了。讀者寫者問題的編寫,花的時間很多,也學(xué)到很多東西。了解支持多道程序的并發(fā)操作系統(tǒng)設(shè)計中解決資源共享時進程間的同步與互斥的信號量機制。幾天的試驗,雖然難度有點大,但只要自己花時間去學(xué)習(xí),還是會攻克困難的。總之,每一次課程設(shè)計不僅是我們學(xué)習(xí)的好機會,而且是我們鍛煉實際動手能力的平臺,雖然有難度的東西總會讓人很抵觸,比如在課設(shè)過程中有很多郁悶的時候,一個小小的錯誤一不小心就花去了自己一上午的時間,所以在這個過程中能夠磨練人的意志與耐心,最后感謝老師的指導(dǎo)與監(jiān)督。八 源代碼#include #include #include
12、 #include #include #include #define MAX_PERSON 100#define READER 0 /讀者#define WRITER 1 /寫者#define END -1#define R READER#define W WRITERtypedef struct _PersonHANDLE m_hThread;/定義處理線程的句柄int m_nType;/進程類型(讀寫)int m_nStartTime;/開始時間int m_nWorkTime;/運行時間int m_nID;/進程號Person;Person g_PersonsMAX_PERSON;int
13、 g_NumPerson = 0;long g_CurrentTime= 0;/基本時間片數(shù)int g_PersonLists = /進程隊列1, R, 3, 5, 2, W, 4, 5, 3, R, 5, 2,4, R, 6, 5, 5, W, 5.1, 3, END,;int g_NumOfReading = 0;int g_NumOfWriteRequest = 0;/申請寫進程的個數(shù)HANDLE g_hReadSemaphore;/讀者信號HANDLE g_hWriteSemaphore;/寫者信號bool finished = false; /所有的讀完成/bool wfinishe
14、d = false; /所有的寫完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main()g_hReadSemaphore = CreateSemaphore(NULL,1,100,
15、NULL); /創(chuàng)建信號燈,當(dāng)前可用的資源數(shù)為1,最大為100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /創(chuàng)建信號燈,當(dāng)前可用的資源數(shù)為1,最大為100CreatePersonList(g_PersonLists); / Create All the reader and writersprintf(Created all the reader and writern.n);g_CurrentTime = 0;while(true)g_CurrentTime+;Sleep(300); / 300 msprintf(Current
16、Time = %dn,g_CurrentTime);if(finished) return 0; / return 0;void CreatePersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool Ret;while(pList0 != END)switch(pList1)case R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654break; case W:Ret = CreateWriter(pList2,pList3,pList0);bre
17、ak;if(!Ret)printf(Create Person %d is wrongn,pList0);pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam)/讀過程Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime) printf(Reader %d is Requesting .n,pPerson-m_nID);printf(nn*n)
18、;/ wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTime;printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_
19、nID);printf(nn*n);while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Reader %d is Exit.n,pPerson-m_nID);printf(nn*n);WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading-;if(g_NumOfReading = 0)ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此時沒有讀者,可以寫ReleaseSemaphore(g_hReadSemaphore
20、,1,NULL);if(pPerson-m_nID = 4) finished = true; /所有的讀寫完成ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d is Requesting .n,pPerson-m_nID);printf(nn*n);WaitForSingleObj
21、ect(g_hWriteSemaphore,INFINITE);/ modify the writers real start timepPerson-m_nStartTime = g_CurrentTime;printf(Writer %d is Writting the Shared Buffer.n,pPerson-m_nID);while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Writer %d is Exit.n,pPerson-m_nID);printf(nn*n);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true;/所有的讀寫完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON)return false;Person *pPerson = &g
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京考貨運資格證考試內(nèi)容
- 產(chǎn)品技術(shù)服務(wù)合同
- 信貸業(yè)務(wù)審批流程詳述
- 全新顧問聘用協(xié)議
- 《數(shù)據(jù)可視化技術(shù)應(yīng)用》2.2 揭示商品庫存數(shù)據(jù)動態(tài)-教案
- 2025年遼陽道路貨運駕駛員從業(yè)資格證考試
- 營林生產(chǎn)松林擇間伐改造提升承攬合同6篇
- 《藥物分析》課程標(biāo)準(zhǔn)
- 駕校合伙投資合同范本
- 單位食堂聘用合同范本
- 初中英語語法時態(tài)總復(fù)習(xí)課件
- 零碳數(shù)據(jù)算力中心項目可行性研究報告
- 研究生復(fù)試流程
- 濰坊市2025屆高三下學(xué)期開學(xué)考(診斷性調(diào)研監(jiān)測)政治試題(含答案)
- 人教版(2025新版)七年級下冊數(shù)學(xué)第七章 相交線與平行線 單元測試卷(含答案)
- 汽輪機輔機培訓(xùn)
- 成都市入戶申請表
- 主題班會:預(yù)防流行性感冒課件
- 對外援助成套項目管理辦法(試行)
- 管道吹掃、試壓檢驗批質(zhì)量驗收記錄表
- 教學(xué)教案、作業(yè)、記錄檢查記錄表
評論
0/150
提交評論