進程同步模擬設計——讀者和寫者問題_第1頁
進程同步模擬設計——讀者和寫者問題_第2頁
進程同步模擬設計——讀者和寫者問題_第3頁
進程同步模擬設計——讀者和寫者問題_第4頁
進程同步模擬設計——讀者和寫者問題_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、學 號: 課 程 設 計題 目進程同步模擬設計讀者和寫者問題 學 院 計算機科學與技術學院專 業、班 級、姓 名、指導教師吳利軍2013年01月17日課程設計任務書學生姓名: 指導教師: 吳利軍 工作單位: 計算機科學與技術學院 題 目: 進程同步模擬設計讀者和寫者問題 初始條件:1預備內容:閱讀操作系統的進程管理章節內容,對進程的同步和互斥,以及信號量機制度有深入的理解。2實踐準備:掌握一種計算機高級語言的使用。要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)1模擬用信號量機制實現讀者和寫者問題。2設計報告內容應說明: 需求分析; 功能設計(數據結構及模塊說

2、明); 開發平臺及源程序的主要部分; 測試用例,運行結果與運行情況分析; 自我評價與總結:i)你認為你完成的設計哪些地方做得比較好或比較出色;ii)什么地方做得不太好,以后如何改正;iii)從本設計得到的收獲(在編寫,調試,執行過程中的經驗和教訓);iv)完成本題是否有其他方法(如果有,簡要說明該方法);時間安排:設計安排一周:周1、周2:完成程序分析及設計。周2、周3:完成程序調試及測試。周4、周5:驗收、撰寫課程設計報告。(注意事項:嚴禁抄襲,一旦發現,一律按0分記)指導教師簽名: 年 月 日系主任(或責任教師)簽名: 年 月 日1 需求分析所謂讀者寫者問題,是指保證一個 writer 進

3、程必須與其他進程互斥地訪問共享資源的同步問題.讀者寫者問題可以這樣的描述,有一群寫者和一群讀者, 寫者在寫同一本書,讀者也在讀這本書,多個讀者可以同時讀這本書,但是只能有一個寫者在寫書,并且讀者優先,也就是說,讀者和寫者同時提出請求時,讀者優先.當讀者提出請求時需要有一個互斥操作, 另外需要有一個信號量 mutex來當前是否可操作.信號量機制是支持多道程序的并發操作系統設計中解決資源共享時進程間的同步與互斥的重要機制,而讀者寫者問題則是這一機制的一個經典范例. 與記錄型信號量解決讀者寫者問題不同,信號量機制它增加了一個限制,即最多允許n個讀者同時讀.為此引入了一個信號量Rcount,并賦予初值

4、為 0,通過執行Rcount+操作,來控制讀者的數目,每當有一個讀者進入時,就要執行Rcount+操作,使 Rcount 的值加1.讀者離開時Rcount-;當且僅當Rcount=0時,V(Wmutex),才能進行寫操作。對利用信號量來解決讀者寫者問題的描述如下:Wmutex表示讀寫的互斥信號量,初值:Wmutex =1; 公共變量Rcount表示“正在讀”的進程數,初值:Rcount =0; Rmutex:表示對Rcount的互斥操作,初值:Rmutex=1。main()int Wmutex=1;int Rmutex=1;int Rcount=0;cobeginread 1();read 2

5、();read 3();.write 1();write2 ();write3 ();.coendreadn()P(Rmutex);Rcount+;if (Rcount=1) P (Wmutex);V(Rmutex);讀P(Rmutex);Rcount-;if (Rcount=0)V(Wmutex);V(Rmutex);writen()P(Wmutex);寫V(Wmutex); 2功能設計2.1 設計目的 l. 用信號量來實現讀者寫者問題. 2 .理解和運用信號量,PV 原語,進程間的同步互斥關系等基本知識. 2.2設計內容 讀者寫者問題的定義如下:有一個許多進程共享的數據區,這個數據區可以

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

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

8、享的數據區,這個數據區可以是一個文件或者主存 的一塊空間;有一些只讀取這個數據區的進程(Reader)和一些只往數據區寫數 據的進程(Writer),此外還需要滿足以下條件:1)任意多個讀進程可以同時讀這 個文件;2) 一次只有一個寫進程可以往文件中寫;3)如果一個寫進程正在進行操作,禁止任何讀進程度文件.3開發平臺及源程序主要部分3.1開發平臺 Windows xp 系統下,VC+6.0開發3.2源程序主要部分結構體_Person如下typedef struct _Person HANDLE m_hThread;/定義處理線程的句柄 int m_nType;/進程類型(讀寫) int m_n

9、StartTime;/開始時間 int m_nWorkTime;/運行時間 int m_nID;/進程號 Person;main()函數(主線程)創建信號燈,當前可用的資源數為 1,最大為 100 :g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL)g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL)調用CreatePersonList()函數,設置線程同步間隔為1000ms,計算時間片。CreatePersonList(int *pPersonLists)函數根據*pPersonLists

10、隊列創建讀者/寫者。CreateReader(int StartTime,int WorkTime,int ID)函數創建與讀者有關的線程,并初始化g_Persons g_NumPersonCreateWriter(int StartTime,int WorkTime,int ID)函數創建與寫者有關的線程,并初始化g_Persons g_NumPerson DWORD WINAPI ReaderProc(LPVOID lpParam)和DWORD WINAPI WriterProc(LPVOID lpParam)分別與讀者和寫者對應的輔助線程函數。3.3程序流程圖CreatePersonLi

11、st()CreateWriter()CreateReader()WriterProc()ReaderProc()退出WRMain()4 測試用例和運行結果4.1測試用例int g_PersonLists = 1, W,1,3,2, W,3,1, 3, R,10,2, 4, W,6,3, 5, R,7,5,6, R,9,1, END, ; 4.2運行結果4.3運行結果分析進程1是寫操作,在時間片1進入隊列,運行時間3,在它進入時沒有進程占用資源,立即占用資源,直到釋放資源。在它占用資源時等待的進程有:2進程2是寫操作,在時間片3進入隊列,運行時間1,由于進程1在占用資源,所以等待進程1釋放資源。

12、在它占用資源時沒有等待的進程進程3是讀操作,在時間片10進入隊列,運行時間2,此時讀者5在占用資源,但由于可以多個讀者同時閱讀,所以讀者3也可以閱讀進程4是寫操作,在時間片6進入隊列,運行時間3,此時沒有進程占用資源,它可以立即占用資源,直到結束并釋放資源。在它占用資源時等待的進程有:5,6進程5是讀操作,在時間片7進入隊列,運行時間5,由于此時進程4在占用資源,所以等待進程4釋放資源。進程6是讀操作,在時間片9進入隊列,運行時間1,由于此時進程4在占用資源,所以等待進程4釋放資源。由于可以多個讀者同時閱讀,所以讀者3,5,6在時間片10同時閱讀。5自我評價與總結通過這次操作系統的課程設計,我

13、研究了讀者與寫者問題,進一步深入了解了同步與互斥機制。比如什么是同步,什么是互斥,什么是信號量等等。 課程設計和平時的實驗課比較起來有很大的差距,實驗課只是將這一章的一部分內容練習操作一遍,而課程設計需要的是他們綜合起來的東西,這要更難一些。 總體來說我認為操作系統這門學科在計算機科學當是中非常重要的。他將我們學過的編程語言聯系起來,可以說是第一次利用C語言利用windows的API與系統進行“溝通”。 總而言之,這次操作系統的課程設計收獲頗豐,復習了許多東西,也從新學會了許多東西。我想這也許就是課程設計的最終目的吧。6源程序#include <windows.h> #includ

14、e <ctype.h>#include <stdio.h>#include <string.h> #include <stdlib.h> #include <malloc.h> #define MAX_PERSON 100#define READER 0/讀者#define WRITER 1 /寫者#define END -1#define R READER#define W WRITER typedef struct _Person HANDLE m_hThread;/定義處理線程的句柄 int m_nType;/進程類型(讀寫)

15、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, W,1,3,2, W,3,1, 3, R,10,2, 4, W,6,3, 5, R,7,5,6, R,9,1, END, ; /隊列int g_NumOfReading = 0; int g_NumOfWriteRequest = 0;/申請寫進程的個數HANDL

16、E 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 ReaderProc(LPVOID lpPa

17、ram); DWORD WINAPI WriterProc(LPVOID lpParam);int main() g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /創建信號燈,當前可用的資源數為 1,最大為 100 g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /創建信號燈,當前 可用的資源數為 1,最大為 100 printf("開始.n");CreatePersonList(g_PersonLists); /創建讀者與寫者 g_CurrentTime

18、= 0; while(true) g_CurrentTime+; Sleep(500);printf("時間片 = :%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 R: Ret = CreateReader(pList2,pList3,pList0);break

19、; case W: Ret = CreateWriter(pList2,pList3,pList0); break; if(!Ret) printf("創建 %d 失敗n",pList0); pList += 4; / move to next person list DWORD WINAPI ReaderProc(LPVOID lpParam)/讀過程 Person *pPerson = (Person*)lpParam; while(g_CurrentTime != pPerson->m_nStartTime) / 等待開始 printf(" 讀者 %d

20、 正在申請資源 .n",pPerson->m_nID); WaitForSingleObject(g_hReadSemaphore,INFINITE);/ 等待對象被觸發信號if(g_NumOfReading =0) WaitForSingleObject(g_hWriteSemaphore,INFINITE);g_NumOfReading+; ReleaseSemaphore(g_hReadSemaphore,1,NULL); pPerson->m_nStartTime = g_CurrentTime; printf(" 讀者 %d 正在閱讀.n",

21、pPerson->m_nID); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) printf(" 讀者 %d 正在退出.n",pPerson->m_nID); WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading-; if(g_NumOfReading = 0) ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此時沒有讀者,可以寫 Release

22、Semaphore(g_hReadSemaphore,1,NULL); if(pPerson->m_nID = 4) finished = true; /所有的讀寫完成 ExitThread(0); return 0; DWORD WINAPI WriterProc(LPVOID lpParam) Person *pPerson = (Person*)lpParam; while(g_CurrentTime != pPerson->m_nStartTime) / 等待開始 printf(" 寫者 %d 正在申請資源.n",pPerson->m_nID);

23、WaitForSingleObject(g_hWriteSemaphore,INFINITE); / 等待對象被觸發信號pPerson->m_nStartTime = g_CurrentTime; printf(" 寫者 %d 正在寫入.n",pPerson->m_nID); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) printf(" 寫者 %d 正在退出.n",pPerson->m_nID); g_NumOfWriteRe

24、quest-; ReleaseSemaphore(g_hWriteSemaphore,1,NULL); if(pPerson->m_nID = 4) finished = true;/所有的讀寫完成ExitThread(0); return 0; bool CreateReader(int StartTime,int WorkTime,int ID) if(g_NumPerson >= MAX_PERSON) return false; Person *pPerson = &g_Personsg_NumPerson; pPerson->m_nID = ID; pPerson->m_nStartTime = StartTime; pPerson->m_nWorkTime = WorkTim

溫馨提示

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

評論

0/150

提交評論