讀者寫者問題操作系統(tǒng)課程設(shè)計(jì)報(bào)告書_第1頁(yè)
讀者寫者問題操作系統(tǒng)課程設(shè)計(jì)報(bào)告書_第2頁(yè)
讀者寫者問題操作系統(tǒng)課程設(shè)計(jì)報(bào)告書_第3頁(yè)
讀者寫者問題操作系統(tǒng)課程設(shè)計(jì)報(bào)告書_第4頁(yè)
讀者寫者問題操作系統(tǒng)課程設(shè)計(jì)報(bào)告書_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)告主題:讀者作家問題 目錄 TOC o 1-3 h z u HYPERLINK l _Toc265009099 1. 設(shè)計(jì)概述 PAGEREF _Toc265009099 h 3 HYPERLINK l _Toc265009100 2. 設(shè)計(jì)目的及內(nèi)容 PAGEREF _Toc265009100 h 4 HYPERLINK l _Toc265009101 三 設(shè)計(jì)分析 PAGEREF _Toc265009101 h 5 HYPERLINK l _Toc265009102 四項(xiàng)計(jì)劃實(shí)施 PAGEREF _Toc265009102 h 6 HYPERLINK l _Toc2650

2、09103 五程序調(diào)試 PAGEREF _Toc265009103 h 7 HYPERLINK l _Toc265009104 6. 結(jié)果分析與討論 PAGEREF _Toc265009104 h 7 HYPERLINK l _Toc265009105 七種經(jīng)歷 PAGEREF _Toc265009105 h 8 HYPERLINK l _Toc265009108 八個(gè)源代碼 PAGEREF _Toc265009108 h 8九個(gè)實(shí)驗(yàn)截圖 14設(shè)計(jì)概述所謂讀寫問題,是指保證一個(gè)寫進(jìn)程必須訪問與其他進(jìn)程互斥的共享對(duì)象的同步問題。讀寫器問題可以描述如下。有一群作家和一群讀者。作者在寫同一本書,讀者

3、也在讀這本書。多個(gè)讀者可以同時(shí)閱讀一本書,但只能有一個(gè)作者。寫書時(shí),讀者必須先寫,即當(dāng)讀者和作者同時(shí)提出要求時(shí),讀者有優(yōu)先權(quán)。當(dāng)讀者提出請(qǐng)求時(shí),需要進(jìn)行互斥操作。另外,還需要有一個(gè)信號(hào)量S來判斷當(dāng)前是否可操作。信號(hào)量機(jī)制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間同步和互斥問題的重要機(jī)制,讀寫器問題就是這種機(jī)制的一個(gè)典型例子。與解決讀寫器問題的記錄型信號(hào)量不同,信號(hào)量機(jī)制增加了一個(gè)限制,即最多允許RN讀者同時(shí)讀取。為此,引入了另一個(gè)信號(hào)量L,初始值為RN,通過執(zhí)行wait(L,1,1)操作來控制閱讀器的數(shù)量。每當(dāng)有讀者進(jìn)入時(shí),就會(huì)執(zhí)行 wait(L)。 ,1,1)操作將L的值減1。當(dāng)

4、RN讀卡器進(jìn)入讀卡器時(shí),L減為0。當(dāng)RN+1個(gè)讀卡器要進(jìn)入讀卡器時(shí),難免會(huì)因?yàn)槭《蛔枞却↙,1,1)操作。使用信號(hào)量解決讀寫器問題的描述如下:Var RN integer;L,mx:semaphore: =RN,1;開始帕爾貝京讀者:開始重復(fù)等待(L,1,1);等待(mx,1,0) ; .執(zhí)行讀卡器操作;信號(hào)(L,1);直到假;結(jié)尾作者:開始重復(fù)等待(mx,1,1,l,RN,0);執(zhí)行寫操作;信號(hào)(mx,1);直到假;結(jié)尾家長(zhǎng)結(jié)尾其中,Swait(mx, 1, 0) 語(yǔ)句起到了開關(guān)的作用。只要沒有Writer進(jìn)程進(jìn)入,mx=1,reader進(jìn)程就可以進(jìn)入讀取。但是一旦一個(gè)Writer進(jìn)

5、程進(jìn)入寫入,它的MX=0,那么就沒有Reader進(jìn)程可以進(jìn)入讀取。 Swait(mx,1,1,l,RN,0) 語(yǔ)句表示只有在寫入進(jìn)程不寫(mx=1)和讀取進(jìn)程都不在讀(L=注冊(cè)護(hù)士)。本設(shè)計(jì)方案是利用記錄型信號(hào)量來模擬和演示讀寫器問題的求解過程,形象地解釋記錄型信號(hào)量機(jī)制的工作原理。二、設(shè)計(jì)目的及內(nèi)容實(shí)驗(yàn)?zāi)康膌.使用信號(hào)量來實(shí)現(xiàn)讀寫器問題。2. 了解和使用信號(hào)量、PV原語(yǔ)、進(jìn)程間同步和互斥的基礎(chǔ)知識(shí)。二、兩個(gè)實(shí)驗(yàn)讀寫器問題定義如下:有一個(gè)數(shù)據(jù)區(qū)被多個(gè)進(jìn)程共享,可以是一個(gè)文件,也可以是一塊主存;有一些進(jìn)程(Readers)只讀取這個(gè)數(shù)據(jù)區(qū)域,而一些只去數(shù)據(jù)區(qū)域。寫入數(shù)據(jù)(Writer)的過程,除

6、了以下幾種情況:(1) 任意數(shù)量的讀取進(jìn)程可以同時(shí)讀取文件;(2) 一次只能有一個(gè)寫入進(jìn)程寫入文件;(3) 如果一個(gè)寫進(jìn)程正在進(jìn)行,禁止任何讀進(jìn)程文件。我們需要在兩種情況下實(shí)現(xiàn)這個(gè)問題:讀優(yōu)先級(jí):要求是指當(dāng)一個(gè)讀卡器嘗試進(jìn)行讀操作時(shí),如果此時(shí)有其他讀卡器在操作,他可以直接開始讀操作,無需等待。寫優(yōu)先級(jí):當(dāng)一個(gè)reader試圖進(jìn)行讀操作時(shí),如果還有其他的writer在等待寫操作或正在進(jìn)行中,他必須等待writer完成寫操作后才能開始讀操作。三設(shè)計(jì)分析在 Windows 7環(huán)境中,創(chuàng)建一個(gè)具有 n 個(gè)線程的控制臺(tái)進(jìn)程。使用這 n 個(gè)線程來表示 n 個(gè)讀者或作者。每個(gè)線程根據(jù)對(duì)應(yīng)的測(cè)試數(shù)據(jù)文件的要求

7、進(jìn)行讀寫操作。請(qǐng)使用信號(hào)量機(jī)制分別實(shí)現(xiàn)reader-first和writer-first讀寫器問題。讀寫器問題讀寫限制:讀寫器讀寫限制(包括reader-first和writer-first)1)寫-寫互斥,即沒有兩個(gè)寫者可以同時(shí)寫2)讀寫互斥,即不能同時(shí)有一個(gè)reader讀和一個(gè)writer寫3)讀取權(quán)限,即2個(gè)以上的讀者可以同時(shí)閱讀將所有讀者和所有寫者放入兩個(gè)等待隊(duì)列中,讓讀者隊(duì)列在允許讀時(shí)釋放一個(gè)或多個(gè)讀者,在允許寫時(shí)釋放第一個(gè)寫者操作。讀寫器問題定義如下:有一個(gè)數(shù)據(jù)區(qū)被多個(gè)進(jìn)程共享,可以是一個(gè)文件,也可以是一塊主存;有一些進(jìn)程(Readers)只讀取這個(gè)數(shù)據(jù)區(qū)域,而一些只去數(shù)據(jù)區(qū)域。寫

8、入數(shù)據(jù)的進(jìn)程(Writer),除了以下條件: 1)任意數(shù)量的讀取進(jìn)程可以同時(shí)讀取文件; 2) 一次只能有一個(gè)寫入進(jìn)程寫入文件; 3) 如果一個(gè)寫進(jìn)程正在運(yùn)行,禁止任何讀進(jìn)度文件。我們需要在兩種情況下實(shí)現(xiàn)這個(gè)問題:讀優(yōu)先級(jí):要求是指當(dāng)一個(gè)讀卡器嘗試進(jìn)行讀操作時(shí),如果此時(shí)有其他讀卡器在操作,他可以直接開始讀操作,無需等待。寫優(yōu)先級(jí):當(dāng)一個(gè)reader試圖進(jìn)行讀操作時(shí),如果還有其他的writer在等待寫操作或正在進(jìn)行中,他必須等待writer完成寫操作后才能開始讀操作。四方案實(shí)施該計(jì)劃由兩部分組成:1、讀寫器模塊:包括系統(tǒng)調(diào)用接口、讀寫器活動(dòng)描述主程序。系統(tǒng)接口的主要功能是通過管道向父進(jìn)程致系統(tǒng)調(diào)用

9、命令,并讀取父進(jìn)程致的返回值。讀寫活動(dòng)程序是根據(jù)關(guān)鍵資源共享和互斥原則編寫的。有關(guān)詳細(xì)信息,請(qǐng)參閱源程序。2、主控模塊:主控模塊實(shí)現(xiàn)系統(tǒng)初始化系統(tǒng)調(diào)用命令接收和解釋執(zhí)行,系統(tǒng)調(diào)用功能的實(shí)現(xiàn)(包括信號(hào)量機(jī)制),讀寫器活動(dòng)過程的記錄和顯示。初始化系統(tǒng)環(huán)境建立溝通渠道啟動(dòng)讀寫器進(jìn)程接收系統(tǒng)調(diào)用命令解釋執(zhí)行系統(tǒng)初始化模塊管道構(gòu)建模塊進(jìn)程啟動(dòng)模塊命令解釋模塊等待()信號(hào)()醒來()堵塞()五程序調(diào)試測(cè)試數(shù)據(jù)文件格式:測(cè)試數(shù)據(jù)文件包括n行測(cè)試數(shù)據(jù),描述創(chuàng)建的n個(gè)線程是讀寫器,讀寫操作的開始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,以空格分隔。第一個(gè)字段是一個(gè)正整數(shù),表示行節(jié)目編號(hào)。第二個(gè)字段表示對(duì)應(yīng)的線程

10、角色,R表示reader,W表示writer。第三個(gè)字段是一個(gè)正數(shù),表示讀寫操作的開始時(shí)間。線程創(chuàng)建后,延遲相應(yīng)的時(shí)間(以秒為單位)后發(fā)出對(duì)共享資源的讀/寫請(qǐng)求。第四個(gè)字段是一個(gè)正數(shù),表示讀寫操作的持續(xù)時(shí)間。當(dāng)線程的讀寫申請(qǐng)成功后,開始對(duì)共享資源的讀寫操作,并在相應(yīng)的時(shí)間后結(jié)束,釋放共享資源。6 結(jié)果分析與討論當(dāng)讀者和作者同時(shí)在隊(duì)列中等待申請(qǐng)資源時(shí),讀者首先調(diào)用資源。并且,如果在閱讀器申請(qǐng)閱讀操作時(shí),其他閱讀器已經(jīng)在進(jìn)行閱讀操作,則閱讀器可以直接開始閱讀操作,即允許閱讀操作。進(jìn)程1是R操作,在時(shí)間3進(jìn)入隊(duì)列,運(yùn)行時(shí)間為5。進(jìn)入時(shí),沒有進(jìn)程占用資源,占用資源;知道它釋放資源,等待的進(jìn)程是3、4、

11、5;進(jìn)程2為W操作,時(shí)間16進(jìn)入隊(duì)列,運(yùn)行時(shí)間為5。進(jìn)程4進(jìn)入時(shí)占用資源,等待資源,4釋放時(shí)占用資源;過程 3 是 R 操作。它在時(shí)間5進(jìn)入隊(duì)列,運(yùn)行時(shí)間為2。進(jìn)入時(shí),進(jìn)程1占用資源并等待資源。當(dāng)進(jìn)程1釋放資源時(shí),進(jìn)程3和進(jìn)程5由于讀卡器的優(yōu)先級(jí)同時(shí)轉(zhuǎn)移資源;過程 4 是R操作。它在時(shí)間6進(jìn)入隊(duì)列,運(yùn)行時(shí)間為5。進(jìn)入時(shí),進(jìn)程1占用資源,等待資源。當(dāng)進(jìn)程 1 釋放資源時(shí),由于讀取者的優(yōu)先級(jí),進(jìn)程 3 和 5 會(huì)占用資源。仍在等待進(jìn)程 3 和 5 結(jié)束;過程 5 是W操作。它在時(shí)間4進(jìn)入隊(duì)列,運(yùn)行時(shí)間為3。當(dāng)它進(jìn)入時(shí),進(jìn)程1占用資源并等待資源。進(jìn)程1釋放資源時(shí),由于reader的優(yōu)先級(jí),進(jìn)程3和5

12、同時(shí)進(jìn)行資源轉(zhuǎn)移;七種經(jīng)歷這門課的設(shè)計(jì)讓我有了深刻的理解。讀寫器問題 經(jīng)典線程同步問題的模型。寫完讀寫器問題,對(duì)同步機(jī)制的應(yīng)用有了一個(gè)扎實(shí)的了解。了解使用信號(hào)量實(shí)現(xiàn)進(jìn)程間的互斥。實(shí)施以防止共享資源同時(shí)被修改。在信號(hào)量上使用原始操作使得臨界區(qū)問題的解決相對(duì)簡(jiǎn)單。讀者作家問題的寫作需要很多時(shí)間并且學(xué)到很多東西。了解支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中進(jìn)程之間同步和互斥的信號(hào)量機(jī)制。幾天的測(cè)試,雖然有點(diǎn)難,但只要花時(shí)間去學(xué)習(xí),還是會(huì)克服困難的??傊?,每一個(gè)課程設(shè)計(jì),不僅是我們學(xué)習(xí)的好機(jī)會(huì),也是我們鍛煉動(dòng)手能力的平臺(tái),雖然困難的事情總會(huì)讓人很抗拒,比如課程設(shè)計(jì)有很多凹陷的時(shí)候過程中,一個(gè)小錯(cuò)誤不小心帶了我

13、一上午,所以我可以在過程中磨練自己的意志和耐心,最后感謝鄒云康老師的指導(dǎo)和監(jiān)督。八源代碼#include #include #include #include #include #include #define MAX_PERSON 100#define READER 0 /閱讀器#define WRITER 1 /作者#define 結(jié)束 -1#define R 閱讀器#define 作家typedef struct _PersonHANDLE m_hThread;/定義處理線程的句柄int m_nType;/進(jìn)程類型(讀寫)int m_nStartTime;/開始時(shí)間int m_nWork

14、Time;/運(yùn)行時(shí)間int m_nID;/進(jìn)程ID人;人 g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 0;/基本時(shí)間片個(gè)數(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_NumOfWriteRequest = 0;/應(yīng)用寫進(jìn)程數(shù)HANDLE g_hReadSemaphore;/閱讀器信號(hào)HANDLE g_hWriteSemapho

15、re;/寫入信號(hào)布爾完成=假; /所有讀取完成/bool wfinished = false; /所有寫入都完成無效 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);主函數(shù)()g_hReadSemaphor

16、e = CreateSemaphore(NULL,1,100,NULL); /創(chuàng)建一個(gè)信號(hào)量,當(dāng)前可用資源數(shù)為1,最大為100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /創(chuàng)建一個(gè)信號(hào)量,當(dāng)前可用資源數(shù)為1,最大為100CreatePersonList(g_PersonLists); / 創(chuàng)建所有的讀者和作者printf(創(chuàng)建了所有的讀寫器n.n);g_CurrentTime = 0;而(真)g_CurrentTime+;睡眠(300); / 300 毫秒printf(當(dāng)前時(shí)間 = %dn,g_CurrentTime);如果(完成

17、)返回 0; / 返回 0;無效 CreatePersonList(int *pPersonLists)詮釋我=0;int *pList = pPersonLists;布爾雷特;而(pList 0!=結(jié)束)開關(guān)(pList1)案例R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654休息;案例 W:Ret = CreateWriter(pList2,pList3,pList0);休息;if(!Ret)printf(創(chuàng)建人 %d 錯(cuò)誤n,pList0);pList += 4; / 移動(dòng)到下一個(gè)人列表DWORD WINAPI Rea

18、derProc(LPVOID lpParam)/讀過程人 *pPerson = (Person*)lpParam;/ 等待開始時(shí)間而(g_CurrentTime!= pPerson-m_nStartTime) printf(Reader %d 正在請(qǐng)求 .n,pPerson-m_nID);printf(nn* *n);/ 等待寫請(qǐng)求WaitForSingleObject(g_hReadSemaphore,INFINITE);如果(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;

19、ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTime;printf(Reader %d 正在讀取共享緩沖區(qū).n,pPerson-m_nID);printf(nn* * *n);而(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Reader %d is Exit.n,pPerson-m_nID);printf(nn* * *n);WaitForSingleObject(g_hReadSemaphore, INFINITE);g_

20、NumOfReading-;如果(g_NumOfReading = 0)ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此時(shí)沒有讀卡器,可以寫ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID = 4) 完成 = true; /所有讀寫完成退出線程(0);返回0;DWORD WINAPI WriterProc(LPVOID lpParam)人 *pPerson = (Person*)lpParam;/ 等待開始時(shí)間而(g_CurrentTime!= pPerson-m_nStartTime

21、)printf(Writer %d 正在請(qǐng)求.n,pPerson-m_nID);printf(nn* *n);WaitForSingleObject(g_hWriteSemaphore,INFINITE);/ 修改 writer 的實(shí)際開始時(shí)間pPerson-m_nStartTime = g_CurrentTime;printf(Writer %d 正在寫入共享緩沖區(qū).n,pPerson-m_nID);而(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;/所有的學(xué)習(xí)完成退出線程(0);返回0;bool CreateReader(int StartTime,int WorkTime,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論