讀者寫者問題_第1頁
讀者寫者問題_第2頁
讀者寫者問題_第3頁
讀者寫者問題_第4頁
讀者寫者問題_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計(jì)(大作業(yè))報(bào)告課程名稱:操作系統(tǒng) 設(shè)計(jì)題目:讀者寫者問題模擬實(shí)現(xiàn) 院 系: 班 級: 設(shè) 計(jì) 者: 學(xué) 號: 指導(dǎo)教師: 設(shè)計(jì)時(shí)間: 昆明學(xué)院昆明學(xué)院課程設(shè)計(jì)(大作業(yè))任務(wù)書姓 名:院(系):信息技術(shù)學(xué)院專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)學(xué) 號:任務(wù)起止日期:2012年12月24日至12月28日 課程設(shè)計(jì)題目:讀者寫者問題模擬實(shí)現(xiàn)課程設(shè)計(jì)要求及任務(wù)描述:設(shè)計(jì)內(nèi)容:1. 創(chuàng)建進(jìn)程,在該進(jìn)程中創(chuàng)建若干個(gè)線程模擬讀者和寫者線程,每個(gè)線程按照要求進(jìn)行讀寫操作。2. 線程讀寫操作要符合以下幾個(gè)條件:第一:寫寫互斥。不能有兩個(gè)寫線程同時(shí)進(jìn)行寫操作。第二:讀寫互斥。不能同時(shí)有一個(gè)線程在讀,另一個(gè)線程在寫。第三

2、:讀讀允許??梢杂幸粋€(gè)或多個(gè)讀者在讀。第四:寫者優(yōu)先。如果一個(gè)讀進(jìn)程申請讀操作時(shí),已經(jīng)有一個(gè)寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。3. 創(chuàng)建兩個(gè)隊(duì)列其中一個(gè)放讀者,另一個(gè)放寫者。當(dāng)讀允許時(shí)就從讀者隊(duì)列中取出一個(gè)或者多個(gè)讀線程進(jìn)行操作;當(dāng)寫允許時(shí),就從寫者隊(duì)列中取出一個(gè)或者多個(gè)寫線程進(jìn)行操作。4. 測試文件測試文件中每行表示一個(gè)線程信息,每行四個(gè)字段,每個(gè)字段用空格隔開。第一個(gè)字段為正數(shù),表示線程序號;第二個(gè)字段表示線程的角色,R表示讀者,W表示寫者;第三個(gè)字段為一個(gè)正數(shù),表示讀寫操作提交時(shí)間;第四個(gè)字段表示讀寫操作的持續(xù)時(shí)間。5. 顯示結(jié)果。使用提示信息

3、方式顯示結(jié)果。每個(gè)線程發(fā)出讀寫操作請求、開始讀寫操作、結(jié)束讀寫操作、被阻塞時(shí)分別顯示一行提示信息。注:實(shí)驗(yàn)環(huán)境及工具不限。工作計(jì)劃及安排:工作時(shí)間為2012年12月24日至12月28日。12月24日分析問題并開始著手畫程序流程圖,24日至25日程序流程圖基本完工,26日開始寫程序代碼,26日至27日程序代碼基本完成并成功實(shí)現(xiàn)要求顯示的結(jié)果,28日完成該提交的報(bào)告文檔內(nèi)容指導(dǎo)教師簽字 年 月 日 課程設(shè)計(jì)(大作業(yè))成績學(xué)號:5 姓名:郭永權(quán) 指導(dǎo)教師:段玻課程設(shè)計(jì)題目:讀者寫者問題模擬實(shí)現(xiàn)完成情況總結(jié):由老師給出的指導(dǎo)任務(wù)書,根據(jù)任務(wù)書分析問題并畫出基本流程圖,然后根據(jù)流程圖逐一寫出程序,并調(diào)式

4、顯示出老師給出的要求。通過這次實(shí)驗(yàn),讓我對C+語言的編寫有了更深的了解,也讓我了解了支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的信號量機(jī)制。在這次的設(shè)計(jì)中,遇到了許多意想不到的問題,在畫流程圖的過程中發(fā)現(xiàn)自己對問題的不熟悉和理解,讓進(jìn)度嚴(yán)重延遲,對程序的編寫也存在很大的問題,自己也沒有足夠的能力解決,最后是通過同學(xué)的幫助才能基本完成。通過這次設(shè)計(jì)也體現(xiàn)出了自己的不足,今后需對程序的編寫和流程圖的設(shè)計(jì)做出更多的學(xué)習(xí)。指導(dǎo)教師評語:成績:填表時(shí)間:指導(dǎo)教師簽名:課程設(shè)計(jì)(大作業(yè))報(bào)告一、實(shí)驗(yàn)原理分析1)、讀者寫者問題讀者寫者問題是指多個(gè)進(jìn)程對一個(gè)共享資源即數(shù)據(jù)集進(jìn)行讀寫操作的

5、問題,其中一些進(jìn)程只要求讀數(shù)據(jù)集的內(nèi)容,而另一些進(jìn)程則要求修改或?qū)憯?shù)據(jù)集的內(nèi)容。將只要求讀數(shù)據(jù)的進(jìn)程稱為讀進(jìn)程,將要求修改或?qū)憯?shù)據(jù)集的進(jìn)程稱為寫進(jìn)程。多個(gè)讀進(jìn)程可以同時(shí)讀此數(shù)據(jù)集,不需要互斥也不會(huì)產(chǎn)生任何問題,但是一個(gè)寫進(jìn)程不能與其他進(jìn)程(讀進(jìn)程或?qū)戇M(jìn)程)同時(shí)訪問此數(shù)據(jù)集,它們之間必須互斥,否則數(shù)據(jù)集的完整性和正確性將遭到破壞。2)、設(shè)計(jì)的算法要求第一:寫寫互斥。不能有兩個(gè)寫線程同時(shí)進(jìn)行寫操作。第二:讀寫互斥。不能同時(shí)有一個(gè)線程在讀,另一個(gè)線程在寫。第三:讀讀允許??梢杂幸粋€(gè)或多個(gè)讀者在讀。第四:寫者優(yōu)先。如果一個(gè)讀進(jìn)程申請讀操作時(shí),已經(jīng)有一個(gè)寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處

6、于等待狀態(tài)后才能開始讀操作。二、流程圖表示及說明1、流程圖:線程1發(fā)出讀請求臨界區(qū)加載Input.txt文件是否有寫進(jìn)程在運(yùn)行加入等待隊(duì)列 Y 線程1、3、4結(jié)束讀進(jìn)程線程4發(fā)出讀請求并開始讀線程5發(fā)出寫進(jìn)程并進(jìn)入等待隊(duì)列線程3發(fā)出讀進(jìn)程并開始讀線程2發(fā)出寫請求并進(jìn)入等待隊(duì)列N線程1開始讀文件無線程在讀及寫線程2結(jié)束寫文件 無線程讀和寫線程5開始寫文件線程5結(jié)束寫文件2、說明:根據(jù)讀者-寫者的讀寫限制(寫者優(yōu)先)1)寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作2)讀-寫互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫者在寫3)讀讀允許,即可以有2個(gè)以上的讀者同時(shí)讀4)寫者優(yōu)先。如果一個(gè)讀進(jìn)程申請讀

7、操作時(shí),已經(jīng)有一個(gè)寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。線程1進(jìn)入臨界區(qū)申請讀文件,臨界區(qū)無寫線程運(yùn)行,線程1開始讀文件,線程2申請寫進(jìn)程,有線程1在讀文件,所以進(jìn)入等待隊(duì)列,線程3申請讀進(jìn)程,因可以有2個(gè)以上進(jìn)程可讀,所以線程2開始讀文件,線程5申請寫進(jìn)程,因有進(jìn)程在讀,所以進(jìn)入等待隊(duì)列,線程4申請讀進(jìn)程并開始讀文件,線程1、3、4結(jié)束進(jìn)程,無進(jìn)程讀寫,線程2開始寫文件,線程2結(jié)束寫文件,無進(jìn)程讀寫,線程5開始寫文件并結(jié)束。三、設(shè)計(jì)及實(shí)現(xiàn)1. 變量定義1)write-count用于記錄正在等待的寫者數(shù)目,它的初始值為0,當(dāng)線程開始調(diào)入時(shí),只允許一個(gè)寫者

8、準(zhǔn)備讀,等待互斥信號,保證對write-count的訪問,修改互斥,即為write-count+,而當(dāng)線程進(jìn)行讀操作時(shí),相應(yīng)寫者數(shù)目減少,即write-count-,當(dāng)write-count=0時(shí),說明所有讀者都已經(jīng)讀完,離開臨界區(qū)喚醒讀者,釋放互斥信號。2)read為實(shí)現(xiàn)寫者優(yōu)先,當(dāng)有寫者在寫文件或等待時(shí),讀者必須阻塞在read上。2. 函數(shù)聲明及功能說明相關(guān)API說明 CreateThread功能:創(chuàng)建一個(gè)線程。 CreateMutex的功能:產(chǎn)生一個(gè)命名或匿名的互斥量對象。 CreateSemaphore的功能:創(chuàng)建命名或匿名信號量對象。 WaitForSingleObject的功能:使

9、程序處于等待狀態(tài),直到信號量出現(xiàn)或超過規(guī)定等待的最長時(shí)間,信號量出現(xiàn)指信號量大于或等于1。 ReleaseSemaphore的功能:將所指信號量加上指定大小的一個(gè)量,執(zhí)行成功返回非0值。 ReleaseMutex的功能:用來打開互斥鎖,即將互斥量加1,成功調(diào)用則返回0。 InitializeCriticalSection的功能:初始化臨界區(qū)對象。 EnterCriticalSection的功能:等待指定臨界區(qū)對象的所有權(quán)。 LeaceCriticalSection的功能:釋放指定臨界區(qū)對象指針。3 .主函數(shù)結(jié)構(gòu)main()rsem= CreateSemaphore(NULL,1,1,NULL)

10、;wsem= CreateSemaphore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphore(NULL,1,1,NULL);CurrentTime = 0;while(true)/模擬20個(gè)時(shí)鐘周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(當(dāng)前時(shí)間 = %d:n,CurrentTime);if(CurrentTime=30)b

11、reak;system(pause);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0;4.代碼及說明源代碼:/寫者優(yōu)先算法#include #include #include #include #include #include #define MAX_PERSON 10#define READER 0#define WRITER 1#define END -1#define R READER#define W WRITER ty

12、pedef struct _PersonHANDLE Thread;int Type;int StartTime;int WorkTime;int ID;Person;Person PersonsMAX_PERSON;int NumPerson = 0;long CurrentTime= 0;int PersonLists = 1,R,2,7,2,W,5,6,/*讀寫互斥*/3,R,6,3,/*寫讀互斥*/4,R,7,6,/*讀讀互斥*/5,W,6,4,/*讀寫互斥*/END,; int rfirst = 0;int wfirst = 0;int NumOfReaders = 0;int Nu

13、mOfWriters = 0;HANDLE rsem;/*初值為1的互斥信號量,在至少有一個(gè)寫者準(zhǔn)備訪問數(shù)據(jù)時(shí)就不允許隨后來的讀者訪問數(shù)據(jù)*/HANDLE wsem;/*初值為1的互斥信號量,之后有一個(gè)寫者訪問數(shù)據(jù)時(shí)其他寫者和讀者就被阻止對數(shù)據(jù)的訪問*/HANDLE z;/*初值為1的互斥信號量,在至少有一個(gè)寫著準(zhǔn)備訪問數(shù)據(jù)、且后面已經(jīng)來一個(gè)讀者時(shí)再來的讀者將在這個(gè)信號量上等待*/HANDLE ReadMutex;/*創(chuàng)建寫者的互斥信號量,初值為1*/HANDLE WriteMutex;/*創(chuàng)建讀者的互斥信號量, 初值為1*/ void CheckPersonList(int *pPerson

14、List);/*查看人數(shù),為創(chuàng)建讀寫者線程*/bool CreateReader(int StartTime,int WorkTime);bool CreateWriter(int StartTime,int WorkTime);DWORD WINAPI ReaderProc(LPVOID lpParam);/*讀者進(jìn)程程序*/DWORD WINAPI WriterProc(LPVOID lpParam);/*寫著進(jìn)程程序*/#include Writerprior.hint main()rsem= CreateSemaphore(NULL,1,1,NULL);wsem= CreateSema

15、phore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphore(NULL,1,1,NULL);CurrentTime = 0;while(true)/模擬20個(gè)時(shí)鐘周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(當(dāng)前時(shí)間 = %d:n,CurrentTime);if(CurrentTime=30)break;system(pause

16、);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0;void CheckPersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool P;while(pList0 != END)if(pList2 = CurrentTime)switch(pList1)case R:P = CreateReader(pList2,pList3);/創(chuàng)建一個(gè)讀者break;c

17、ase W:P = CreateWriter(pList2,pList3);/創(chuàng)建一個(gè)寫者break;if(!P)printf(Create Person %d is wrongn,pList0);pList += 4; / 數(shù)組的指針指向第二個(gè)人DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfReaders;WaitForSingleObject(z,INFINITE);/P(z),其余讀者在此排隊(duì)printf(tt讀者 %d 申請讀數(shù)據(jù).n,pPerso

18、n-ID);WaitForSingleObject(rsem,INFINITE);/P(rsem),一個(gè)讀者與一個(gè)寫著再次競爭數(shù)據(jù)的使用權(quán)/printf(Reader %d is requesting the Shared Buffer.n,pPerson-ID); WaitForSingleObject(ReadMutex,INFINITE);/P(ReadMutex),讀者請求進(jìn)入rfirst臨界區(qū)rfirst+; if(rfirst = 1)/是否是第一個(gè)讀者 WaitForSingleObject(wsem,INFINITE);/讀者在此處與寫者進(jìn)行同步 ReleaseSemaphor

19、e(ReadMutex,1,NULL);/退出rfirst臨界區(qū),V(ReadMutex)ReleaseSemaphore(rsem,1,NULL);ReleaseSemaphore(z,1,NULL);/V(z)/ 讀取所需數(shù)據(jù),將現(xiàn)在時(shí)間賦值給讀者,用以計(jì)算結(jié)束時(shí)間printf(tt讀者 %d 申請成功n,pPerson-ID);pPerson-StartTime = CurrentTime; printf(tt讀者 %d 正在讀數(shù)據(jù).n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/ 模擬讀數(shù)據(jù)printf(tt讀

20、者 %d 讀完數(shù)據(jù)退出n,pPerson-ID);WaitForSingleObject(ReadMutex,INFINITE); rfirst-; if(rfirst = 0) /是最后一個(gè)讀者? ReleaseSemaphore(wsem,1,NULL);/沒有讀者了,寫者放行 ReleaseSemaphore(ReadMutex,1,NULL);/退出讀者臨界區(qū)ExitThread(0);/關(guān)閉讀者線程return 0;DWORD WINAPI WriterProc(LPVOID lpParam)/寫者進(jìn)程程序Person *pPerson = (Person*)lpParam;pPer

21、son-ID = +NumOfWriters; printf(tt寫者 %d 正在申請寫數(shù)據(jù).n,pPerson-ID); WaitForSingleObject(WriteMutex,INFINITE);/請求進(jìn)入寫者臨界區(qū)wfirst=wfirst+;if(wfirst=1)WaitForSingleObject(rsem,INFINITE);/一個(gè)寫者在此與讀者取得同步ReleaseSemaphore(WriteMutex,1,NULL);/退出rfirst臨界區(qū)WaitForSingleObject(wsem,INFINITE);/其他寫者在此等候進(jìn)入寫臨界區(qū) / 讀取所需數(shù)據(jù),將現(xiàn)在

22、時(shí)間賦值給讀者,用以計(jì)算結(jié)束時(shí)間pPerson-StartTime = CurrentTime; printf(tt寫者 %d 正在寫數(shù)據(jù).n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/模擬寫數(shù)據(jù)printf(tt寫者 %d 寫完數(shù)據(jù)退出n,pPerson-ID);ReleaseSemaphore(wsem,1,NULL);/退出進(jìn)入寫臨界區(qū)WaitForSingleObject(WriteMutex,INFINITE);/請求進(jìn)入wfirst臨界區(qū)wfirst=wfirst-;if(wfirst=0)/是最后一個(gè)寫

23、者?ReleaseSemaphore(rsem,1,NULL);/沒有寫者了,向讀者放行ReleaseSemaphore(WriteMutex,1,NULL);/退出wfirst臨界區(qū)ExitThread(0);/關(guān)閉寫者線程return 0;bool CreateReader(int StartTime,int WorkTime)DWORD dwThreadID;Person *pPerson = &PersonsNumPerson;pPerson-StartTime= StartTime;pPerson-WorkTime= WorkTime;pPerson-Type= READER;Num

24、Person+;/ 創(chuàng)建一個(gè)讀者的新線程pPerson-Thread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-Thread = NULL) return false;return true; bool CreateWriter(int StartTime,int WorkTime)DWORD dwThreadID;if(NumPerson = MAX_PERSON)return false;Person *pPerson = &PersonsNumPerson;pPerson-StartTime = StartTime;pPerson-WorkTime = WorkTime;pPerson-Type = WRITER;NumPerson+;/ 創(chuàng)建一個(gè)寫者的新線程pPerson-T

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論