版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
東華大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱: 讀者寫者問題姓名:姜元杰學(xué)號(hào):111310228班級(jí): 計(jì)算機(jī)1102指導(dǎo)老師:李繼云報(bào)告日期:2013/10/12耽■沮ii耽■沮ii事f1皿i!f航空售票信息管理系統(tǒng)一、 實(shí)驗(yàn)概述實(shí)驗(yàn)?zāi)繕?biāo)在Windows系統(tǒng)平臺(tái)下,了解Windows編程基本知識(shí),通過創(chuàng)建線程等一系列操作實(shí)現(xiàn)進(jìn)程同步經(jīng)典問題一一讀者寫者問題。實(shí)驗(yàn)要求在Windows?環(huán)境下,創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,此進(jìn)程包含n個(gè)線程。用這n個(gè)線程來表示n個(gè)讀者或?qū)懻?。每個(gè)線程按相應(yīng)測(cè)試數(shù)據(jù)文件(后面有介紹)的要求進(jìn)行讀寫操作。用信號(hào)量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。讀者-寫者問題的讀寫操作限制(包括讀者優(yōu)先和寫者優(yōu)先):1) 寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作。2) 讀-寫互斥,即不能同時(shí)有一個(gè)線程在讀,而另一個(gè)線程在寫。,3) 讀-讀允許,即可以有一個(gè)或多個(gè)讀者在讀。讀者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一個(gè)讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。寫者優(yōu)先的附加限制:如果一個(gè)讀者申請(qǐng)進(jìn)行讀操作時(shí)已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。運(yùn)行結(jié)果顯示要求:要求在每個(gè)線程創(chuàng)建、發(fā)出讀寫操作申請(qǐng)、開始讀寫操作和結(jié)束讀寫操作時(shí)分別顯示一行提示信息,以確定所有處理都遵守相應(yīng)的讀寫操作限制。二、實(shí)驗(yàn)內(nèi)容設(shè)計(jì)思路通過仔細(xì)分析問題,實(shí)驗(yàn)實(shí)現(xiàn)內(nèi)容分別為讀者優(yōu)先部分與寫者優(yōu)先部分。通過建立統(tǒng)一的線程數(shù)組存儲(chǔ)所有待創(chuàng)建線程,并在系統(tǒng)后臺(tái)分別存于可以將所有讀者和所有寫者分別存于一個(gè)讀者等待隊(duì)列和一個(gè)寫者等待隊(duì)列中,每當(dāng)讀允許時(shí),就從讀者隊(duì)列中釋放一個(gè)或多個(gè)讀者線程進(jìn)行讀操作;每當(dāng)寫允許時(shí),就從寫者隊(duì)列中釋放一個(gè)寫者進(jìn)行寫操作。通過程序代碼實(shí)現(xiàn)讀讀允許,讀寫互斥,寫寫互斥。對(duì)于讀者優(yōu)先部分,引入Mutex信號(hào)量和臨界區(qū)對(duì)象RP_Writer實(shí)現(xiàn)。讀者優(yōu)先指的是除非有寫者在寫文件,否則讀者不需要等待。所以可以用一個(gè)整型變量read_Count記錄當(dāng)前的讀者數(shù)目,用于確定是否需要釋放正在等待的寫者線程(當(dāng)read_Count=O時(shí),表明所有的讀者讀完,需要釋放寫者等待隊(duì)列中的一個(gè)寫者)。每一個(gè)讀者開始讀文件時(shí),必須修改read_Count變量。因此需要一個(gè)互斥對(duì)象Mutex來實(shí)現(xiàn)對(duì)全局變量read_Count修改時(shí)的互斥。另外,為了實(shí)現(xiàn)寫-寫互斥,需要增加一個(gè)臨界區(qū)對(duì)象RP_Writer。當(dāng)寫者發(fā)出寫請(qǐng)求時(shí),必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。通過這種方法,也可以實(shí)現(xiàn)讀-寫互斥,當(dāng)read_Count=l時(shí)(即第一個(gè)讀者到來時(shí)),讀者線程也必須申請(qǐng)臨界區(qū)對(duì)象的所有權(quán)。當(dāng)讀者擁有臨界區(qū)的所有權(quán)時(shí),寫者阻塞在臨界區(qū)對(duì)象RP_Writer上。當(dāng)寫者擁有臨界區(qū)的所有權(quán)時(shí),第一個(gè)讀者判斷完"read_Count==1"后阻塞在write上,其余的讀者由于等待對(duì)read_Count的判斷,阻塞在Mutex上。對(duì)于寫者部分,與讀者優(yōu)先類似;不同之處在于一旦一個(gè)寫者到來,它應(yīng)該盡快對(duì)文件進(jìn)行寫操作,如果有一個(gè)寫者在等待,則新到來的讀者不允許進(jìn)行讀操作。為此應(yīng)當(dāng)添加一個(gè)整型變量write_Count,用于記錄正在等待的寫者的數(shù)目,當(dāng)write_Count=0時(shí),才可以釋放等待的讀者線程隊(duì)列。增加一個(gè)互斥對(duì)象Mutex3,維護(hù)對(duì)全局變量write_Count的互斥修改。為了實(shí)現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)添加一個(gè)臨界區(qū)對(duì)象CS_Reader,當(dāng)有寫者在寫文件或等待時(shí),讀者必須阻塞在CS_Reader上,同時(shí)讀者線程除了要對(duì)全局變量read_Count實(shí)現(xiàn)操作上的互斥外,還必須有一個(gè)互斥對(duì)象對(duì)阻塞CS_Reader這一過程實(shí)現(xiàn)互斥。主要數(shù)據(jù)結(jié)構(gòu)intreadCount:訪問資源的讀者線程數(shù)目;intwriteCount:訪問資源的寫者線程數(shù)目;CRITICAL_SECTIONRP_Writer:臨界區(qū)對(duì)象,讀者優(yōu)先中用于阻塞寫者;CRITICAL_SECTIONCS_Writer:臨界區(qū)對(duì)象,寫者優(yōu)先中實(shí)現(xiàn)寫寫互斥;CRITICAL_SECTIONCS_Reader:臨界區(qū)對(duì)象,寫者優(yōu)先中用于阻塞讀者,
體現(xiàn)寫者優(yōu)先structThread:線程信息結(jié)構(gòu)體結(jié)構(gòu)表示,成員變量包括intNumber,charType,doubleRunTime,Wai仃ime,分別代表線程序號(hào),線程種類(讀者或?qū)懻撸?,等待時(shí)間,作業(yè)時(shí)間。HANDLEMutexl:互斥信號(hào)量,用于實(shí)現(xiàn)寫者優(yōu)先。HANDLEMutex2:互斥信號(hào)量,用于維護(hù)read_Count修改。HANDLEMutex3:互斥信號(hào)量,用于維護(hù)write_Count修改。主要代碼結(jié)構(gòu)voidReaderPriority(char*file) \\讀者優(yōu)先主控程序voidRP_ReaderThread(void*p)\\讀者優(yōu)先-讀者線程voidRP_WriterThread(void*p)\\讀者優(yōu)先-寫者線程voidWriterPriority(char*file) \\寫者優(yōu)先主控程序voidWP_ReaderThread(void*p)\\寫者優(yōu)先-讀者線程voidWP_WriterThread(void*p)\\寫者優(yōu)先-寫者線程主要代碼段分析a)創(chuàng)建文件輸入流inFile讀入文件while(inFile)while(inFile)inFile>>inFile>>inFile>>inFile>>thread[n_Thread].Hunber;inFile>>inFile>>inFile>>inFile>>thread[n_Thread].Type;thread[n_Thread]-WaitTine;thread[n_Thread++].RunTime:inFile.getC):>12.讀者優(yōu)先讀者線程部分:WaitForMutex=WaitForSingleObject(Mutex,-1);//P(h_mutex)readCount++;if(readCount==1)〃讀者線程進(jìn)入臨界區(qū),實(shí)現(xiàn)讀者優(yōu)先(EnterCriticalSection(&RP_Writer);}ReleaseMutex(Mutex);//V(h_mutex)printf("Readerthread%dbeginstoreadfile.\n",Number);//讀者線程開始作業(yè)Sleep(RunTime);//作業(yè)時(shí)間printf("Readerthread%dfinishedreadingfile.\n",Number);//作業(yè)完成WaitForMutex=WaitForSingleObject(Mutex,-1);//P(h_mutex)讀者線程對(duì)象已觸發(fā)readCount--;//讀者線程退出if(readCount==0)//所有讀者線程都已作業(yè)完畢,釋放臨界區(qū)對(duì)象,寫者
可作業(yè)可作業(yè)LeaveCriticalSection(&RP_Writer);//V(h_mutex)ReleaseMutex(Mutex);//V(h_mutex)3.寫者優(yōu)先寫者線程部分:printf("Writerthread%dsentsthereadingrequire.\n",Number);//讀者線程從創(chuàng)建m_delay秒后,發(fā)送讀申請(qǐng)WaitForMutex3=WaitForSingleObject(Mutex3,-1);//P(Mutex3)維護(hù)writeCount修改//P(h_mutex)writeCount++;if(writeCount==1)//臨界區(qū)有寫者線程作業(yè)時(shí),阻塞一切讀者線程(EnterCriticalSection(&CS_Reader);}ReleaseMutex(Mutex3);//V(Mutex3)EnterCriticalSection(&CS_Writer);//寫寫互斥printf("Writerthread%dbegintowritethefile.\n",Number);Sleep(RunTime);printf("writerthread%dfinishingwritingfile.\n",Number);LeaveCriticalSection(&CS_Writer);WaitForMutex3=WaitForSingleObject(Mutex3,-1);//維護(hù)writeCount修改
writeCount--;if(writeCount==0)//當(dāng)所有寫者線程作業(yè)完畢,釋放讀者線程臨界區(qū)對(duì)象LeaveCriticalSection(&CS_Reader);ReleaseMutex(Mutex3);//ReleaseMutex(Mutex3);//V(Mutex3)三、實(shí)驗(yàn)結(jié)果?基本數(shù)據(jù)基本數(shù)據(jù):TestData.dat(見附件)數(shù)據(jù)文件包括n行測(cè)試數(shù)據(jù),分別描述創(chuàng)建的n個(gè)線程是讀者還是寫者,以及讀寫操作的開始時(shí)間和持續(xù)時(shí)間。每行測(cè)試數(shù)據(jù)包括四個(gè)字段,各個(gè)字段間用空格分隔。第一字段為一個(gè)正整數(shù),表示線程序號(hào)。第二字段表示相應(yīng)線程角色,R表示讀者,w表示寫者。第三字段為一個(gè)正數(shù),表示讀寫操作的開始時(shí)間:線程創(chuàng)建后,延遲相應(yīng)時(shí)間(單位為秒)后發(fā)出對(duì)共享資源的讀寫申請(qǐng)。第四字段為一個(gè)正數(shù),表示讀寫操作的持續(xù)時(shí)間。當(dāng)線程讀寫申請(qǐng)成功后,開始對(duì)共享資源的讀寫操作,該操作持續(xù)相應(yīng)時(shí)間后結(jié)束,并釋放共享資源。數(shù)據(jù)文件內(nèi)容:TOC\o"1-5"\h\zR35W45R52R65W5.132.源代碼行數(shù):2.源代碼行數(shù):代碼共303行。3.完成實(shí)驗(yàn)投入時(shí)間:累計(jì)共7小時(shí)4.討論次數(shù):3次
5-5-測(cè)試數(shù)據(jù)分析:分析詳情見1.基本數(shù)據(jù)6.測(cè)試結(jié)果分析:程序菜單界面:1)讀者優(yōu)先:Kxx-NxxxxxKxx米拜拜ReaderPriopity(x-xxmxx-nxxnxxmxReaderReaderWriterReaderReaderWriterReaderReaderReaderWriterReaderReaderWriterReaderReaderReaderReaderReaderWriterWriterWriterWriterthread1thread1thread2thread3thread3thread5tliread4thread4thread3thread1thread4thread2thread2thread5thread5sentsthebeginstosentsthesentsthebeginstosentsthesentsthebeginstoreadIngrequire.readfile.uritingrequire.readIngrequire.readfile.uritingrequire.readIngrequire.readfile.finisbedreadingfile.finIsliedreadingflie.finisbedreadingfile.beginstofinIshIngbeginstofinishinguvitetheurltingtouvitetheupitinsftofile.thefile.file.thefile.ALLreaderandwritwehauefinishedoperating?PressAnyKeyToContinue:讀者優(yōu)先結(jié)果分析:根據(jù)測(cè)試數(shù)據(jù)及讀者優(yōu)先原則可知,線程1R在第3s先執(zhí)行,當(dāng)它執(zhí)行1s后,線程2W發(fā)出申請(qǐng),但被阻塞,實(shí)現(xiàn)讀寫互斥。然后線程3R,線程4R在第5、6s時(shí)發(fā)出申請(qǐng)并被準(zhǔn)許訪問數(shù)據(jù)區(qū),實(shí)現(xiàn)了多個(gè)讀者同時(shí)讀數(shù)據(jù)允許。而在5.1s發(fā)出寫申請(qǐng)的線程5W則被阻塞。當(dāng)讀者線程根據(jù)時(shí)間都完成后,寫者線程2W先被喚醒,并且在它完成之前,寫者線程5W仍然是阻塞狀態(tài),從而實(shí)現(xiàn)了寫寫互斥。
2)寫者分析:jcxjotjcKJotM:■:MNKJCJotUpitepFi*:L(JF:ity者{尤先〉 :mnkk:mnkjckx)o(io<jo(ReaderReaderWriterReaderWriterReaderReaderWriterReaderWriterReaderReaderWriterwritepWriterwriterReaderReaderReaderReaderReaderthreadthreadthreadthreadthreadthreadthread1123541sentsthepeadingrequire.begintoreadtheflie_sentsthepeadingrequire.sentsthevead±nrequire.sentsthepeadingrequire.sentsthevead±nrequire.finisliedreadingfile.thread2be^lntowritethefile.thread2fintailingwritingfile.thread5be^lntowritethefile.thread5finisliingwritingfile.thread3begintoreadtheFile-thread3begintoreadthefile-thread4begintoreadthefile_thread3finisliedpeading-file.thread4finIsliedreading-file.ALLpeadevandupituehauefinishedopepating!PressAnyKepToContinue:寫者優(yōu)先結(jié)果分析:根據(jù)測(cè)試數(shù)據(jù)及寫者優(yōu)先原則可知,線程1R在第3s先執(zhí)行,當(dāng)它執(zhí)行1s后,線程2W發(fā)出申請(qǐng),但被阻塞,實(shí)現(xiàn)讀寫互斥。然后線程3R、線程5W、線程4R在第5s、5.1s、6s時(shí)發(fā)出申請(qǐng),均被阻塞。當(dāng)線程1R完成后,線程2W開始執(zhí)行,執(zhí)行完成。本來是線程4R先申請(qǐng),但是有寫者線程5W等待,根據(jù)寫者優(yōu)先,線程4R被阻塞,先執(zhí)行線程5W,執(zhí)行完成后,再根據(jù)時(shí)間先后執(zhí)行線程3R、4R。此時(shí)也實(shí)現(xiàn)了多個(gè)讀者同時(shí)讀數(shù)據(jù)的操作。實(shí)驗(yàn)體會(huì)實(shí)驗(yàn)過程中遇到問題及解決過程問題:1:開始進(jìn)行實(shí)驗(yàn)內(nèi)容時(shí),由于不熟悉Windows編程知識(shí),起手困難。因此開始便通過不斷調(diào)閱參考資料和上網(wǎng)查詢,熟悉線程創(chuàng)建,信號(hào)量機(jī)制等知識(shí)在Windows編程下的基本函數(shù)調(diào)用及用法,得以順利進(jìn)行實(shí)驗(yàn)代碼編寫。問題2:由于參考代碼“實(shí)驗(yàn)一.cpp”在VC6.0平臺(tái)下編寫,故一開
始導(dǎo)入VS2010中,由于系統(tǒng)兼容等復(fù)雜原因,導(dǎo)致代碼無法編譯通始導(dǎo)入VS2010中,由于系統(tǒng)兼容等復(fù)雜原因,導(dǎo)致代碼無法編譯通航空售票信息管理系統(tǒng)過,最終放棄VS2010,轉(zhuǎn)入VC6.0平臺(tái),解決問題。實(shí)驗(yàn)過程中產(chǎn)生錯(cuò)誤及原因分析錯(cuò)誤1:在寫者優(yōu)先代碼部分中代碼部分,出現(xiàn)低級(jí)錯(cuò)誤,原因分析如下:代碼截圖:li_Thredd[i]-CredLeTriredd(NULL,0,(LPTHflEAD_START_ROUTIHEIhr典諷iF(ttiread[i].Type=='R'11thread[i]-Type==li_Thredd[i]-CredLeTriredd(NULL,0,(LPTHflEAD_START_ROUTIHEIhr典諷y+_ThrPAr1[i]=RrPAtpThrPAri(MillIPTHRFAD_STflRT_RnilTlNFi(UP_RpAdprThrPAr1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇科版數(shù)學(xué)九年級(jí)下冊(cè)《列表法畫二次函數(shù)的圖象》聽評(píng)課記錄2
- 環(huán)境友好設(shè)備供應(yīng)合同(2篇)
- 人教版數(shù)學(xué)七年級(jí)上冊(cè)1.4.1《有理數(shù)的乘法(1)》聽評(píng)課記錄
- 六年級(jí)科學(xué)聽評(píng)課記錄
- 湘教版地理七年級(jí)下冊(cè)8.3《俄羅斯》聽課評(píng)課記錄
- 中圖版地理七年級(jí)上冊(cè)《第一節(jié) 疆域和行政區(qū)劃》聽課評(píng)課記錄2
- 語文中高年級(jí)聽評(píng)課記錄
- 理療科主治醫(yī)師職責(zé)
- 部編版八年級(jí)道德與法治下冊(cè)第五課《我國基本制度》第1課時(shí)《基本經(jīng)濟(jì)制度》聽課評(píng)課記錄
- 五年級(jí)口算及
- 高考志愿咨詢培訓(xùn)課件
- mysql課件第五章數(shù)據(jù)查詢
- 超濾培訓(xùn)課件
- 熱線電話管理制度
- AutoCAD 2020中文版從入門到精通(標(biāo)準(zhǔn)版)
- 《海峽兩岸經(jīng)濟(jì)合作框架協(xié)議》全文
- 紡絲原液制造工(中級(jí))理論考試復(fù)習(xí)題庫(含答案)
- ArcGIS軟件入門培訓(xùn)教程演示文稿
- 大梅沙河道河道流量水位
- 人教版初二英語八年級(jí)上冊(cè)全冊(cè)英語單詞表
- 《紅色經(jīng)典》校本課程
評(píng)論
0/150
提交評(píng)論