操作系統(tǒng)課程設(shè)計 讀者寫者問題_第1頁
操作系統(tǒng)課程設(shè)計 讀者寫者問題_第2頁
操作系統(tǒng)課程設(shè)計 讀者寫者問題_第3頁
操作系統(tǒng)課程設(shè)計 讀者寫者問題_第4頁
操作系統(tǒng)課程設(shè)計 讀者寫者問題_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

11、化臨界區(qū)對象EnterCriticalSection: 等待指定臨界區(qū)對象的所有權(quán)。 當(dāng)調(diào)用線程被賦予所有權(quán) 時,返回。LeaveCriticalSection: 該函數(shù)釋放指定臨界區(qū)對象的所有權(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;/進程類型(讀寫)StartTime;/開始時間 WorkTime;/運行時間 ID;/進程號Person;Person PersonsMAX_PERSON;intlongNumOfPerson = 0;CurrentTime= 0;/ 基本時間片數(shù)intPersonLists = / 進程隊列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;/ 申請寫進程的個數(shù)intHANDLE ReadSemaphore;/ 讀者信號 HANDLE WriteSemaphore;/ 寫者信號 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)建信號量,當(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)建信號量, 當(dāng)前可LPCTSTR lpNameSemaphore 對象的名字, 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)前時間 = CurrentTime= MAX_PERSON) return false;Person *pPerson = &PersonsNumOfPerson; pPerson-ID = ID;pPerson-StartTime = StartTime; pPerson-WorkTime = WorkTime;pPerson-Type = READER; NumOfPerson+;/ 新建進程 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+;/ 新建進程 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)/ 讀過程Person *pPerson = (Person *)lpParam;/ 等待啟動時間 while(CurrentTime != pPerson-StartTime)/讀操作還沒有到達執(zhí)行時間,則等待printf(Reader %d is Requesting .n,pPerson-ID); printf(nn*n);/等待寫者請求 /該語句在寫者優(yōu)先的時候是認(rèn)為寫者優(yōu)先級高于讀者,在有寫者的時候讀者 需要等候, 而在讀者優(yōu)先的時候, 不用判斷是否存在寫者, 有讀者時即開

22、始讀操作。while(NumOfWriteRequest != 0) /NumOfWriteRequest != 0 表示有寫者在等待,不能讀/ 等待 ReadSemaphore 讀信號 ,即當(dāng) ReadSemaphore 有信號時等待結(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ù)谝粋€讀者到了, 如果 WriteSemaphore 信號燈滅了, 說明有寫者在寫, 讀者必須等待,即互斥寫操作WaitForSingleObject(WriteSemaphore,INFINITE); NumOfReading+;V 操作/lpReleaseCount 參數(shù)表示要增加的數(shù)值/還有讀者,但是允許下一個讀進程讀取,相當(dāng)于 ReleaseSemaphore(ReadSemaphore,1,NULL); /*BOOL ReleaseSemaphore( HANDLE hSemapho

24、re,/lpPreviousCount 參數(shù)用于返回之前的計LONG lReleaseCount, 算值,如果不需要可以設(shè)置為 NULLLPLONG lpPreviousCount);*/ 啟動讀者 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);/ 此時沒有讀者,可以寫 ReleaseSemaphore(ReadSemaphore,1,NULL); if(pPerson-ID = 6 ) finished = true; / 所有的讀寫完成 ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person *)lpParam;/ 等待啟動時間 while(CurrentTime != pPerson-StartTime) printf(Writer %d is Requesting .n,pPerson-ID); printf(nn*n);NumOfWriteRequest+; /在寫者優(yōu)先的時候需要用自加來初始信號值,而在讀者優(yōu)先的時是通過讀者 操作來控制信號值WaitForSingleObject(WriteSemaphore,INFINITE);/ 啟動寫

溫馨提示

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

評論

0/150

提交評論