![操作系統(tǒng)讀者與寫者_(dá)第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/42ceabb7-45a8-432f-b8a9-f096853b8a2a/42ceabb7-45a8-432f-b8a9-f096853b8a2a1.gif)
![操作系統(tǒng)讀者與寫者_(dá)第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/42ceabb7-45a8-432f-b8a9-f096853b8a2a/42ceabb7-45a8-432f-b8a9-f096853b8a2a2.gif)
![操作系統(tǒng)讀者與寫者_(dá)第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/42ceabb7-45a8-432f-b8a9-f096853b8a2a/42ceabb7-45a8-432f-b8a9-f096853b8a2a3.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、設(shè)計目的與內(nèi)容一 實(shí)驗(yàn)?zāi)康膌. 用信號量來實(shí)現(xiàn)讀者寫者問題。2. 理解和運(yùn)用信號量、 PV 原語、進(jìn)程間的同步互斥關(guān)系等基本知識。二、二實(shí)驗(yàn)內(nèi)容讀者寫者問題的定義如下: 有一個許多進(jìn)程共享的數(shù)據(jù)區(qū), 這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間;有一些只讀取這個數(shù)據(jù)區(qū)的進(jìn)程(Reader)和一些只往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進(jìn)程 (Writer),此外還需要滿足以下條件:( 1)任意多個讀進(jìn)程可以同時讀這個文件;( 2)一次只有一個寫進(jìn)程可以往文件中寫;( 3)如果一個寫進(jìn)程正在進(jìn)行操作,禁止任何讀進(jìn)程度文件。我們需要分兩種情況實(shí)現(xiàn)該問題:讀優(yōu)先: 要求指一個讀者試圖進(jìn)行讀操作時, 如果這時正有其他讀者在進(jìn)
2、行操作, 他可 直接開始讀操作,而不需要等待。寫優(yōu)先: 一個讀者試圖進(jìn)行讀操作時, 如果有其他寫者在等待進(jìn)行寫操作或正在進(jìn)行寫 操作,他要等待該寫者完成寫操作后才開始讀操作。設(shè)計分析在 Windows 7 環(huán)境下,創(chuàng)建一個包含 n 個線程的控制臺進(jìn)程。用這 n 個線程來表示 n 個讀者或?qū)懻摺?每個線程按相應(yīng)測試數(shù)據(jù)文件的要求, 進(jìn)行讀寫操作。 請用信號量機(jī)制分別 實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。讀者 -寫者問題的讀寫操作限制:讀者 -寫者的讀寫限制(包括讀者優(yōu)先和寫者優(yōu)先)1)寫 -寫互斥,即不能有兩個寫者同時進(jìn)行寫操作2)讀 -寫互斥,即不能同時有一個讀者在讀,同時卻有一個寫者在寫
3、3)讀讀允許,即可以有 2 個以上的讀者同時讀 將所有的讀者和所有的寫者分別放進(jìn)兩個等待隊列中, 當(dāng)讀允許時就讓讀者隊列釋放一個或多個讀者, 當(dāng)寫允許時,釋放第一個寫者操作。讀者寫者問題的定義如下:有一個許多 進(jìn)程共享的數(shù)據(jù)區(qū), 這個數(shù)據(jù)區(qū)可以是一個文件或者主存的一塊空間; 有一些只讀取這個數(shù)據(jù)區(qū)的進(jìn)程(Reader)和一些只往數(shù)據(jù)區(qū)寫數(shù)據(jù)的進(jìn)程(Writer),此外還需要滿足以下條件:1)任意多個讀進(jìn)程可以同時讀這個文件;2) 一次只有一個寫進(jìn)程可以往文件中寫;3)如果一個寫進(jìn)程正在進(jìn)行操作,禁止任何讀進(jìn)程度文件。我們需要分兩種情況實(shí)現(xiàn)該問題:讀優(yōu)先:要求指一個讀者試圖進(jìn)行讀操作時,如果這時
4、正有其他讀者在進(jìn)行操作,他可直接開始讀操作,而不需要等待。寫優(yōu)先:一個讀者試圖進(jìn)行讀操作時,如果有其他寫者在 等待進(jìn)行寫操作或正在進(jìn)行寫操作,他要等待該寫者完成寫操作后才開始讀操作。這個項目設(shè)計是由我們這小組三人共同完成的,每個人都負(fù)責(zé)一些功能模塊。我是這組的組長,我負(fù)責(zé)的是整體的一個框架,以及主函數(shù)的實(shí)現(xiàn)。然后將改組成員做出的功能模塊添加到程序中。程序?qū)崿F(xiàn)程序由兩部分組成:1。 讀者-寫者模塊:包括系統(tǒng)調(diào)用接口,讀者-寫者活動描述主程序。系統(tǒng)接口主要功能是 通過管道向父進(jìn)程發(fā)送系統(tǒng)調(diào)用命令,并讀取父進(jìn)程送來的返回值。讀者-寫者活動程序根據(jù)臨界資源的共享,互斥原則編制,具體見源程序。2。主控模
5、塊:主控模塊實(shí)現(xiàn)系統(tǒng)初始化系統(tǒng)調(diào)用命令接收與解釋執(zhí)行,系統(tǒng)調(diào)用功能的實(shí)現(xiàn)(包括信號量機(jī)制),及讀者 -寫者活動過程記錄與顯示。初始化系統(tǒng)環(huán)境建立通信管道啟動讀者-寫者進(jìn)程接收系統(tǒng)調(diào)用命令解釋執(zhí)行系統(tǒng)初始化模塊管道建立模塊進(jìn)程啟動模塊 命令解釋模塊Wait()Signal()Wakeup()Block()程序調(diào)試測試數(shù)據(jù)文件格式 :測試數(shù)據(jù)文件包括 n 行測試數(shù)據(jù),分別描述創(chuàng)建的 n 個線程是讀者還是寫者,以及讀 寫操作的開始時間和持續(xù)時間。 每行測試數(shù)據(jù)包括四個字段, 各字段間用空格分隔。 第一字 段為一個正整數(shù),表示線程序號。第二字段表示相應(yīng)線程角色, R 表示讀者是, W 表示寫 者。第三
6、字段為一個正數(shù),表示讀寫操作的開始時間。線程創(chuàng)建后,延時相應(yīng)時間(單位為 秒)后發(fā)出對共享資源的讀寫申請。 第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。 當(dāng)線 程讀寫申請成功后, 開始對共享資源的讀寫操作, 該操作持續(xù)相應(yīng)時間后結(jié)束, 并釋放共享 資源。結(jié)果分析和討論在讀者寫者同時在隊列中等待申請資時, 讀者優(yōu)先調(diào)用資源。 而且如果一個讀者申請進(jìn) 行讀操作時已有另一讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作,即讀讀允許。進(jìn)程 1 是 R 操作,在時間 3 時進(jìn)入隊列 ,運(yùn)行時間是 5,在它進(jìn)入時沒有進(jìn)程占用資源, 它既占用資源;知道它釋放資源,等候的進(jìn)程有3, 4, 5;進(jìn)程 2 是 W 操
7、作,在時間 16 時進(jìn)入隊列 ,運(yùn)行時間是 5,在它進(jìn)入時進(jìn)程 4 占用資源, 它等待資源,當(dāng) 4 釋放時占用資源;進(jìn)程3是R操作,在時間5時進(jìn)入隊列,運(yùn)行時間是2,在它進(jìn)入時進(jìn)程1占用資源,它 等待資源,當(dāng)進(jìn)程 1 釋放資源后,由于讀者優(yōu)先,進(jìn)程 3, 5同時調(diào)運(yùn)資源;進(jìn)程4是R操作,在時間6時進(jìn)入隊列,運(yùn)行時間是5,在它進(jìn)入時進(jìn)程1占用資源,它等待資源,當(dāng)進(jìn)程 1 釋放資源后,由于讀者優(yōu)先,進(jìn)程3,5 占用資源,它依然等待,直到進(jìn)程 3, 5 都結(jié)束;進(jìn)程 5 是 W 操作,在時間 4 時進(jìn)入隊列 ,運(yùn)行時間是 3, 在它進(jìn)入時進(jìn)程 1 占用資源, 它等待資源,當(dāng)進(jìn)程 1 釋放資源后,由于
8、讀者優(yōu)先,進(jìn)程3,5 同時調(diào)運(yùn)資源;心得體會這一次課程設(shè)計,讓我體會很深刻。讀者- 寫者問題經(jīng)典的線程同步問題的一個模型。經(jīng)過讀者寫者問題的編寫, 我對同步機(jī)構(gòu)應(yīng)用有了深入的了解。 懂得了運(yùn)用信號量實(shí)現(xiàn)進(jìn)程 間的互斥。 實(shí)現(xiàn)了不讓共享資源同時修改。 用信號量上的原語操作使臨界段問題的解決比較 簡單明了了。讀者寫者問題的編寫, 花的時間很多,也學(xué)到很多東西。 了解支持多道程序的 并發(fā)操作系統(tǒng)設(shè)計中解決資源共享時進(jìn)程間的同步與互斥的信號量機(jī)制。 幾天的試驗(yàn), 雖然 難度有點(diǎn)大,但只要自己花時間去學(xué)習(xí),還是會攻克困難的??傊?,每一次課程設(shè)計不僅是我們學(xué)習(xí)的好機(jī)會, 而且是我們鍛煉實(shí)際動手能力的平臺,
9、 雖然有難度的東西總會讓人很抵觸, 比如在課設(shè)過程中有很多郁悶的時候, 一個小小的錯誤 一不小心就花去了自己一上午的時間, 所以在這個過程中能夠磨練人的意志與耐心, 最后感 謝老師的指導(dǎo)與監(jiān)督。源代碼#include <windows.h>#include <ctype.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <malloc.h>#defineMAX_PERSON100#defineREADER0 / 讀者#defineWRITE
10、R1 / 寫者#defineEND-1#defineRREADER#defineWWRITERtypedef struct _Person HANDLE m_hThread;/定義處理線程的句柄intm_nType;/進(jìn)程類型(讀寫)intm_nStartTime;/開始時間intm_nWorkTime;/運(yùn)行時間intm_nID;/進(jìn)程號Person;Person g_PersonsMAX_PERSON;intg_NumPerson = 0;longg_CurrentTime= 0;intg_PersonLists = /基本時間片數(shù)/進(jìn)程隊列1, R, 3, 5, 2, W, 4, 5,
11、3, R, 5, 2, 4, R, 6, 5, 5, W, 5.1, 3, END,;intg_NumOfReading = 0;int g_NumOfWriteRequest = 0; / 申請寫進(jìn)程的個數(shù)HANDLE g_hReadSemaphore; /讀者信號HANDLE g_hWriteSemaphore; / 寫者信號 bool finished = false;/所有的讀完成/bool wfinished = false; /所有的寫完成 void CreatePersonList(int *pPersonList); bool CreateReader(int StartTim
12、e,int WorkTime,int ID); bool CreateWriter(int StartTime,int WorkTime,int ID); DWORD WINAPIReaderProc(LPVOID lpParam);DWORD WINAPIWriterProc(LPVOID lpParam);int main() g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL);/創(chuàng)建信號燈,當(dāng)前可用的資源數(shù)為 1,最大為 100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /
13、 創(chuàng)建信號燈, 當(dāng)前可用的 資源數(shù)為 1,最大為 100CreatePersonList(g_PersonLists); / Create All the reader and writers printf("Created all the reader and writern.n");g_CurrentTime = 0; while(true) g_CurrentTime+; Sleep(300); / 300 ms printf("CurrentTime = %dn",g_CurrentTime);/ 顯示時間片數(shù)if(finished)/ 讀者完成
14、時結(jié)束return 0; / return 0;/創(chuàng)建所有讀者與寫者void CreatePersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool Ret;while(pList0 != END)switch(pList1)case R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654 break;case W:Ret = CreateWriter(pList2,pList3,pList0); break;if(!Ret)printf("C
15、reate Person %d is wrongn",pList0); pList += 4; / move to next person list/讀過程DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime)printf("Reader %d is Requesting .n",pPerson->m_nID);print
16、f("nn*/ wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE);if(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson->m_nStartTime = g_CurrentTime;printf("Reader %d is Reading the Shared
17、Buffer.n",pPerson->m_nID);printf("nn*while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)printf("Reader %d is Exit.n",pPerson->m_nID);printf("nn*WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading-;if(g_NumOfReading = 0)ReleaseSemapho
18、re(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 timewhile(g_CurrentTime != pPerson->m
19、_nStartTime)printf("Writer %d is Requesting .n",pPerson->m_nID);printf("nn);WaitForSingleObject(g_hWriteSemaphore,INFINITE);/ modify the writer's real start time pPerson->m_nStartTime = g_CurrentTime;printf("Writer %d is Writting the Shared Buffer.n",pPerson->m_
20、nID);while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)printf("Writer %d is Exit.n",pPerson->m_nID);printf("nn);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson->m_nID = 4)finished = true; / 所有的讀寫完成ExitThread(0);return 0;/創(chuàng)建讀者 bool CreateReader(int StartTime,int WorkTime,int ID) DWORD dwThreadID;if(g_NumPerson >= MAX_PERSON)return false;Person *pPerson = &g_Personsg_NumPerson; pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime; pPerson->m_nWorkTime = Wor
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東師范大學(xué)《生物藥物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 大連翻譯職業(yè)學(xué)院《司法審判實(shí)務(wù)與模擬法庭》2023-2024學(xué)年第二學(xué)期期末試卷
- 松原職業(yè)技術(shù)學(xué)院《礦井災(zāi)害防治技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 上饒衛(wèi)生健康職業(yè)學(xué)院《國際貿(mào)易學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 民辦萬博科技職業(yè)學(xué)院《我們身邊的經(jīng)濟(jì)學(xué)(人文社科)》2023-2024學(xué)年第二學(xué)期期末試卷
- 德州科技職業(yè)學(xué)院《項目投融資及可行性研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 渤海大學(xué)《框架開發(fā)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年天然氣液化模塊合作協(xié)議書
- 昭通云南昭通綏江縣發(fā)展和改革局聘用編外人員招聘筆試歷年參考題庫附帶答案詳解
- 2025至2030年中國吹膜干燥劑數(shù)據(jù)監(jiān)測研究報告
- 人教版高中數(shù)學(xué)必修1全冊導(dǎo)學(xué)案
- 四年級計算題大全(列豎式計算,可打印)
- 科技計劃項目申報培訓(xùn)
- 591食堂不合格食品處置制度
- 產(chǎn)業(yè)鏈鏈長分工表
- 國際金融課件(完整版)
- 導(dǎo)向標(biāo)識系統(tǒng)設(shè)計(一)課件
- 220t鍋爐課程設(shè)計 李學(xué)玉
- 全英文劇本 《劇院魅影》
- 北京城的中軸線PPT通用課件
- 黑布林繪本 Dad-for-Sale 出售爸爸課件
評論
0/150
提交評論