操作系統讀者與寫者問題課程設計報告_第1頁
操作系統讀者與寫者問題課程設計報告_第2頁
操作系統讀者與寫者問題課程設計報告_第3頁
操作系統讀者與寫者問題課程設計報告_第4頁
操作系統讀者與寫者問題課程設計報告_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 沈陽理工大學課程設計專用紙 no1課程設計任務書學 院信息學院專 業計算機科學與技術學 生 姓 名學 號題 目讀者與寫者問題(進程同步問題)內容及要求:內容:讀者與寫者問題(進程同步問題)實驗目的:了解進程同步的概念,理解信號量機制的原理,掌握信號量解決同步問題的方法,進而學會進程的同步與互斥。設計要求:編程模擬教材中討論讀者與寫者的問題,要求能顯示結果。任務交付:1.程序源代碼;2課程設計論文及電子文檔。進度安排:16周確定題目,查找資料,上機編程;20周上機編程調試,驗收答辯,提交課程序設計報告書。指導教師(簽字):年 月 日學院院長(簽字):年 月 日目 錄一、課程設計目的及要求1二、

2、相關知識1三、題目分析2四、概要設計4五、代碼及流程5六、運行結果11七、設計心得12八、參考文獻1212一、課程設計目的及要求讀者與寫者問題(進程同步問題)用n 個線程來表示n個讀者或寫者。每個線程按相應測試數據文件的要求,進行讀寫操作。請用信號量機制分別實現讀者優先和寫者優先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制:1)寫-寫互斥;2)讀-寫互斥;3)讀-讀允許;寫者優先的附加限制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到沒有寫者處于等待狀態后才能開始讀操作。二、相關知識windows api:在本實驗中涉及的api 有:1線程控制:createt

3、hread 完成線程創建,在調用進程的地址空間上創建一個線程,以執行指定的函數;它的返回值為所創建線程的句柄。handle createthread(lpsecurity_attributes lpthreadattributes, / sddword dwstacksize, / initial stack sizelpthread_start_routine lpstartaddress, / threadfunctionlpvoid lpparameter,/ thread argumentdword dwcreationflags, / creation optionlpdword l

4、pthreadid / thread identifier);2 exitthread 用于結束當前線程。void exitthread(dword dwexitcode / exit code for this thread);3 sleep 可在指定的時間內掛起當前線程。void sleep(dword dwmilliseconds / sleep time);4信號量控制:waitforsingleobject 可在指定的時間內等待指定對象為可用狀態;dword waitforsingleobject(handle hhandle, / handle to objectdword dwm

5、illiseconds / time-out interval);hhandle為等待的對象,也就是實現同步或者互斥的對象。該函數一執行,相應的信號量就減去1,如果信號量小于等于0,那么他一直在循環。5 實現信號量互斥和同步createsemaphore用于創建信號量,根據參數的不同可以利用它實現互斥和同步。releasesemaphore用于釋放信號量,使用后相應的信號量加1handle createsemaphore(lpsecurity_attributes lpsemaphoreattributes,/sdlong,linitialcount,/initial countlong,lm

6、aximumcount,/maximum countlpctstr lpname/object name);releasesemaphore(handle hsemaphore, /handle to semaphorelong lrelseasecount,/cont increment amountlplong lppreviouscount/previous count);三、題目分析將所有的讀者和所有的寫者分別放進兩個等待隊列中,當讀允許時就讓讀者隊列釋放一個或多個讀者,當寫允許時,釋放第一個寫者操作。(1)構筑讀者進程和寫者進程間的臨界區題目中說的一批數據被多個讀者、寫者共享使用,允

7、許多個讀者同時訪問這些數據,但是如果有一個寫者在訪問數據時,就不允許其他讀者或寫者使用,所以,對這一批數據既要保證讀者和寫者互斥使用,也要保證寫者與寫者互斥使用。也就是說,在讀者進程程序中,使用數據的程序段應該構成臨界區;在寫者進程程序中,使用數據的程序段應該構成臨界區。(2)判定是否是第一個讀者根據上面的分析,希望在讀者進程中有一個辦法能判定請求進入臨界區的是否是第一個讀者。如果是第一個讀者,就對信號量wsem做p操作,以取得和寫者的同步。為此,設置一個變量rfirst,初值為0.任何一個讀者運行時,都現在rfirst上加1,然后判定他是否取值為1.如果是1,則做p(wrt),否則不做。(3

8、)判定是否是第一個寫者原理同(2)判定是否為第一個讀者。(4)寫者優先問題的解決需要用到的如下的信號量和變量rsem: 初值為1的互斥信號量,在至少有一個寫者準備訪問數據時就不允許隨后來的讀者訪問數據wserm: 初值為1的互斥信號量,之后有一個寫者訪問數據時其他寫者和讀者就被阻止對數據的訪問readmutex: 創建寫者的互斥信號量,初值為1writemutex: 創建讀者的互斥信號量,初值為1z: 初值為1的互斥信號量,在至少有一個寫著準備訪問數據、且后面已經來一個讀者時再來的讀者將在這個信號量上等待rifrrst:讀者計數變量,初值為0wfirst:寫者計數變量,初值為0寫者優先的pv原

9、語:reader(i):p(z);p(rsem);p(readmutex);rfirst=rfirst+1;if(rfirst=1)p(wsem);v(readmutex);v(rsem);v(z);讀取所需數據;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);改寫所需數據;v(wsem);p(writemutex);wfirst=wfirst-1;if(w

10、first=0)v(rsem);v(writemutex);讀者 寫者圖3.1讀者-寫者的完整流程框圖(5)讀者優先與寫者優先算法相反,有一個讀者優先的算法,即只要有讀者在讀數據,寫者被拒絕在臨界區外面,如果有源源不斷的寫者來,但是只要寫者不是第一個,那么寫者將會永遠被拒絕在臨界區外面。wrt::初值為1的互斥信號量,只要有一個寫者訪問數據, 則其他寫者和讀者就要被阻止對數據的訪問。mutex:保證讀者互斥操作first的信號量,初值為1first :讀者計數變量,初值為0讀者優先的pv原語:write():p(wrt);對數據進行修改;v(wrt);read():p(mutex);first

11、 = first+1;if(first = 1)p(wrt);v(mutex);讀取所需數據p(mutex);first = first+1;if(first = 0)v(wrt);v(mutex);四、概要設計(1)控制流程用checkpersonlist(personlists)函數檢查personlists中是否有為創建的進程(讀寫者)。如果有則創建相應的讀寫線程(2)創建讀寫者用bool createreader(int starttime,int worktime)函數創建讀者寫者相應的線程,其中由windows提供的函數為createthread(null,0,readerproc

12、,(lpvoid)pperson,0,&dwthreadid);返回的是dword型變量。在createreader(int starttime,int worktime)中還會初始化相應的讀寫者的基本信息,例如何時申請數據何時讀數據何時關閉線程等等。(3)讀寫者進程參見圖2.1讀者-寫者的完整流程圖。(4)同步與互斥waitforsingleobject(信號量名字,infinite)和releasesemaphore(信號量名字,1,null)用于實現同步于互斥,執行waitforsingleobject(信號量名字,infinite)信號量相應的信號量減1,執行releasesemaph

13、ore(信號量名字,1,null)恢復1。五、代碼及流程/寫者優先算法#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

14、;int numperson = 0;long 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的互斥信號量,在至少有一個寫者準備訪問數據時就不允許隨后來的讀者訪問數據*/handle wsem;/*初值為1的互斥信號量,之后有一個寫者訪問

15、數據時其他寫者和讀者就被阻止對數據的訪問*/handle z;/*初值為1的互斥信號量,在至少有一個寫著準備訪問數據、且后面已經來一個讀者時再來的讀者將在這個信號量上等待*/handle readmutex;/*創建寫者的互斥信號量,初值為1*/handle writemutex;/*創建讀者的互斥信號量, 初值為1*/ void checkpersonlist(int *ppersonlist);/*查看人數,為創建讀寫者線程*/bool createreader(int starttime,int worktime);bool createwriter(int starttime,int

16、worktime);dword winapi readerproc(lpvoid lpparam);/*讀者進程程序*/dword winapi writerproc(lpvoid lpparam);/*寫著進程程序*/#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); writem

17、utex= createsemaphore(null,1,1,null);currenttime = 0;while(true)/模擬20個時鐘周期checkpersonlist(personlists);currenttime+;sleep(600);printf(當前時間 = %d:n,currenttime);if(currenttime=20)break;system(pause);closehandle(rsem);closehandle(wsem);closehandle(z);closehandle(readmutex);closehandle(writemutex);retur

18、n 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);/創建一個讀者break;case w:p = createwriter(plist2,plist3);/創建一個寫者break;if(!p)printf(create person %d is wrongn,plist0);plist

19、 += 4; / 數組的指針指向第二個人 dword winapi readerproc(lpvoid lpparam)person *pperson = (person*)lpparam;pperson-id = +numofreaders;waitforsingleobject(z,infinite);/p(z),其余讀者在此排隊printf(tt讀者 %d 申請讀數據.n,pperson-id);waitforsingleobject(rsem,infinite);/p(rsem),一個讀者與一個寫著再次競爭數據的使用權/printf(reader %d is requesting th

20、e shared buffer.n,pperson-id); waitforsingleobject(readmutex,infinite);/p(readmutex),讀者請求進入rfirst臨界區rfirst+; if(rfirst = 1)/是否是第一個讀者 waitforsingleobject(wsem,infinite);/讀者在此處與寫者進行同步 releasesemaphore(readmutex,1,null);/退出rfirst臨界區,v(readmutex)releasesemaphore(rsem,1,null);releasesemaphore(z,1,null);/

21、v(z)/ 讀取所需數據,將現在時間賦值給讀者,用以計算結束時間printf(tt讀者 %d 申請成功n,pperson-id);pperson-starttime = currenttime; printf(tt讀者 %d 正在讀數據.n,pperson-id);while(currenttime starttime + pperson-worktime)/ 模擬讀數據printf(tt讀者 %d 讀完數據退出n,pperson-id);waitforsingleobject(readmutex,infinite); rfirst-; if(rfirst = 0) /是最后一個讀者? rel

22、easesemaphore(wsem,1,null);/沒有讀者了,寫者放行 releasesemaphore(readmutex,1,null);/退出讀者臨界區 exitthread(0);/關閉讀者線程return 0; dword winapi writerproc(lpvoid lpparam)/寫者進程程序person *pperson = (person*)lpparam;pperson-id = +numofwriters; printf(tt寫者 %d 正在申請寫數據.n,pperson-id); waitforsingleobject(writemutex,infinite

23、);/請求進入寫者臨界區wfirst=wfirst+;if(wfirst=1)waitforsingleobject(rsem,infinite);/一個寫者在此與讀者取得同步releasesemaphore(writemutex,1,null);/退出rfirst臨界區waitforsingleobject(wsem,infinite);/其他寫者在此等候進入寫臨界區 / 讀取所需數據,將現在時間賦值給讀者,用以計算結束時間pperson-starttime = currenttime; printf(tt寫者 %d 正在寫數據.n,pperson-id);while(currenttime

24、 starttime + pperson-worktime)/模擬寫數據printf(tt寫者 %d 寫完數據退出n,pperson-id);releasesemaphore(wsem,1,null);/退出進入寫臨界區waitforsingleobject(writemutex,infinite);/請求進入wfirst臨界區wfirst=wfirst-;if(wfirst=0)/是最后一個寫者?releasesemaphore(rsem,1,null);/沒有寫者了,向讀者放行releasesemaphore(writemutex,1,null);/退出wfirst臨界區exitthrea

25、d(0);/關閉寫者線程return 0; bool createreader(int starttime,int worktime)dword dwthreadid;person *pperson = &personsnumperson;pperson-starttime= starttime;pperson-worktime= worktime;pperson-type= reader; numperson+; / 創建一個讀者的新線程pperson-thread = createthread(null,0,readerproc,(lpvoid)pperson,0,&dwthreadid)

26、;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+; / 創建一個寫者的新線程pperson-thread = createthread(null,0,writerproc,(lpvoid)pperson,0,&dwthre

溫馨提示

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

評論

0/150

提交評論