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

下載本文檔

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

文檔簡(jiǎn)介

1、課程設(shè)計(jì)任務(wù)書學(xué) 院信息學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué) 生 姓 名學(xué) 號(hào)題 目讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)內(nèi)容及要求:內(nèi)容:讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)實(shí)驗(yàn)?zāi)康模毫私膺M(jìn)程同步的概念,理解信號(hào)量機(jī)制的原理,掌握信號(hào)量解決同步問(wèn)題的方法,進(jìn)而學(xué)會(huì)進(jìn)程的同步與互斥。設(shè)計(jì)要求:編程模擬教材中討論讀者與寫者的問(wèn)題,要求能顯示結(jié)果。任務(wù)交付:1.程序源代碼;2課程設(shè)計(jì)論文及電子文檔。進(jìn)度安排:16周確定題目,查找資料,上機(jī)編程;20周上機(jī)編程調(diào)試,驗(yàn)收答辯,提交課程序設(shè)計(jì)報(bào)告書。指導(dǎo)教師(簽字):年 月 日學(xué)院院長(zhǎng)(簽字):年 月 日目 錄一、課程設(shè)計(jì)目的及要求1二、相關(guān)知識(shí)1三、題目分析2四、概要設(shè)計(jì)

2、4五、代碼及流程5六、運(yùn)行結(jié)果11七、設(shè)計(jì)心得12八、參考文獻(xiàn)12一、課程設(shè)計(jì)目的及要求讀者與寫者問(wèn)題(進(jìn)程同步問(wèn)題)用n 個(gè)線程來(lái)表示n個(gè)讀者或?qū)懻摺C總€(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件的要求,進(jìn)行讀寫操作。請(qǐng)用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問(wèn)題。讀者-寫者問(wèn)題的讀寫操作限制:1)寫-寫互斥;2)讀-寫互斥;3)讀-讀允許;寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一寫者在等待訪問(wèn)共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。二、相關(guān)知識(shí)Windows API:在本實(shí)驗(yàn)中涉及的API 有:1線程控制:CreateThread 完成線程創(chuàng)建,在調(diào)用進(jìn)程的地

3、址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);它的返回值為所創(chuàng)建線程的句柄。HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, / SDDWORD dwStackSize, / initial stack sizeLPTHREAD_START_ROUTINE lpStartAddress, / threadfunctionLPVOID lpParameter,/ thread argumentDWORD dwCreationFlags, / creation optionLPDWORD lpThreadId / thread i

4、dentifier);2 ExitThread 用于結(jié)束當(dāng)前線程。VOID ExitThread(DWORD dwExitCode / exit code for this thread);3 Sleep 可在指定的時(shí)間內(nèi)掛起當(dāng)前線程。VOID Sleep(DWORD dwMilliseconds / sleep time);4信號(hào)量控制:WaitForSingleObject 可在指定的時(shí)間內(nèi)等待指定對(duì)象為可用狀態(tài);DWORD WaitForSingleObject(HANDLE hHandle, / handle to objectDWORD dwMilliseconds / time-o

5、ut interval);hHandle為等待的對(duì)象,也就是實(shí)現(xiàn)同步或者互斥的對(duì)象。該函數(shù)一執(zhí)行,相應(yīng)的信號(hào)量就減去1,如果信號(hào)量小于等于0,那么他一直在循環(huán)。5 實(shí)現(xiàn)信號(hào)量互斥和同步CreateSemaphore用于創(chuàng)建信號(hào)量,根據(jù)參數(shù)的不同可以利用它實(shí)現(xiàn)互斥和同步。ReleaseSemaphore用于釋放信號(hào)量,使用后相應(yīng)的信號(hào)量加1HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,/SDLONG,lInitialCount,/initial countLONG,lMaximumCount,/maximum

6、 countLPCTSTR lpName/object name);ReleaseSemaphore(HANDLE hSemaphore, /handle to semaphoreLONG lRelseaseCount,/cont increment amountLPLONG lpPreviousCount/previous count);三、題目分析將所有的讀者和所有的寫者分別放進(jìn)兩個(gè)等待隊(duì)列中,當(dāng)讀允許時(shí)就讓讀者隊(duì)列釋放一個(gè)或多個(gè)讀者,當(dāng)寫允許時(shí),釋放第一個(gè)寫者操作。(1)構(gòu)筑讀者進(jìn)程和寫者進(jìn)程間的臨界區(qū)題目中說(shuō)的一批數(shù)據(jù)被多個(gè)讀者、寫者共享使用,允許多個(gè)讀者同時(shí)訪問(wèn)這些數(shù)據(jù),但是如果有一

7、個(gè)寫者在訪問(wèn)數(shù)據(jù)時(shí),就不允許其他讀者或?qū)懻呤褂茫?,?duì)這一批數(shù)據(jù)既要保證讀者和寫者互斥使用,也要保證寫者與寫者互斥使用。也就是說(shuō),在讀者進(jìn)程程序中,使用數(shù)據(jù)的程序段應(yīng)該構(gòu)成臨界區(qū);在寫者進(jìn)程程序中,使用數(shù)據(jù)的程序段應(yīng)該構(gòu)成臨界區(qū)。(2)判定是否是第一個(gè)讀者根據(jù)上面的分析,希望在讀者進(jìn)程中有一個(gè)辦法能判定請(qǐng)求進(jìn)入臨界區(qū)的是否是第一個(gè)讀者。如果是第一個(gè)讀者,就對(duì)信號(hào)量wsem做P操作,以取得和寫者的同步。為此,設(shè)置一個(gè)變量rfirst,初值為0.任何一個(gè)讀者運(yùn)行時(shí),都現(xiàn)在rfirst上加1,然后判定他是否取值為1.如果是1,則做P(wrt),否則不做。(3)判定是否是第一個(gè)寫者原理同(2)判定是

8、否為第一個(gè)讀者。(4)寫者優(yōu)先問(wèn)題的解決需要用到的如下的信號(hào)量和變量rsem: 初值為1的互斥信號(hào)量,在至少有一個(gè)寫者準(zhǔn)備訪問(wèn)數(shù)據(jù)時(shí)就不允許隨后來(lái)的讀者訪問(wèn)數(shù)據(jù)wserm: 初值為1的互斥信號(hào)量,之后有一個(gè)寫者訪問(wèn)數(shù)據(jù)時(shí)其他寫者和讀者就被阻止對(duì)數(shù)據(jù)的訪問(wèn)ReadMutex: 創(chuàng)建寫者的互斥信號(hào)量,初值為1WriteMutex: 創(chuàng)建讀者的互斥信號(hào)量,初值為1z: 初值為1的互斥信號(hào)量,在至少有一個(gè)寫著準(zhǔn)備訪問(wèn)數(shù)據(jù)、且后面已經(jīng)來(lái)一個(gè)讀者時(shí)再來(lái)的讀者將在這個(gè)信號(hào)量上等待rifrrst:讀者計(jì)數(shù)變量,初值為0wfirst:寫者計(jì)數(shù)變量,初值為0寫者優(yōu)先的PV原語(yǔ):reader(i):P(z);P(r

9、sem);P(ReadMutex);rfirst=rfirst+1;if(rfirst=1)P(wsem);V(ReadMutex);V(rsem);V(z);讀取所需數(shù)據(jù);P(ReadMutex);rfirst=rfirst-1;if(rfirst=0)V(wsem);V(ReadMutex);Writer():P(WriteMutex);wfirst=wfirst+1;if(wfirst=1)P(rsem);V(WritedMutex);P(wsem);改寫所需數(shù)據(jù);V(wsem);P(WriteMutex);wfirst=wfirst-1;if(wfirst=0)V(rsem);V(Wr

10、iteMutex);讀者 寫者圖3.1讀者-寫者的完整流程框圖(5)讀者優(yōu)先與寫者優(yōu)先算法相反,有一個(gè)讀者優(yōu)先的算法,即只要有讀者在讀數(shù)據(jù),寫者被拒絕在臨界區(qū)外面,如果有源源不斷的寫者來(lái),但是只要寫者不是第一個(gè),那么寫者將會(huì)永遠(yuǎn)被拒絕在臨界區(qū)外面。wrt::初值為1的互斥信號(hào)量,只要有一個(gè)寫者訪問(wèn)數(shù)據(jù), 則其他寫者和讀者就要被阻止對(duì)數(shù)據(jù)的訪問(wèn)。mutex:保證讀者互斥操作first的信號(hào)量,初值為1first :讀者計(jì)數(shù)變量,初值為0讀者優(yōu)先的PV原語(yǔ):write():P(wrt);對(duì)數(shù)據(jù)進(jìn)行修改;V(wrt);read():P(mutex);first = first+1;if(first

11、= 1)P(wrt);V(mutex);讀取所需數(shù)據(jù)P(mutex);first = first+1;if(first = 0)V(wrt);V(mutex);四、概要設(shè)計(jì)(1)控制流程用CheckPersonList(PersonLists)函數(shù)檢查PersonLists中是否有為創(chuàng)建的進(jìn)程(讀寫者)。如果有則創(chuàng)建相應(yīng)的讀寫線程(2)創(chuàng)建讀寫者用bool CreateReader(int StartTime,int WorkTime)函數(shù)創(chuàng)建讀者寫者相應(yīng)的線程,其中由windows提供的函數(shù)為CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&

12、dwThreadID);返回的是DWORD型變量。在CreateReader(int StartTime,int WorkTime)中還會(huì)初始化相應(yīng)的讀寫者的基本信息,例如何時(shí)申請(qǐng)數(shù)據(jù)何時(shí)讀數(shù)據(jù)何時(shí)關(guān)閉線程等等。(3)讀寫者進(jìn)程參見圖2.1讀者-寫者的完整流程圖。(4)同步與互斥WaitForSingleObject(信號(hào)量名字,infinite)和ReleaseSemaphore(信號(hào)量名字,1,null)用于實(shí)現(xiàn)同步于互斥,執(zhí)行WaitForSingleObject(信號(hào)量名字,infinite)信號(hào)量相應(yīng)的信號(hào)量減1,執(zhí)行ReleaseSemaphore(信號(hào)量名字,1,null)恢復(fù)1

13、。五、代碼及流程/寫者優(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 typedef struct _PersonHANDLE Thread;int Type;int StartTime;int WorkTime;int ID;Person; Person PersonsMAX_PERSON;int NumPerson = 0;l

14、ong CurrentTime= 0; int PersonLists = 1,R,1,3,2,W,2,5,/*讀寫互斥*/3,W,5,5,/*寫寫互斥*/4,R,3,5,/*寫讀互斥*/5,R,15,2,/*讀讀不互斥*/END,; int rfirst = 0;int wfirst = 0;int NumOfReaders = 0;int NumOfWriters = 0;HANDLE rsem;/*初值為1的互斥信號(hào)量,在至少有一個(gè)寫者準(zhǔn)備訪問(wèn)數(shù)據(jù)時(shí)就不允許隨后來(lái)的讀者訪問(wèn)數(shù)據(jù)*/HANDLE wsem;/*初值為1的互斥信號(hào)量,之后有一個(gè)寫者訪問(wèn)數(shù)據(jù)時(shí)其他寫者和讀者就被阻止對(duì)數(shù)據(jù)的訪問(wèn)

15、*/HANDLE z;/*初值為1的互斥信號(hào)量,在至少有一個(gè)寫著準(zhǔn)備訪問(wèn)數(shù)據(jù)、且后面已經(jīng)來(lái)一個(gè)讀者時(shí)再來(lái)的讀者將在這個(gè)信號(hào)量上等待*/HANDLE ReadMutex;/*創(chuàng)建寫者的互斥信號(hào)量,初值為1*/HANDLE WriteMutex;/*創(chuàng)建讀者的互斥信號(hào)量, 初值為1*/ void CheckPersonList(int *pPersonList);/*查看人數(shù),為創(chuàng)建讀寫者線程*/bool CreateReader(int StartTime,int WorkTime);bool CreateWriter(int StartTime,int WorkTime);DWORD WINA

16、PI ReaderProc(LPVOID lpParam);/*讀者進(jìn)程程序*/DWORD WINAPI WriterProc(LPVOID lpParam);/*寫著進(jìn)程程序*/#include Writerprior.hint main()rsem= CreateSemaphore(NULL,1,1,NULL);wsem= CreateSemaphore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphor

17、e(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=20)break;system(pause);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0; void CheckPerso

18、nList(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;case W:P = CreateWriter(pList2,pList3);/創(chuàng)建一個(gè)寫者break;if(!P)printf(Create Person %d is wrongn,pList0);pList += 4; / 數(shù)組的指針指向第二個(gè)人

19、 DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfReaders;WaitForSingleObject(z,INFINITE);/P(z),其余讀者在此排隊(duì)printf(tt讀者 %d 申請(qǐng)讀數(shù)據(jù).n,pPerson-ID);WaitForSingleObject(rsem,INFINITE);/P(rsem),一個(gè)讀者與一個(gè)寫著再次競(jìng)爭(zhēng)數(shù)據(jù)的使用權(quán)/printf(Reader %d is requesting the Shared Buffer.n,pP

20、erson-ID); WaitForSingleObject(ReadMutex,INFINITE);/P(ReadMutex),讀者請(qǐng)求進(jìn)入rfirst臨界區(qū)rfirst+; if(rfirst = 1)/是否是第一個(gè)讀者 WaitForSingleObject(wsem,INFINITE);/讀者在此處與寫者進(jìn)行同步 ReleaseSemaphore(ReadMutex,1,NULL);/退出rfirst臨界區(qū),V(ReadMutex)ReleaseSemaphore(rsem,1,NULL);ReleaseSemaphore(z,1,NULL);/V(z)/ 讀取所需數(shù)據(jù),將現(xiàn)在時(shí)間賦值

21、給讀者,用以計(jì)算結(jié)束時(shí)間printf(tt讀者 %d 申請(qǐng)成功n,pPerson-ID);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);WaitForSingleObject(ReadMutex,INFINITE); rfirst-; if(rfirst = 0) /是最后一個(gè)讀者? ReleaseSemaphore(wsem,1

22、,NULL);/沒有讀者了,寫者放行 ReleaseSemaphore(ReadMutex,1,NULL);/退出讀者臨界區(qū) ExitThread(0);/關(guān)閉讀者線程return 0; DWORD WINAPI WriterProc(LPVOID lpParam)/寫者進(jìn)程程序Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfWriters; printf(tt寫者 %d 正在申請(qǐng)寫數(shù)據(jù).n,pPerson-ID); WaitForSingleObject(WriteMutex,INFINITE);/請(qǐng)求進(jìn)入寫者臨界區(qū)wfirst=w

23、first+;if(wfirst=1)WaitForSingleObject(rsem,INFINITE);/一個(gè)寫者在此與讀者取得同步ReleaseSemaphore(WriteMutex,1,NULL);/退出rfirst臨界區(qū)WaitForSingleObject(wsem,INFINITE);/其他寫者在此等候進(jìn)入寫臨界區(qū) / 讀取所需數(shù)據(jù),將現(xiàn)在時(shí)間賦值給讀者,用以計(jì)算結(jié)束時(shí)間pPerson-StartTime = CurrentTime; printf(tt寫者 %d 正在寫數(shù)據(jù).n,pPerson-ID);while(CurrentTime StartTime + pPerson

24、-WorkTime)/模擬寫數(shù)據(jù)printf(tt寫者 %d 寫完數(shù)據(jù)退出n,pPerson-ID);ReleaseSemaphore(wsem,1,NULL);/退出進(jìn)入寫臨界區(qū)WaitForSingleObject(WriteMutex,INFINITE);/請(qǐng)求進(jìn)入wfirst臨界區(qū)wfirst=wfirst-;if(wfirst=0)/是最后一個(gè)寫者?ReleaseSemaphore(rsem,1,NULL);/沒有寫者了,向讀者放行ReleaseSemaphore(WriteMutex,1,NULL);/退出wfirst臨界區(qū)ExitThread(0);/關(guān)閉寫者線程return 0

25、; bool CreateReader(int StartTime,int WorkTime)DWORD dwThreadID;Person *pPerson = &PersonsNumPerson;pPerson-StartTime= StartTime;pPerson-WorkTime= WorkTime;pPerson-Type= READER; NumPerson+; / 創(chuàng)建一個(gè)讀者的新線程pPerson-Thread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-Thread =

26、 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-Thread = CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThread

溫馨提示

  • 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ù)覽,若沒有圖紙預(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)論