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

下載本文檔

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

文檔簡介

1、. . . . 操作系統課程設計報告題 目:讀者寫者問題 學 院: 專 業: 班 級: 學 號: 姓 名: 指導老師: 目 錄一設計概述3二設計目的與容4三 設計分析5四程序實現6五程序調試7六結果分析和討論7七心得體會8八 源代碼 8九 實驗截圖14一設計概述所謂讀者寫者問題,是指保證一個writer進程必須與其他進程互斥地訪問共享對象的同步問題。讀者寫者問題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是,只能有一個寫者在寫書,并且,讀者必寫者優先,也就是說,讀者和寫者同時提出請求時,讀者優先。當讀者提出請求時需要有一個互斥操作,另外

2、,需要有一個信號量S來當前是否可操作。信號量機制是支持多道程序的并發操作系統設計中解決資源共享時進程間的同步與互斥的重要機制,而讀者寫者問題則是這一機制的一個經典例。與記錄型信號量解決讀者寫者問題不同,信號量機制它增加了一個限制,即最多允許RN個讀者同時讀。為此,又引入了一個信號量L,并賦予初值為RN,通過執行wait(L,1,1)操作,來控制讀者的數目,每當有一個讀者進入時,就要執行wait(L,1,1)操作,使L的值減1。當有RN個讀者進入讀后,L便減為0,第RN+1 個讀者要進入讀時,必然會因wait(L,1,1)操作失敗而堵塞。對利用信號量來解決讀者寫者問題的描述如下:Var RN i

3、nteger;L,mx:semaphore: =RN,1;BeginParbegin Reader :begin Repeat Swait(L,1,1); Swait(mx,1,0); . Perform reader operation; Ssignal(L,1);Until false; EndWriter :begin RepeatSwait(mx ,1,1,l,RN,0);Perform writer operation;Ssignal(mx,1);Until false;EndParendEnd其中,Swait(mx,1,0)語句起著開關作用,只要無Writer進程進入些,mx=1,

4、reader進程就都可以進入讀。但是要一旦有Writer進程進入寫時,其MX=0,則任何reader進程就都無法進入讀。Swait(mx ,1,1,l,RN,0)語句表示僅當既無Write進程在寫(mx=1),又無reader進程在讀(L=RN)時,writer進程才能進入臨界區寫。本設計方案就是通過利用記錄型信號量對讀者寫者問題的解決過程進行模擬演示,形象地闡述記錄型信號量機制的工作原理。二 設計目的與容一 實驗目的l. 用信號量來實現讀者寫者問題。2.理解和運用信號量、PV原語、進程間的同步互斥關系等基本知識。二、二實驗容讀者寫者問題的定義如下:有一個許多進程共享的數據區,這個數據區可以是

5、一個文件或者主存的一塊空間;有一些只讀取這個數據區的進程(Reader)和一些只往數據區寫數據的進程(Writer),此外還需要滿足以下條件:(1) 任意多個讀進程可以同時讀這個文件;(2) 一次只有一個寫進程可以往文件中寫;(3) 如果一個寫進程正在進行操作,禁止任何讀進程度文件。我們需要分兩種情況實現該問題:讀優先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。三設計分析在Windows 7 環境下,創建一個包含n 個

6、線程的控制臺進程。用這n 個線程來表示n個讀者或寫者。每個線程按相應測試數據文件的要求,進行讀寫操作。請用信號量機制分別實現讀者優先和寫者優先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制:讀者-寫者的讀寫限制(包括讀者優先和寫者優先)1)寫-寫互斥,即不能有兩個寫者同時進行寫操作2)讀-寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫3)讀讀允許,即可以有2個以上的讀者同時讀將所有的讀者和所有的寫者分別放進兩個等待隊列中,當讀允許時就讓讀者隊列釋放一個或多個讀者,當寫允許時,釋放第一個寫者操作。讀者寫者問題的定義如下:有一個許多進程共享的數據區,這個數據區可以是一個文件或者主存的一塊空

7、間;有一些只讀取這個數據區的進程(Reader)和一些只往數據區寫數據的進程(Writer),此外還需要滿足以下條件:1)任意多個讀進程可以同時讀這個文件;2) 一次只有一個寫進程可以往文件中寫;3)如果一個寫進程正在進行操作,禁止任何讀進程度文件。我們需要分兩種情況實現該問題:讀優先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。寫優先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。四 程序實現程序由兩部分組成:1。讀者-寫者模塊:包括系統調用接口,讀者-寫者活動描述主程序

8、。系統接口主要功能是通過管道向父進程發送系統調用命令,并讀取父進程送來的返回值。讀者-寫者活動程序根據臨界資源的共享,互斥原則編制,具體見源程序。2。主控模塊:主控模塊實現系統初始化系統調用命令接收與解釋執行,系統調用功能的實現(包括信號量機制),與讀者-寫者活動過程記錄與顯示。初始化系統環境建立通信管道 啟動讀者-寫者進程接收系統調用命令解釋執行系統初始化模塊管道建立模塊進程啟動模塊命令解釋模塊Wait()Signal()Wakeup()Block()五程序調試測試數據文件格式:測試數據文件包括n 行測試數據,分別描述創建的n 個線程是讀者還是寫者,以與讀寫操作的開始時間和持續時間。每行測試

9、數據包括四個字段,各字段間用空格分隔。第一字段為一個正整數,表示線程序號。第二字段表示相應線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數,表示讀寫操作的開始時間。線程創建后,延時相應時間(單位為秒)后發出對共享資源的讀寫申請。第四字段為一個正數,表示讀寫操作的持續時間。當線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續相應時間后結束,并釋放共享資源。六結果分析和討論在讀者寫者同時在隊列中等待申請資時,讀者優先調用資源。而且如果一個讀者申請進行讀操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作,即讀讀允許。進程1是R操作,在時間3時進入隊列,運行時間是5,在它進入時

10、沒有進程占用資源,它既占用資源;知道它釋放資源,等候的進程有3,4,5;進程2是W操作,在時間16時進入隊列,運行時間是5,在它進入時進程4占用資源,它等待資源,當4釋放時占用資源;進程3是R操作,在時間5時進入隊列,運行時間是2,在它進入時進程1占用資源,它等待資源,當進程1釋放資源后,由于讀者優先,進程3,5同時調運資源;進程4是R操作,在時間6時進入隊列,運行時間是5,在它進入時進程1占用資源,它等待資源,當進程1釋放資源后,由于讀者優先,進程3,5占用資源,它依然等待,直到進程3,5都結束;進程5是W操作,在時間4時進入隊列,運行時間是3, 在它進入時進程1占用資源,它等待資源,當進程

11、1釋放資源后,由于讀者優先,進程3,5同時調運資源;七心得體會這一次課程設計,讓我體會很深刻。讀者-寫者問題經典的線程同步問題的一個模型。經過讀者寫者問題的編寫,我對同步機構應用有了深入的了解。懂得了運用信號量實現進程間的互斥。實現了不讓共享資源同時修改。用信號量上的原語操作使臨界段問題的解決比較簡單明了了。讀者寫者問題的編寫,花的時間很多,也學到很多東西。了解支持多道程序的并發操作系統設計中解決資源共享時進程間的同步與互斥的信號量機制。幾天的試驗,雖然難度有點大,但只要自己花時間去學習,還是會攻克困難的。總之,每一次課程設計不僅是我們學習的好機會,而且是我們鍛煉實際動手能力的平臺,雖然有難度

12、的東西總會讓人很抵觸,比如在課設過程中有很多郁悶的時候,一個小小的錯誤一不小心就花去了自己一上午的時間,所以在這個過程中能夠磨練人的意志與耐心,最后感鄒云康老師的指導與監督。八 源代碼#include #include #include #include #include #include #define MAX_PERSON 100#define READER 0 /讀者#define WRITER 1 /寫者#define END -1#define R READER#define W WRITERtypedef struct _PersonHANDLE m_hThread;/定義處理線程

13、的句柄int m_nType;/進程類型(讀寫)int m_nStartTime;/開始時間int m_nWorkTime;/運行時間int m_nID;/進程號Person;Person g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 0;/基本時間片數int g_PersonLists = /進程隊列1, R, 3, 5, 2, W, 4, 5, 3, R, 5, 2,4, R, 6, 5, 5, W, 5.1, 3, END,;int g_NumOfReading = 0;int g_NumOfWriteReques

14、t = 0;/申請寫進程的個數HANDLE g_hReadSemaphore;/讀者信號HANDLE g_hWriteSemaphore;/寫者信號bool finished = false; /所有的讀完成/bool wfinished = false; /所有的寫完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI Reade

15、rProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main()g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /創建信號燈,當前可用的資源數為1,最大為100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /創建信號燈,當前可用的資源數為1,最大為100CreatePersonList(g_PersonLists); / Create All the reader and writersprint

16、f(Created all the reader and writern.n);g_CurrentTime = 0;while(true)g_CurrentTime+;Sleep(300); / 300 msprintf(CurrentTime = %dn,g_CurrentTime);if(finished) return 0; / return 0;void CreatePersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool Ret;while(pList0 != END)switch(pList1)case

17、R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654break; case W:Ret = CreateWriter(pList2,pList3,pList0);break;if(!Ret)printf(Create Person %d is wrongn,pList0);pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam)/讀過程Person *pPerson = (Person*)lpParam;/ wait for th

18、e start timewhile(g_CurrentTime != pPerson-m_nStartTime) printf(Reader %d is Requesting .n,pPerson-m_nID);printf(nn*n);/ wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;ReleaseSemaphore(g_

19、hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTime;printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_nID);printf(nn*n);while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Reader %d is Exit.n,pPerson-m_nID);printf(nn*n);WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOf

20、Reading-;if(g_NumOfReading = 0)ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此時沒有讀者,可以寫ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true; /所有的讀寫完成ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhil

21、e(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d is Requesting .n,pPerson-m_nID);printf(nn*n);WaitForSingleObject(g_hWriteSemaphore,INFINITE);/ modify the writers real start timepPerson-m_nStartTime = g_CurrentTime;printf(Writer %d is Writting the Shared Buffer.n,pPerson-m_nID);while(g_Curre

22、ntTime m_nStartTime + pPerson-m_nWorkTime)printf(Writer %d is Exit.n,pPerson-m_nID);printf(nn*n);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true;/所有的讀寫完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON)return false;Person *pPerson = &

溫馨提示

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

評論

0/150

提交評論