東華大學(xué)操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第1頁
東華大學(xué)操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第2頁
東華大學(xué)操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第3頁
東華大學(xué)操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第4頁
東華大學(xué)操作系統(tǒng)讀者寫者實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論