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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程設計課 題:讀者寫者問題姓 名:赫前進班 級:1020552學 號102055211指導教師:葉瑤提交時間:2012/12/30(一)實驗目的1.進一步理解 “臨界資源” 的概念;2.把握在多個進程并發(fā)執(zhí)行過程中對臨界資源訪問時的必要約束條件;3.理解操作系統(tǒng)原理中 “互斥” 和 “同步” 的涵義。(二)實驗內(nèi)容利用程序設計語言編程,模擬并發(fā)執(zhí)行進程的同步與互斥(要求:進程數(shù)目不少于 3 個)。(三)、程序分析讀者寫者問題的定義如下:有一個許多進程共享的數(shù)據(jù)區(qū),這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數(shù)據(jù)區(qū)的進程(Reader)和一些只往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進程(Wr

2、iter),此外還需要滿足以下條件:(1) 任意多個讀進程可以同時讀這個文件;(2) 一次只有一個寫進程可以往文件中寫;(3) 如果一個寫進程正在進行操作,禁止任何讀進程度文件。實驗要求用信號量來實現(xiàn)讀者寫者問題的調(diào)度算法。實驗提供了signal類,該類通過P( )、V( )兩個方法實現(xiàn)了P、V原語的功能。實驗的任務是修改Creat_Writer()添加寫者進程,Creat_Reader()創(chuàng)建讀者進程。Reader_goon()讀者進程運行函數(shù)。讀優(yōu)先:要求指一個讀者試圖進行讀操作時,如果這時正有其他讀者在進行操作,他可直接開始讀操作,而不需要等待。讀者優(yōu)先的附加限制:如果一個讀者申請進行讀

3、操作時已有另一讀者正在進行讀操作,則該讀者可直接開始讀操作。寫優(yōu)先:一個讀者試圖進行讀操作時,如果有其他寫者在等待進行寫操作或正在進行寫操作,他要等待該寫者完成寫操作后才開始讀操作。寫者優(yōu)先的附加限制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。在Windows 7 環(huán)境下,創(chuàng)建一個控制臺進程,此進程包含 n 個線程。用這 n 個線程來表示 n 個讀者或寫者。每個線程按相應測試數(shù)據(jù)文件(格式見下)的要求進行讀寫操作。用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者/寫者問題。運行結果顯示要求:要求在每個線程創(chuàng)建、發(fā)出讀寫操作申請

4、、開始讀寫操作和結束讀寫操作時分別顯示一行提示信息,以確定所有處理都遵守相應的讀寫操作限制。測試數(shù)據(jù)文件包括 n 行測試數(shù)據(jù),分別描述創(chuàng)建的 n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括4個字段,各個字段間用空格分隔。 第一個字段為一個正整數(shù),表示線程序號 第二個字段表示相應線程角色,R 表示讀者,W 表示寫者 第三個字段為一個正數(shù),表示讀/寫操作的開始時間:線程創(chuàng)建后,延遲相應時間(單位為秒)后發(fā)出對共享資源的讀/寫請求 第四個字段為一正數(shù),表示讀/寫操作的持續(xù)時間:線程讀寫請求成功后,開始對共享資源的讀/寫操作,該操作持續(xù)相應時間后結束,并釋放共享資源例如:

5、1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3讀者寫者問題是操作系統(tǒng)中經(jīng)典的互斥問題:一塊數(shù)據(jù)被多個讀者和寫者的訪問,需要考慮讀寫互斥、寫寫互斥(可以同時由多個讀者讀取)。具體的又可以分為讀者優(yōu)先和寫者優(yōu)先兩類。讀者優(yōu)先算法:當新的讀者到來的時候,若當前正有讀者在進行讀操作,則該讀者無需等待前面的寫操作完成,直接進行讀操作。設置兩個互斥信號量:rwmutex 用于寫者與其他讀者/寫者互斥的訪問共享數(shù)據(jù)rmutex 用于讀者互斥的訪問讀者計數(shù)器readcountvar rwmutex, rmutex : semaphore := 1,1 ;int readcount

6、= 0;cobegin readeri begin / i=1,2,. P(rmutex); Readcount+; If (readcount = 1) P(rwmutex); V(rmutex); 讀數(shù)據(jù); P(rmutex); Readcount-; If (readcount = 0) V(rwmutex); V(rmutex); End Writerj begin / j = 1,2,. P(rwmutex); 寫更新; V(rwmutex); EndCoend寫者優(yōu)先:條件:1)多個讀者可以同時進行讀2)寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)3)寫者優(yōu)先于讀者(一

7、旦有寫者,則后續(xù)讀者必須等待,喚醒時優(yōu)先考慮寫者)設置三個互斥信號量:rwmutex 用于寫者與其他讀者/寫者互斥的訪問共享數(shù)據(jù)rmutex 用于讀者互斥的訪問讀者計數(shù)器readcountnrmutex 用于寫者等待已進入讀者退出,所有讀者退出前互斥寫操作var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ;int readcount = 0;cobegin readeri begin / i=1,2,. P(rwmutex); P(rmutex); Readcount+; If (readcount = 1) P(nrmutex); /有讀者進入

8、,互斥寫操作 V(rmutex); V(rwmutex); / 及時釋放讀寫互斥信號量,允許其它讀、寫進程申請資源 讀數(shù)據(jù); P(rmutex); Readcount-; If (readcount = 0) V(nrmutex); /所有讀者退出,允許寫更新 V(rmutex); End Writerj begin / j = 1,2,. P(rwmutex); / 互斥后續(xù)其它讀者、寫者 P(nrmutex); /如有讀者正在讀,等待所有讀者讀完 寫更新; V(nrmutex); /允許后續(xù)新的第一個讀者進入后互斥寫操作 V(rwmutex); /允許后續(xù)新讀者及其它寫者 EndCoend

9、/*-函數(shù)聲明-*/void Creat_Writer(); /添加一個寫者void Del_Writer(); /刪除一個寫者void Creat_Reader(); /添加一個讀者void Reader_goon(); /讀者進程運行函數(shù)void R_Wakeup(); /喚醒等待讀者void Del_Reader(); /刪除一個讀者void Show(); /顯示運行狀態(tài) /*= class signal =*/class signal /信號量對象.private:int value;int queue; /用int型數(shù)據(jù)模擬等待隊列.public:signal();signal(i

10、nt n);int P(); /檢查臨界資源int V(); /釋放臨界資源int Get_Value();int Get_Queue();/#include #include#include#includeusing namespace std;const int MaxThread=20; struct ThreadInfo int num; char type; double start; double time; thread_infoMaxThread;HANDLE hX; HANDLE hWsem; HANDLE threadMaxThread; int readcount; do

11、uble totaltime; void WRITEUNIT(int iProcess) printf(Thread %d begins to write.n,iProcess); Sleep(DWORD)(thread_infoiProcess-1.time*1000); printf(End of thread %d for writing.n,iProcess);void READUNIT(int iProcess) printf(Thread %d begins to read.n,iProcess); Sleep(DWORD)(thread_infoiProcess-1.time*1

12、000); printf(End of thread %d for reading.n,iProcess);DWORD WINAPI reader(LPVOID lpVoid) int iProcess = *(int*)lpVoid; Sleep(DWORD)(thread_infoiProcess-1.start*1000); DWORD wait_for=WaitForSingleObject(hX,INFINITE); printf(Thread %d requres reading.n,iProcess); readcount+; if(readcount=1)WaitForSing

13、leObject(hWsem,INFINITE); ReleaseMutex(hX); READUNIT(iProcess); wait_for=WaitForSingleObject(hX,INFINITE); readcount-; if(readcount=0) ReleaseSemaphore(hWsem,1,0); ReleaseMutex(hX); return iProcess;DWORD WINAPI writer(LPVOID lpVoid) int iProcess = *(int*)lpVoid; Sleep(DWORD)(thread_infoiProcess-1.st

14、art*1000); printf(Thread %d requres writing.n,iProcess); DWORD wait_for=WaitForSingleObject(hWsem,INFINITE); WRITEUNIT(iProcess); ReleaseSemaphore(hWsem,1,0); return iProcess; int main() int threadNum; int threadcount; ifstream file; hX=CreateMutex(NULL, FALSE, NULL); hWsem=CreateSemaphore(NULL,1,1,

15、NULL); /? readcount=0; threadcount=0; totaltime=0; file.open(thread.dat,ios:in); if(file=0) printf(File Open Error.n); return 0; while(filethreadNum) thread_infothreadNum-1.num=threadNum; filethread_infothreadNum-1.type; filethread_infothreadNum-1.start; filethread_infothreadNum-1.time; totaltime+=t

16、hread_infothreadNum-1.time; switch(thread_infothreadNum-1.type) case W: printf(Creating Thread %d for writing.n,thread_infothreadNum-1.num); threadthreadNum-1 = CreateThread(NULL, 0,writer, &thread_infothreadNum-1.num,0,0); break; case R: printf(Creating Thread %d for reading.n,thread_infothreadNum-

17、1.num); threadthreadNum-1 = CreateThread(NULL, 0,reader, &thread_infothreadNum-1.num,0,0); break; threadcount+; file.close(); Sleep(DWORD)(totaltime*1000); return 1;/semaphore fmutex = 1 , rdcntmutex = 1 ;/ fmutex - access to file; rdcntmutex - access to readcount int readcount = 0 ;void reader() wh

18、ile ( 1 ) P(rdcntmutex); if ( readcount=0) P(fmutex); readcount = readcount + 1 ; V(rdcntmutex); / Do read operation P(rdcntmutex); readcount = readcount - 1 ; if ( readcount=0) V(fmutex); V(rdcntmutex); void writer() while ( 1 ) P(fmutex); / Do write operation V(fmutex); /semaphore fmutex = 1 , rdcntmutex = 1 , wtcntmutex = 1 , queue = 1 ;/ fmutex - access to file; rdcntmutex - access to rea

溫馨提示

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

評論

0/150

提交評論