




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、. . . . 操作系統(tǒng)課程設(shè)計(jì)報(bào)告題 目:讀者寫(xiě)者問(wèn)題 學(xué) 院: 專(zhuān) 業(yè): 班 級(jí): 學(xué) 號(hào): 姓 名: 指導(dǎo)老師: 目 錄一設(shè)計(jì)概述3二設(shè)計(jì)目的與容4三 設(shè)計(jì)分析5四程序?qū)崿F(xiàn)6五程序調(diào)試7六結(jié)果分析和討論7七心得體會(huì)8八 源代碼 8九 實(shí)驗(yàn)截圖14一設(shè)計(jì)概述所謂讀者寫(xiě)者問(wèn)題,是指保證一個(gè)writer進(jìn)程必須與其他進(jìn)程互斥地訪問(wèn)共享對(duì)象的同步問(wèn)題。讀者寫(xiě)者問(wèn)題可以這樣的描述,有一群寫(xiě)者和一群讀者,寫(xiě)者在寫(xiě)同一本書(shū),讀者也在讀這本書(shū),多個(gè)讀者可以同時(shí)讀這本書(shū),但是,只能有一個(gè)寫(xiě)者在寫(xiě)書(shū),并且,讀者必寫(xiě)者優(yōu)先,也就是說(shuō),讀者和寫(xiě)者同時(shí)提出請(qǐng)求時(shí),讀者優(yōu)先。當(dāng)讀者提出請(qǐng)求時(shí)需要有一個(gè)互斥操作,另外
2、,需要有一個(gè)信號(hào)量S來(lái)當(dāng)前是否可操作。信號(hào)量機(jī)制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的重要機(jī)制,而讀者寫(xiě)者問(wèn)題則是這一機(jī)制的一個(gè)經(jīng)典例。與記錄型信號(hào)量解決讀者寫(xiě)者問(wèn)題不同,信號(hào)量機(jī)制它增加了一個(gè)限制,即最多允許RN個(gè)讀者同時(shí)讀。為此,又引入了一個(gè)信號(hào)量L,并賦予初值為RN,通過(guò)執(zhí)行wait(L,1,1)操作,來(lái)控制讀者的數(shù)目,每當(dāng)有一個(gè)讀者進(jìn)入時(shí),就要執(zhí)行wait(L,1,1)操作,使L的值減1。當(dāng)有RN個(gè)讀者進(jìn)入讀后,L便減為0,第RN+1 個(gè)讀者要進(jìn)入讀時(shí),必然會(huì)因wait(L,1,1)操作失敗而堵塞。對(duì)利用信號(hào)量來(lái)解決讀者寫(xiě)者問(wèn)題的描述如下:Var RN i
3、nteger;L,mx:semaphore: =RN,1;BeginParbegin Reader :begin Repeat Swait(L,1,1); Swait(mx,1,0); . Perform reader operation; Ssignal(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)語(yǔ)句起著開(kāi)關(guān)作用,只要無(wú)Writer進(jìn)程進(jìn)入些,mx=1,
4、reader進(jìn)程就都可以進(jìn)入讀。但是要一旦有Writer進(jìn)程進(jìn)入寫(xiě)時(shí),其MX=0,則任何reader進(jìn)程就都無(wú)法進(jìn)入讀。Swait(mx ,1,1,l,RN,0)語(yǔ)句表示僅當(dāng)既無(wú)Write進(jìn)程在寫(xiě)(mx=1),又無(wú)reader進(jìn)程在讀(L=RN)時(shí),writer進(jìn)程才能進(jìn)入臨界區(qū)寫(xiě)。本設(shè)計(jì)方案就是通過(guò)利用記錄型信號(hào)量對(duì)讀者寫(xiě)者問(wèn)題的解決過(guò)程進(jìn)行模擬演示,形象地闡述記錄型信號(hào)量機(jī)制的工作原理。二 設(shè)計(jì)目的與容一 實(shí)驗(yàn)?zāi)康膌. 用信號(hào)量來(lái)實(shí)現(xiàn)讀者寫(xiě)者問(wèn)題。2.理解和運(yùn)用信號(hào)量、PV原語(yǔ)、進(jìn)程間的同步互斥關(guān)系等基本知識(shí)。二、二實(shí)驗(yàn)容讀者寫(xiě)者問(wèn)題的定義如下:有一個(gè)許多進(jìn)程共享的數(shù)據(jù)區(qū),這個(gè)數(shù)據(jù)區(qū)可以是
5、一個(gè)文件或者主存的一塊空間;有一些只讀取這個(gè)數(shù)據(jù)區(qū)的進(jìn)程(Reader)和一些只往數(shù)據(jù)區(qū)寫(xiě)數(shù)據(jù)的進(jìn)程(Writer),此外還需要滿足以下條件:(1) 任意多個(gè)讀進(jìn)程可以同時(shí)讀這個(gè)文件;(2) 一次只有一個(gè)寫(xiě)進(jìn)程可以往文件中寫(xiě);(3) 如果一個(gè)寫(xiě)進(jìn)程正在進(jìn)行操作,禁止任何讀進(jìn)程度文件。我們需要分兩種情況實(shí)現(xiàn)該問(wèn)題:讀優(yōu)先:要求指一個(gè)讀者試圖進(jìn)行讀操作時(shí),如果這時(shí)正有其他讀者在進(jìn)行操作,他可直接開(kāi)始讀操作,而不需要等待。寫(xiě)優(yōu)先:一個(gè)讀者試圖進(jìn)行讀操作時(shí),如果有其他寫(xiě)者在等待進(jìn)行寫(xiě)操作或正在進(jìn)行寫(xiě)操作,他要等待該寫(xiě)者完成寫(xiě)操作后才開(kāi)始讀操作。三設(shè)計(jì)分析在Windows 7 環(huán)境下,創(chuàng)建一個(gè)包含n 個(gè)
6、線程的控制臺(tái)進(jìn)程。用這n 個(gè)線程來(lái)表示n個(gè)讀者或?qū)懻摺C總€(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件的要求,進(jìn)行讀寫(xiě)操作。請(qǐng)用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫(xiě)者優(yōu)先的讀者-寫(xiě)者問(wèn)題。讀者-寫(xiě)者問(wèn)題的讀寫(xiě)操作限制:讀者-寫(xiě)者的讀寫(xiě)限制(包括讀者優(yōu)先和寫(xiě)者優(yōu)先)1)寫(xiě)-寫(xiě)互斥,即不能有兩個(gè)寫(xiě)者同時(shí)進(jìn)行寫(xiě)操作2)讀-寫(xiě)互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫(xiě)者在寫(xiě)3)讀讀允許,即可以有2個(gè)以上的讀者同時(shí)讀將所有的讀者和所有的寫(xiě)者分別放進(jìn)兩個(gè)等待隊(duì)列中,當(dāng)讀允許時(shí)就讓讀者隊(duì)列釋放一個(gè)或多個(gè)讀者,當(dāng)寫(xiě)允許時(shí),釋放第一個(gè)寫(xiě)者操作。讀者寫(xiě)者問(wèn)題的定義如下:有一個(gè)許多進(jìn)程共享的數(shù)據(jù)區(qū),這個(gè)數(shù)據(jù)區(qū)可以是一個(gè)文件或者主存的一塊空
7、間;有一些只讀取這個(gè)數(shù)據(jù)區(qū)的進(jìn)程(Reader)和一些只往數(shù)據(jù)區(qū)寫(xiě)數(shù)據(jù)的進(jìn)程(Writer),此外還需要滿足以下條件:1)任意多個(gè)讀進(jìn)程可以同時(shí)讀這個(gè)文件;2) 一次只有一個(gè)寫(xiě)進(jìn)程可以往文件中寫(xiě);3)如果一個(gè)寫(xiě)進(jìn)程正在進(jìn)行操作,禁止任何讀進(jìn)程度文件。我們需要分兩種情況實(shí)現(xiàn)該問(wèn)題:讀優(yōu)先:要求指一個(gè)讀者試圖進(jìn)行讀操作時(shí),如果這時(shí)正有其他讀者在進(jìn)行操作,他可直接開(kāi)始讀操作,而不需要等待。寫(xiě)優(yōu)先:一個(gè)讀者試圖進(jìn)行讀操作時(shí),如果有其他寫(xiě)者在等待進(jìn)行寫(xiě)操作或正在進(jìn)行寫(xiě)操作,他要等待該寫(xiě)者完成寫(xiě)操作后才開(kāi)始讀操作。四 程序?qū)崿F(xiàn)程序由兩部分組成:1。讀者-寫(xiě)者模塊:包括系統(tǒng)調(diào)用接口,讀者-寫(xiě)者活動(dòng)描述主程序
8、。系統(tǒng)接口主要功能是通過(guò)管道向父進(jìn)程發(fā)送系統(tǒng)調(diào)用命令,并讀取父進(jìn)程送來(lái)的返回值。讀者-寫(xiě)者活動(dòng)程序根據(jù)臨界資源的共享,互斥原則編制,具體見(jiàn)源程序。2。主控模塊:主控模塊實(shí)現(xiàn)系統(tǒng)初始化系統(tǒng)調(diào)用命令接收與解釋執(zhí)行,系統(tǒng)調(diào)用功能的實(shí)現(xiàn)(包括信號(hào)量機(jī)制),與讀者-寫(xiě)者活動(dòng)過(guò)程記錄與顯示。初始化系統(tǒng)環(huán)境建立通信管道 啟動(dòng)讀者-寫(xiě)者進(jìn)程接收系統(tǒng)調(diào)用命令解釋執(zhí)行系統(tǒng)初始化模塊管道建立模塊進(jìn)程啟動(dòng)模塊命令解釋模塊Wait()Signal()Wakeup()Block()五程序調(diào)試測(cè)試數(shù)據(jù)文件格式:測(cè)試數(shù)據(jù)文件包括n 行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n 個(gè)線程是讀者還是寫(xiě)者,以與讀寫(xiě)操作的開(kāi)始時(shí)間和持續(xù)時(shí)間。每行測(cè)試
9、數(shù)據(jù)包括四個(gè)字段,各字段間用空格分隔。第一字段為一個(gè)正整數(shù),表示線程序號(hào)。第二字段表示相應(yīng)線程角色,R 表示讀者是,W 表示寫(xiě)者。第三字段為一個(gè)正數(shù),表示讀寫(xiě)操作的開(kāi)始時(shí)間。線程創(chuàng)建后,延時(shí)相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫(xiě)申請(qǐng)。第四字段為一個(gè)正數(shù),表示讀寫(xiě)操作的持續(xù)時(shí)間。當(dāng)線程讀寫(xiě)申請(qǐng)成功后,開(kāi)始對(duì)共享資源的讀寫(xiě)操作,該操作持續(xù)相應(yīng)時(shí)間后結(jié)束,并釋放共享資源。六結(jié)果分析和討論在讀者寫(xiě)者同時(shí)在隊(duì)列中等待申請(qǐng)資時(shí),讀者優(yōu)先調(diào)用資源。而且如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一讀者正在進(jìn)行讀操作,則該讀者可直接開(kāi)始讀操作,即讀讀允許。進(jìn)程1是R操作,在時(shí)間3時(shí)進(jìn)入隊(duì)列,運(yùn)行時(shí)間是5,在它進(jìn)入時(shí)
10、沒(méi)有進(jìn)程占用資源,它既占用資源;知道它釋放資源,等候的進(jìn)程有3,4,5;進(jìn)程2是W操作,在時(shí)間16時(shí)進(jìn)入隊(duì)列,運(yùn)行時(shí)間是5,在它進(jìn)入時(shí)進(jìn)程4占用資源,它等待資源,當(dāng)4釋放時(shí)占用資源;進(jìn)程3是R操作,在時(shí)間5時(shí)進(jìn)入隊(duì)列,運(yùn)行時(shí)間是2,在它進(jìn)入時(shí)進(jìn)程1占用資源,它等待資源,當(dāng)進(jìn)程1釋放資源后,由于讀者優(yōu)先,進(jìn)程3,5同時(shí)調(diào)運(yùn)資源;進(jìn)程4是R操作,在時(shí)間6時(shí)進(jìn)入隊(duì)列,運(yùn)行時(shí)間是5,在它進(jìn)入時(shí)進(jìn)程1占用資源,它等待資源,當(dāng)進(jìn)程1釋放資源后,由于讀者優(yōu)先,進(jìn)程3,5占用資源,它依然等待,直到進(jìn)程3,5都結(jié)束;進(jìn)程5是W操作,在時(shí)間4時(shí)進(jìn)入隊(duì)列,運(yùn)行時(shí)間是3, 在它進(jìn)入時(shí)進(jìn)程1占用資源,它等待資源,當(dāng)進(jìn)程
11、1釋放資源后,由于讀者優(yōu)先,進(jìn)程3,5同時(shí)調(diào)運(yùn)資源;七心得體會(huì)這一次課程設(shè)計(jì),讓我體會(huì)很深刻。讀者-寫(xiě)者問(wèn)題經(jīng)典的線程同步問(wèn)題的一個(gè)模型。經(jīng)過(guò)讀者寫(xiě)者問(wèn)題的編寫(xiě),我對(duì)同步機(jī)構(gòu)應(yīng)用有了深入的了解。懂得了運(yùn)用信號(hào)量實(shí)現(xiàn)進(jìn)程間的互斥。實(shí)現(xiàn)了不讓共享資源同時(shí)修改。用信號(hào)量上的原語(yǔ)操作使臨界段問(wèn)題的解決比較簡(jiǎn)單明了了。讀者寫(xiě)者問(wèn)題的編寫(xiě),花的時(shí)間很多,也學(xué)到很多東西。了解支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的信號(hào)量機(jī)制。幾天的試驗(yàn),雖然難度有點(diǎn)大,但只要自己花時(shí)間去學(xué)習(xí),還是會(huì)攻克困難的??傊?,每一次課程設(shè)計(jì)不僅是我們學(xué)習(xí)的好機(jī)會(huì),而且是我們鍛煉實(shí)際動(dòng)手能力的平臺(tái),雖然有難度
12、的東西總會(huì)讓人很抵觸,比如在課設(shè)過(guò)程中有很多郁悶的時(shí)候,一個(gè)小小的錯(cuò)誤一不小心就花去了自己一上午的時(shí)間,所以在這個(gè)過(guò)程中能夠磨練人的意志與耐心,最后感鄒云康老師的指導(dǎo)與監(jiān)督。八 源代碼#include #include #include #include #include #include #define MAX_PERSON 100#define READER 0 /讀者#define WRITER 1 /寫(xiě)者#define END -1#define R READER#define W WRITERtypedef struct _PersonHANDLE m_hThread;/定義處理線程
13、的句柄int m_nType;/進(jìn)程類(lèi)型(讀寫(xiě))int m_nStartTime;/開(kāi)始時(shí)間int m_nWorkTime;/運(yùn)行時(shí)間int m_nID;/進(jìn)程號(hào)Person;Person g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 0;/基本時(shí)間片數(shù)int g_PersonLists = /進(jìn)程隊(duì)列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_NumOfWriteReques
14、t = 0;/申請(qǐng)寫(xiě)進(jìn)程的個(gè)數(shù)HANDLE g_hReadSemaphore;/讀者信號(hào)HANDLE g_hWriteSemaphore;/寫(xiě)者信號(hào)bool finished = false; /所有的讀完成/bool wfinished = false; /所有的寫(xiě)完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI Reade
15、rProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main()g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /創(chuàng)建信號(hào)燈,當(dāng)前可用的資源數(shù)為1,最大為100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /創(chuàng)建信號(hào)燈,當(dāng)前可用的資源數(shù)為1,最大為100CreatePersonList(g_PersonLists); / Create All the reader and writersprint
16、f(Created all the reader and writern.n);g_CurrentTime = 0;while(true)g_CurrentTime+;Sleep(300); / 300 msprintf(CurrentTime = %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
17、R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654break; case W:Ret = CreateWriter(pList2,pList3,pList0);break;if(!Ret)printf(Create Person %d is wrongn,pList0);pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam)/讀過(guò)程Person *pPerson = (Person*)lpParam;/ wait for th
18、e start timewhile(g_CurrentTime != pPerson-m_nStartTime) printf(Reader %d is Requesting .n,pPerson-m_nID);printf(nn*n);/ wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;ReleaseSemaphore(g_
19、hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTime;printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_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_NumOf
20、Reading-;if(g_NumOfReading = 0)ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此時(shí)沒(méi)有讀者,可以寫(xiě)ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true; /所有的讀寫(xiě)完成ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhil
21、e(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d is Requesting .n,pPerson-m_nID);printf(nn*n);WaitForSingleObject(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_Curre
22、ntTime 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;/所有的讀寫(xiě)完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON)return false;Person *pPerson = &
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)鎮(zhèn)房子門(mén)面出售合同范例
- 假期出游合同范例
- 共同投資經(jīng)營(yíng)合同范例
- 黃羽肉雞生長(zhǎng)與繁殖拮抗性狀基因組選擇優(yōu)化方案的模擬研究
- 農(nóng)村板車(chē)出售合同范例
- 保證投資不虧欠合同范例
- 公司崗位合同范例
- 出租 包租 合同范本
- 企業(yè)服務(wù)顧問(wèn)合同范例
- 剛配材料合同范例
- 四年級(jí)數(shù)學(xué)思維訓(xùn)練社團(tuán)活動(dòng)(素質(zhì)拓展)電子教案
- 金屬切削過(guò)程中的變形 revised課件
- 蒙古族文化課件
- 簡(jiǎn)明燒傷健康量表
- 傳染病布氏菌病 課件
- 商業(yè)廣告設(shè)計(jì)課件
- 教會(huì)行政管理學(xué)課程教案
- SJG 44-2018 深圳市公共建筑節(jié)能設(shè)計(jì)規(guī)范-高清現(xiàn)行
- 2022年高考(全國(guó)甲卷)語(yǔ)文仿真模擬卷【含答案】
- _重大事故后果分析(精)
- 水泥攪拌樁施工監(jiān)理質(zhì)量控制要點(diǎn)
評(píng)論
0/150
提交評(píng)論