操作系統(tǒng)課程設(shè)計(jì) 讀者寫者問(wèn)題_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 讀者寫者問(wèn)題_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 讀者寫者問(wèn)題_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 讀者寫者問(wèn)題_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì) 讀者寫者問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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、計(jì)算機(jī)與信息學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告開(kāi)題報(bào)告1.2.3.4.5.該項(xiàng)課程設(shè)計(jì)的意義; 更加深入的了解讀者寫者問(wèn)題的算法; 加深對(duì)線程,進(jìn)程的理解; 加深對(duì)“線程同步”概念的理解,理解并應(yīng)用“信號(hào)量機(jī)制” 熟悉計(jì)算機(jī)對(duì)處理機(jī)的管理,了解臨界資源的訪問(wèn)方式; 了解 C+ 中線程的實(shí)現(xiàn)方式,研讀API。) 課程設(shè)計(jì)的任務(wù)多進(jìn)程 /線程編程:讀者 -寫者問(wèn)題。 設(shè)置兩類進(jìn)程 /線程,一類為讀者, 隨機(jī)啟動(dòng)讀者或?qū)懻撸?顯示讀者或?qū)懻邎?zhí)行狀態(tài); 隨著進(jìn)程 /線程的執(zhí)行,更新顯示;一類為寫者;三) 相關(guān)原理及算法描述;整體概況:該程序從大體上來(lái)分只有兩個(gè)模塊,即“讀者優(yōu)先”和“寫者優(yōu)先”模塊讀者優(yōu)先:如果

2、沒(méi)有寫者正在操作,則讀者不需要等待,用一個(gè)整型變量 readcount 記錄 讀者數(shù)目,用于確定是否釋放讀者線程, readcount 的初值為 0.當(dāng)線程開(kāi)始調(diào)入時(shí) . 每個(gè)讀者準(zhǔn)備讀 . 等待互斥信號(hào) ,保證對(duì) readcount 的訪問(wèn) ,修改互斥 .即 readcount+. 而當(dāng)讀者線程進(jìn)行讀操作時(shí) ,則讀者數(shù)目減少 (readcount-). 當(dāng) readcout=0 時(shí),說(shuō)明所 有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒寫者 (LeaveCriticalSection(&RP_Write);), 放互斥信號(hào) (ReleaseMutex(h_Mutex).還需要一個(gè)互斥對(duì)象 mutex 來(lái)

3、實(shí)現(xiàn)對(duì)全局變量 Read_count 修改時(shí)的互斥 . 外,為了實(shí)現(xiàn)寫 -寫互斥,需要增加一個(gè)臨界區(qū)對(duì)象Write 。當(dāng)寫者發(fā)出寫請(qǐng)求時(shí),必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。通過(guò)這種方法,可以實(shí)現(xiàn)讀-寫互斥, Read_count=1 時(shí)(即第一個(gè)讀者到來(lái)時(shí)) ,讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有 權(quán)寫者優(yōu)先:寫者優(yōu)先與讀者不同之處在于一旦一個(gè)寫者到來(lái),它應(yīng)該盡快對(duì)文件進(jìn)行寫 操作, 如果有一個(gè)寫者在等待, 則新到來(lái)的讀者不允許進(jìn)行讀操作。 為此應(yīng)當(dāng)填加 一個(gè)整形變量 write_count ,用于記錄正在等待的寫者的數(shù)目, write_count 的初值 為 0.當(dāng)線程開(kāi)始調(diào)入時(shí) . 只允許一個(gè)寫者

4、準(zhǔn)備讀 . 等待互斥信號(hào) ,保證對(duì) write_count 的訪問(wèn) , 修改互斥 . 即 write_count+. 而當(dāng)寫者線程進(jìn)行讀操作時(shí),則相應(yīng)寫者數(shù)目減少(wnte_count-).當(dāng)write_count=O時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒讀者 , 釋放互斥信號(hào) .為了實(shí)現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)填加一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫者在寫文件或等待時(shí),讀者必須阻塞在 read 上。四)開(kāi)發(fā)環(huán)境;VC+6.0五)預(yù)期設(shè)計(jì)目標(biāo);讀者-寫者問(wèn)題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先)1. 寫-寫互斥:不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作2. 讀-寫互斥:不能同時(shí)有一個(gè)線程在讀,而另一個(gè)線程在寫。3

5、. 讀-讀允許:可以有一個(gè)或多個(gè)讀者在讀。若讀者的優(yōu)先權(quán)比寫者高 , 如果讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在 進(jìn)行讀操作,則該讀者可直接開(kāi)始讀操作.不必經(jīng)過(guò)別的操件若讀者的優(yōu)先權(quán)比寫者高 ,如果第一個(gè)寫者已經(jīng)占有了文件的時(shí)候.則別的讀者必需等待該操作完成后 .才能開(kāi)始讀操作 .若寫者的優(yōu)先權(quán)比讀者高 , 在一個(gè)寫者提出要訪問(wèn)文件時(shí), 就必須使其盡可能 的得到文件,而且不用調(diào)配。完成課程設(shè)計(jì)的任務(wù),實(shí)現(xiàn)讀者寫者問(wèn)題的全部要求,同時(shí)可以實(shí)現(xiàn)“讀者 優(yōu)先”和“寫者優(yōu)先”兩種情況,有時(shí)間的話,爭(zhēng)取實(shí)現(xiàn)可視化圖形界面。課程設(shè)計(jì)報(bào)告一) 課程設(shè)計(jì)任務(wù)、要求、目的;任務(wù)和要求:多進(jìn)程 /線程編程:讀者

6、-寫者問(wèn)題。設(shè)置兩類進(jìn)程 /線程,一類為讀者,一類為寫者; 隨機(jī)啟動(dòng)讀者或?qū)懻撸?顯示讀者或?qū)懻邎?zhí)行狀態(tài);隨著進(jìn)程 /線程的執(zhí)行,更新顯示;更加深入的了解讀者寫者問(wèn)題的算法; 加深對(duì)線程,進(jìn)程的理解; 加深對(duì)“線程同步”概念的理解,理解并應(yīng)用“信號(hào)量機(jī)制” 熟悉計(jì)算機(jī)對(duì)處理機(jī)的管理,了解臨界資源的訪問(wèn)方式; 了解C+中線程的實(shí)現(xiàn)方式,研讀API。目的:1234) 原理及算法描述;寫者優(yōu)先原理圖:5讀者優(yōu)先原理圖:算法描述:讀者優(yōu)先的附加限制:如果讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)行讀 操作,則該讀者可直接開(kāi)始讀操作。寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)寫者在等待 訪

7、問(wèn)共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開(kāi)始讀操作。(三)開(kāi)發(fā)環(huán)境;VC+6.0(四) 重要算法和設(shè)計(jì)思路描述;整體概況:該程序從大體上來(lái)分只有兩個(gè)模塊,即“讀者優(yōu)先”和“寫者優(yōu)先”模塊讀者優(yōu)先:如果沒(méi)有寫者正在操作,則讀者不需要等待,用一個(gè)整型變量readco unt記錄讀者數(shù)目,用于確定是否釋放讀者線程,readcount的初值為0.當(dāng)線程開(kāi)始調(diào)入時(shí).每個(gè)讀者準(zhǔn)備讀.等待互斥信號(hào),保證對(duì)readcount的訪問(wèn),修改互斥.即readcount+. 而當(dāng)讀者線程進(jìn)行讀操作時(shí) ,則讀者數(shù)目減少(readcount-).當(dāng)readcout=0時(shí),說(shuō)明所 有的讀者都已經(jīng)讀完,離開(kāi)臨界

8、區(qū)喚醒寫者 (LeaveCriticalSection(&RP_Write);), 放互斥信號(hào) (ReleaseMutex(h_Mutex).還需要一個(gè)互斥對(duì)象 mutex 來(lái)實(shí)現(xiàn)對(duì)全局變量 Read_count 修改時(shí)的互斥 . 外,為了實(shí)現(xiàn)寫 -寫互斥,需要增加一個(gè)臨界區(qū)對(duì)象Write 。當(dāng)寫者發(fā)出寫請(qǐng)求時(shí),必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。通過(guò)這種方法,可以實(shí)現(xiàn)讀-寫互斥, Read_count=1 時(shí)(即第一個(gè)讀者到來(lái)時(shí)) ,讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有 權(quán)寫者優(yōu)先:寫者優(yōu)先與讀者不同之處在于一旦一個(gè)寫者到來(lái),它應(yīng)該盡快對(duì)文件進(jìn)行寫 操作, 如果有一個(gè)寫者在等待, 則新到來(lái)的讀者不允許

9、進(jìn)行讀操作。 為此應(yīng)當(dāng)填加 一個(gè)整形變量 write_count ,用于記錄正在等待的寫者的數(shù)目, write_count 的初值 為 0.當(dāng)線程開(kāi)始調(diào)入時(shí) . 只允許一個(gè)寫者準(zhǔn)備讀 . 等待互斥信號(hào) ,保證對(duì) write_count 的訪問(wèn) ,修改互斥 .即 write_count+. 而當(dāng)寫者線程進(jìn)行讀操作時(shí),則相應(yīng)寫者數(shù)目減少(wnte_count-).當(dāng)write_count=O時(shí),說(shuō)明所有的讀者都已經(jīng)讀完,離開(kāi)臨界區(qū)喚醒讀者 ,釋放互斥信號(hào) .為了實(shí)現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)填加一個(gè)臨界區(qū)對(duì)象read,當(dāng)有寫者在寫文件或等待時(shí),讀者必須阻塞在 read 上。五) 程序?qū)崿F(xiàn) -數(shù)據(jù)結(jié)構(gòu);相關(guān) W

10、indowsAPI 說(shuō)明 :CreateThread: 創(chuàng)建一個(gè)在調(diào)用進(jìn)程的地址空間中執(zhí)行的線程。ExitThreadSleep: 對(duì)指定的時(shí)間間隔掛起當(dāng)前的執(zhí)行線程CreateMutex: 創(chuàng)建有名或者無(wú)名的互斥對(duì)象ReleaseMutex:WaitForSingleObject: 當(dāng)發(fā)生 (1) 指定對(duì)象處于信號(hào)態(tài) (2)超時(shí) 則該函數(shù)返回 WaitForMultipleObject: 任意一個(gè)或全部指定對(duì)象處于信號(hào)態(tài)或超時(shí)間隔已過(guò) 時(shí),返回CreateSemapore: 創(chuàng)建一個(gè)有名或無(wú)名信號(hào)對(duì)象。ReleaseSemapore:InitializeCriticalSection: 初始

11、化臨界區(qū)對(duì)象EnterCriticalSection: 等待指定臨界區(qū)對(duì)象的所有權(quán)。 當(dāng)調(diào)用線程被賦予所有權(quán) 時(shí),返回。LeaveCriticalSection: 該函數(shù)釋放指定臨界區(qū)對(duì)象的所有權(quán)。六)程序?qū)崿F(xiàn) -程序清單;#include /#include /#include /#include /#include /#include #includeusing namespace std;#define#define#define#defineMAX_PERSONREADERWRITEREND/#define/#define100 /最多 100 人0 /讀者1 /寫者-1 /結(jié)束REA

12、DERWRITERtypedef structHANDLE m_hThread;/ 定義處理線程的句柄 intintintintTy pe;/進(jìn)程類型(讀寫)StartTime;/開(kāi)始時(shí)間 WorkTime;/運(yùn)行時(shí)間 ID;/進(jìn)程號(hào)Person;Person PersonsMAX_PERSON;intlongNumOfPerson = 0;CurrentTime= 0;/ 基本時(shí)間片數(shù)intPersonLists = / 進(jìn)程隊(duì)列1, WRITER, 3, 5,2, WRITER, 16, 5,3, READER, 2, 2,4, WRITER, 6, 5,5, READER, 4, 3,6

13、, READER, 17,7, END,;intNumOfReading = 0;NumOfWriteRequest = 0;/ 申請(qǐng)寫進(jìn)程的個(gè)數(shù)intHANDLE ReadSemaphore;/ 讀者信號(hào) HANDLE WriteSemaphore;/ 寫者信號(hào) bool finished = false; / 所有的讀完成 /bool wfinished = false; / 所有的寫完成CreatePersonList(int *pPersonList);CreateReader(int StartTime,int WorkTime,int ID); CreateWriter(int S

14、tartTime,int WorkTime,int ID); DWORD WINAPI ReaderProc(LPVOID lpParam);void boolboolDWORD WINAPI WriterProc(LPVOID lpParam);int main()ReadSemaphore = CreateSemaphore(NULL,1,100,NULL); / 創(chuàng)建信號(hào)量,當(dāng)前可用的資源數(shù)為1,最大為 100/*HANDLE CreateSemaphore(LPSECURITY_A TTRIBUTES /lpSemaphoreAttributes 為安全屬性LONG lInitialC

15、ount,Sema phore的初始值LONG lMaximumCount,為最大值lpSemaphoreAttributes,/lInitialCount 為/lMaximumCount/lpName 為創(chuàng)建信號(hào)量, 當(dāng)前可LPCTSTR lpNameSemaphore 對(duì)象的名字, NULL 表示創(chuàng)建匿名 Semaphore);*/WriteSemaphore = CreateSemaphore(NULL,1,100,NULL); / 用的資源數(shù)為 1,最大為 100CreatePersonList(PersonLists); / 創(chuàng)建所有讀者寫者cout 創(chuàng)建所有的讀者寫者 n.n;Cu

16、rrentTime = 0;while(true)CurrentTime+;Sleep(300); / 300 mscout 當(dāng)前時(shí)間 = CurrentTime= MAX_PERSON) return false;Person *pPerson = &PersonsNumOfPerson; pPerson-ID = ID;pPerson-StartTime = StartTime; pPerson-WorkTime = WorkTime;pPerson-Type = READER; NumOfPerson+;/ 新建進(jìn)程 pPerson-m_hThread=CreateThread(NULL

17、,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);/*HANDLE CreateThread(LPSECURITY_A TTRIBUTES lpThreadAttributes, / pointer to security attributes 安全屬性/ initial thread stack sizeDWORD dwStackSize, 堆棧大小/ pointer to threadLPTHREAD_START_ROUTINE lpStartAddress,/ argument for new thread/ creation flags/ poi

18、nter to receive threadfunction 函數(shù)指針 LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadIdID);*/if(pPerson-m_hThread = NULL) return false;return true;bool CreateWriter(int StartTime,int WorkTime,int ID) DWORD dwThreadID; if(NumOfPerson = MAX_PERSON)return false;Person *pPerson = &PersonsNumOf

19、Person; pPerson-ID = ID;pPerson-StartTime = StartTime; pPerson-WorkTime = WorkTime; pPerson-Type = WRITER;NumOfPerson+;/ 新建進(jìn)程 pPerson-m_hThread=CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);/*HANDLE CreateThread(LPSECURITY_A TTRIBUTES lpThreadAttributes, / pointer to security attribu

20、tes 安全屬性/ initial thread stack sizeDWORD dwStackSize, 堆棧大小/ pointer to thread/ argument for new thread/ creation flags/ pointer to receive threadLPTHREAD_START_ROUTINE lpStartAddress, function 函數(shù)指針LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadIdID);*/ if(pPerson-m_hThread = NULL) return f

21、alse;return true;DWORD WINAPI ReaderProc(LPVOID lpParam)/ 讀過(guò)程Person *pPerson = (Person *)lpParam;/ 等待啟動(dòng)時(shí)間 while(CurrentTime != pPerson-StartTime)/讀操作還沒(méi)有到達(dá)執(zhí)行時(shí)間,則等待printf(Reader %d is Requesting .n,pPerson-ID); printf(nn*n);/等待寫者請(qǐng)求 /該語(yǔ)句在寫者優(yōu)先的時(shí)候是認(rèn)為寫者優(yōu)先級(jí)高于讀者,在有寫者的時(shí)候讀者 需要等候, 而在讀者優(yōu)先的時(shí)候, 不用判斷是否存在寫者, 有讀者時(shí)即開(kāi)

22、始讀操作。while(NumOfWriteRequest != 0) /NumOfWriteRequest != 0 表示有寫者在等待,不能讀/ 等待 ReadSemaphore 讀信號(hào) ,即當(dāng) ReadSemaphore 有信號(hào)時(shí)等待結(jié)束, 相當(dāng)于 p 操作WaitForSingleObject(ReadSemaphore,INFINITE);/ pointer to the object-handle array / time-out interval in milliseconds/*DWORD WaitForMultipleObjects( CONST HANDLE *lpHandle

23、s, DWORD dwMilliseconds);*/ if(NumOfReading = 0) /當(dāng)?shù)谝粋€(gè)讀者到了, 如果 WriteSemaphore 信號(hào)燈滅了, 說(shuō)明有寫者在寫, 讀者必須等待,即互斥寫操作WaitForSingleObject(WriteSemaphore,INFINITE); NumOfReading+;V 操作/lpReleaseCount 參數(shù)表示要增加的數(shù)值/還有讀者,但是允許下一個(gè)讀進(jìn)程讀取,相當(dāng)于 ReleaseSemaphore(ReadSemaphore,1,NULL); /*BOOL ReleaseSemaphore( HANDLE hSemapho

24、re,/lpPreviousCount 參數(shù)用于返回之前的計(jì)LONG lReleaseCount, 算值,如果不需要可以設(shè)置為 NULLLPLONG lpPreviousCount);*/ 啟動(dòng)讀者 pPerson-StartTime = CurrentTime;printf(Reader %d is Reading the Critical Section.n,pPerson-ID); printf(nn*n); while(CurrentTime StartTime + pPerson-WorkTime) / . 執(zhí)行讀操作 printf(Reader %d is Exit.n,pPers

25、on-ID); printf(nn*n); WaitForSingleObject(ReadSemaphore,INFINITE);NumOfReading-; if(NumOfReading = 0) ReleaseSemaphore(WriteSemaphore,1,NULL);/ 此時(shí)沒(méi)有讀者,可以寫 ReleaseSemaphore(ReadSemaphore,1,NULL); if(pPerson-ID = 6 ) finished = true; / 所有的讀寫完成 ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person *)lpParam;/ 等待啟動(dòng)時(shí)間 while(CurrentTime != pPerson-StartTime) printf(Writer %d is Requesting .n,pPerson-ID); printf(nn*n);NumOfWriteRequest+; /在寫者優(yōu)先的時(shí)候需要用自加來(lái)初始信號(hào)值,而在讀者優(yōu)先的時(shí)是通過(guò)讀者 操作來(lái)控制信號(hào)值WaitForSingleObject(WriteSemaphore,INFINITE);/ 啟動(dòng)寫

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論