讀者寫者問題實驗報告3_第1頁
讀者寫者問題實驗報告3_第2頁
讀者寫者問題實驗報告3_第3頁
讀者寫者問題實驗報告3_第4頁
讀者寫者問題實驗報告3_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、學(xué) 號: 0120710680427課 程 設(shè) 計題 目實現(xiàn)讀者寫者 (reader-writer problem) 問題學(xué) 院計算機科學(xué)與技術(shù)專 業(yè)軟件工程班 級軟件0704姓 名萬力指導(dǎo)教師劉軍2010年6月27日目 錄1概述 41.1設(shè)計題目 41.2設(shè)計目的 41.3設(shè)計時間 41.4開發(fā)環(huán)境 41.5設(shè)計要求 42數(shù)據(jù)結(jié)構(gòu)與模塊說明 52.1設(shè)計概述 52.2設(shè)計流程圖 63具體編程實現(xiàn) 74運行結(jié)果與測試 85. 課程設(shè)計總結(jié)與體會 116參考文獻(xiàn) 11課程設(shè)計任務(wù)書學(xué)生姓名: 萬力 專業(yè)班級: 軟件0704 指導(dǎo)教師: 劉軍 工作單位: 計算機科學(xué)與技術(shù)學(xué)院 題目: 實現(xiàn)讀者寫者

2、 (reader-writer problem) 問題初始條件:1. 操作系統(tǒng):linux2. 程序設(shè)計語言:c語言3. 設(shè)有20個連續(xù)的存儲單元,寫入/讀出的數(shù)據(jù)項按增序設(shè)定為120這20個字符。要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求) 1技術(shù)要求:1)為每個讀者寫者產(chǎn)生一個線程,設(shè)計正確的同步算法2)每個讀者/寫者對該存儲區(qū)進行操作后,即時顯示該存儲區(qū)的全部內(nèi)容、當(dāng)前指針位置和讀者/寫者線程的自定義標(biāo)識符。3)讀者應(yīng)有3個以上,寫者應(yīng)有有兩個以上。4)多個讀者/寫者之間須共享對存儲區(qū)進行操作的函數(shù)代碼。2 設(shè)計說明書內(nèi)容要求:1)設(shè)計題目與要求2)

3、總的設(shè)計思想及系統(tǒng)平臺、語言、工具等。3)數(shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖)4)運行結(jié)果與運行情況(提示: (1)連續(xù)存儲區(qū)可用數(shù)組實現(xiàn)。(2)編譯命令可用:cc -lpthread -o 目標(biāo)文件名源文件名(3)多線程編程方法參見附件。)3. 調(diào)試報告:1) 調(diào)試記錄2) 自我評析和總結(jié)上機時間安排:18周一 五 08:0 12:00 指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日實現(xiàn)讀者寫者 (reader-writer problem) 問題1 概述1.1 設(shè)計題目實現(xiàn)讀者寫者 (reader-writer problem) 問題1.2 設(shè)計目的通過對操作系統(tǒng)內(nèi)核實現(xiàn)代

4、碼的閱讀、修改、設(shè)計,理解和掌握復(fù)雜的操作系統(tǒng)的工作原理。通過研究linux的線程機制和信號量實現(xiàn)讀者寫者(reader-writer)問題并發(fā)控制。1.3設(shè)計時間消化資料、系統(tǒng)調(diào)查1天系統(tǒng)分析1天總體設(shè)計、實施計劃2天撰寫課程設(shè)計報告書1天第18周周一至周五1.4開發(fā)環(huán)境本次課程設(shè)計在操作系統(tǒng):linux下,使用的編程語言為c語言。1.5 設(shè)計要求1)為每個讀者寫者產(chǎn)生一個線程,設(shè)計正確的同步算法2)每個讀者/寫者對該存儲區(qū)進行操作后,即時顯示該存儲區(qū)的全部內(nèi)容、當(dāng)前指針位置和讀者/寫者線程的自定義標(biāo)識符。3)讀者應(yīng)有3個以上,寫者應(yīng)有有兩個以上。4)多個讀者/寫者之間須共享對存儲區(qū)進行操作

5、的函數(shù)代碼。2數(shù)據(jù)結(jié)構(gòu)與模塊說明2.1設(shè)計概述所謂讀者寫著問題,是指保證一個writer進程必須與其他進程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是,只能有一個寫者在寫書,并且,讀者必寫者優(yōu)先,也就是說,讀者和寫者同時提出請求時,讀者優(yōu)先。當(dāng)讀者提出請求時需要有一個互斥操作,另外,需要有一個信號量s來當(dāng)前是否可操作。信號量機制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計中解決資源共享時進程間的同步與互斥的重要機制,而讀者寫者則是這一機制的一個經(jīng)典范例。與記錄型信號量解決讀者寫者問題不同,信號量機制它增加

6、了一個限制,即最多允許rn個讀者同時讀。為此,又引入了一個信號量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

7、 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)語句起著開關(guān)作用,只要無writer進程進入些,mx=1,reader進程就都可以進入讀。但是要一旦有writer進程進入寫時,其mx=0,則任何reader進程就都無法進入讀。swait(mx ,1,1,l,rn,0)語句表示僅當(dāng)既無write進程在寫(mx=1),又無r

8、eader進程在讀(l=rn)時,writer進程才能進入臨界區(qū)寫。2.2設(shè)計流程圖主程序()讀者()寫者()主控()3 具體編程實現(xiàn)讀者-寫者的讀寫限制(包括讀者優(yōu)先和寫者優(yōu)先)1)寫-寫互斥,即不能有兩個寫者同時進行寫操作2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫3)讀讀允許,即可以有2個以上的讀者同時讀將所有的讀者和所有的寫者分別放進兩個等待隊列中,當(dāng)讀允許時就讓讀者隊列釋放一個或多個讀者,當(dāng)寫允許時,釋放第一個寫者操作。讀者寫者問題的定義如下:有一個許多進程共享的數(shù)據(jù)區(qū),這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數(shù)據(jù)區(qū)的進程(reader)和一些只

9、往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進程(writer),此外還需要滿足以下條件:1)任意多個讀進程可以同時讀這個文件;2) 一次只有一個寫進程可以往文件中寫;3)如果一個寫進程正在進行操作,禁止任何讀進程度文件。我們需要分兩種情況實現(xiàn)該問題:讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。程序由三部分組成:1 讀者模塊:包括系統(tǒng)調(diào)用接口,讀者活動描述主程序。系統(tǒng)接口主要功能是通過管道向父進程發(fā)送系統(tǒng)調(diào)用命令,并讀取父進程送來的返回值。

10、2 寫者模塊:包括系統(tǒng)調(diào)用接口,寫者活動描述主程序。讀者-寫者活動程序根據(jù)臨界資源的共享,互斥原則編制。3. 主控模塊:主控模塊實現(xiàn)系統(tǒng)初始化系統(tǒng)調(diào)用命令接收與解釋執(zhí)行,系統(tǒng)調(diào)用功能的實現(xiàn)(包括信號量機制),及讀者-寫者活動過程記錄與顯示。4運行結(jié)果與測試 測試數(shù)據(jù)文件包括n 行測試數(shù)據(jù),分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括四個字段,各字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應(yīng)線程角色,r 表示讀者是,w 表示寫者。第三字段為一個正數(shù),表示讀寫操作的開始時間。線程創(chuàng)建后,延時相應(yīng)時間(單位為秒)后發(fā)出對共享資源的

11、讀寫申請。第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。當(dāng)線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應(yīng)時間后結(jié)束,并釋放共享資源。下面是一個測試數(shù)據(jù)文件的例子:1, w,4, 5, 2, w, 16, 4, 3, r, 5, 2, 4, w, 6, 5, 5, r, 4, 3,在讀者寫者同時在隊列中等待申請資時,讀者優(yōu)先調(diào)用資源。而且如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作,即讀讀允許。進程1是w操作,在時間4時進入隊列,運行時間是5,在它進入時沒有進程占用資源,它既占用資源;直到它釋放資源,等候的進程有3,4,5;其他進程如截圖所示。5課

12、程設(shè)計總結(jié)與心得體會這一次課程設(shè)計,我完成了題目“讀者-寫者問題的實現(xiàn)”,更加系統(tǒng)地理解和掌握c語言的基本概念、語言特點和編程技巧,在應(yīng)用c語言在程序設(shè)計方面得到系統(tǒng)鍛煉,為將來用c進行軟件開發(fā)打下良好基礎(chǔ)。對程序設(shè)計思想也有了比較清晰的印象,為今后的程序設(shè)計奠定了一定的心理和技術(shù)上的準(zhǔn)備。總的感覺,學(xué)到了很多知識,特別對于linux有了全面的接觸和了解,也開始對linux產(chǎn)生了興趣,它所開放的源碼的確為學(xué)計算機的同志們提供了很好的平臺。讀者-寫者問題經(jīng)典的線程同步問題的一個模型。經(jīng)過讀者寫者問題的編寫,我對同步機構(gòu)應(yīng)用有了深入的了解。懂得了運用信號量實現(xiàn)進程間的互斥。實現(xiàn)了不讓共享資源同時修

13、改。用信號量上的原語操作使臨界段問題的解決比較簡單明了了。讀者寫者問題的編寫,花的時間很多,也學(xué)到很多東西。了解支持多道程序的并發(fā)操作系統(tǒng)設(shè)計中解決資源共享時進程間的同步與互斥的信號量機制。幾天的試驗,雖然難度有點大,但只要自己花時間去學(xué)習(xí),還是會攻克困難的。 課程設(shè)計提高了我對所學(xué)知識的綜合應(yīng)用能力,全面檢查并掌握所學(xué)的內(nèi)容,培養(yǎng)獨立思考、刻苦鉆研的精神,在分析問題、解決問題的過程中,更是獲得一種成功的喜悅,進而增加學(xué)習(xí)和應(yīng)用的興趣。同時也要督促自己在學(xué)習(xí)的過程中不斷的完善自我,加強自己的動手操作能力,培養(yǎng)我的獨立思考的那種思維方式。總之,每一次課程設(shè)計不僅是我們學(xué)習(xí)的好機會,而且是我們鍛煉

14、實際動手能力的平臺,雖然有難度的東西總會讓人很抵觸,比如在課設(shè)過程中有很多郁悶的時候,一個小小的錯誤一不小心就花去了自己一上午的時間,所以在這個過程中能夠磨練人的意志與耐心,最后感謝老師的指導(dǎo)與監(jiān)督。6參考文1 operating system concepts(sixth edition)(操作系統(tǒng)概念)影印版, 主 編:abraham silberschatz 出版社:高等教育出版社 2 操作系統(tǒng)原理(第三版) 主 編: 張堯?qū)W出版社:清華大學(xué)出版社3操作系統(tǒng)實驗教程 主 編:張麗芬,劉利雄.出版社:清華大學(xué)出版社. 本科生課程設(shè)計成績評定表班級:軟件工程0704姓名:萬力學(xué)號:01207

15、10680427序號評分項目滿分實得分1學(xué)習(xí)態(tài)度認(rèn)真、遵守紀(jì)律102設(shè)計分析合理性103設(shè)計方案正確性、可行性、創(chuàng)造性204設(shè)計結(jié)果正確性405設(shè)計報告的規(guī)范性106設(shè)計驗收10總得分/等級評語:注:最終成績以五級分制記。優(yōu)(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下為不及格指導(dǎo)教師簽名:2010 年6月28日源代碼#include #include #include #include #include #include #define max_person 100#define reader 0 /讀者#define writer 1 /寫者#

16、define end -1#define r reader#define w writer typedef struct _personhandle m_hthread;/定義處理線程的句柄int m_ntype;/進程類型(讀寫)int m_nstarttime;/開始時間int m_nworktime;/運行時間int m_nid;/進程號person; person g_personsmax_person;int g_numperson = 0;long g_currenttime= 0;/基本時間片數(shù) int g_personlists = /進程隊列1, w, 4, 5, 2, w,

17、 16, 4, 3, r, 5, 2,4, w, 6, 5, 5, r, 4, 3, end,;int g_numofreading = 0;int g_numofwriterequest = 0;/申請寫進程的個數(shù)handle g_hreadsemaphore;/讀者信號handle g_hwritesemaphore;/寫者信號bool finished = false; /所有的讀完成/bool wfinished = false; /所有的寫完成void createpersonlist(int *ppersonlist);bool createreader(int starttime

18、,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,null); /創(chuàng)建信號燈,當(dāng)前可用的資源數(shù)為,最大為g_hwritesemaphore = createsemaphore(null,1,100,null); /創(chuàng)建信號燈,當(dāng)

19、前可用的資源數(shù)為,最大為createpersonlist(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(currenttime = %dn,g_currenttime);if(finished) return 0;system (pause); / return 0;void createpersonlist(

20、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);break;if(!ret)printf(create person %d is wrongn,plist0); plist += 4; / move to next p

21、erson 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);/ wait for the write requestwaitforsingleobject(g_hreadsemaphore,infinite); if(g

22、_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_nid);printf(nn*n);while(g_currenttime m_nstarttime + pperson-m_nworktime)printf(r

23、eader %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,1,null);if(pperson-m_nid = 4) finished = true; /所有的讀寫完成exitthread(0);return 0;dw

24、ord 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);waitforsingleobject(g_hwritesemaphore,infinite);/ modify the writers real start timepperson-m_nst

25、arttime = 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(i

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論