




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
操作系統(tǒng)原理實驗報告實驗名稱:操作系統(tǒng)姓名:XXX學(xué)號:xxxxxxxxxx班級:X)(X指導(dǎo)老師:XXXe*INTE_PER_SEC);SIeep(dwDelay);printf("Writethread%dsentsthewritingrequire.\n",nSeriaINo);WaitForSingleObject(hWrite,INFINITE);printf("Writerthread%dbeginstowritetothefiIe.\n",nSeriaINo);SIeep(dwWriteTime);printf("Writethread%dfinishedwritingtothefiIe.\n",nSeriaINo);ReleaseSemaphore(hWrite,1,NULL):)//讀者優(yōu)先解決函數(shù)//fiIe:文獻名voidReaderPriority(char*fiIe)(intnThreadCnt=0;DWORDdwThreadID=0;nReaderCnt=0;//初始化讀寫者計數(shù)HANDLEhThreads[MAX_THREAD_NUM];ThreadInfooThreadInfo[MAX_THREAD_NUM];ifstreaminFiIe;inFiIe.open(fiIe);printf("ReaderPriority:\n\n");whiIe(inFiIe)//讀入每一個讀者,寫者的信息inFile>>oThreadInfo[nThreadCnt].nSeriaINo;inFiIe>>oThreadInfo[nThreadCnt].cType;inFiIe>>oThreadInfo[nThreadCnt].dDelayTime;inFiIe?oThreadInfoLnThreadCnt].dOpeTime:if('八’!=oThreadInfo[nThreadCnt].cType)(nThreadCnt++;)inFiIe.get();}//創(chuàng)建線程for(inti=0;i<nThreadCnt;i++)(if((oThreadInfo[i].cType==READER)||(oThreadInfo[i].cType=='r')){hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),//創(chuàng)建讀者進程&oThreadlnfo[i],CREATE_SUSPENDED,&dwThreadlD);}eIsehThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),//創(chuàng)建寫線程&oThreadlnfo[i],CREATE_SUSPENDED,&dwThreadID);)}for(i=0;i<nThreadCnt;i++)(ResumeThread(hThreads[i]);)WaitForMuItipIeObjects(nThreadCnt,hThreads,TRUE,INFINITE):printf("AlIreaderandwriterhavefinishedoperating-\n");}//寫者優(yōu)先一一讀者線程//P:讀者線程信息voidWP_ReaderThread(void*p)(intnSerialNo=((ThreadInfo*)(p))->nSeriaINo;//從參數(shù)中得到信息DWORDdwReadTime=(DWORD)(((ThreadInfo*)(p))—>dOpeTime*INTE_PER_SEC);DWORDdwDelay二(DWORD)(((Threadlnfo*)(p))->dDelayTime*INTE_PER_SEC);Sleep(dwDelay);printf("Readerthread%dsentsthereadingrequire.\n",nSeriaINo);WaitForSingIeObject(hReadMutex,INFINITE);WaitForSingleObject(hRead,INFINITE);WaitForSingIeObject(hRCMutex,INFINITE):nReaderCnt++;if(nReaderCnt==1)(WaitForSingleObject(hWrite,INFINITE);1ReIeaseMutex(hRCMutex);ReIeaseSemaphore(hRead,1,NULL);ReleaseMutex(hReadMutex);printf("Readerthread%dbeginstoreadfiIe.\n",nSeriaINo);Sleep(dwReadTime);printf("Readerthread%dfinishedreadingfiIe.\n",nSerialNo);WaitForSingIeObject(hRCMutex,INFINITE);nReaderCnt—;if(nReaderCnt==0)(ReIeaseSemaphore(hWrite,1,NULL);)ReIeaseMutex(hRCMutex);//寫者優(yōu)先寫者線程//P:寫者線程信息voidWP_WriterThread(void*p)(intnSeriaINo=((ThreadInfo*)(p))->nSeriaINo;DWORDdwWriteTime=(DWORD)(((ThreadInfo*)(p))->dOpeTime*INTE_PER_SEC);DWORDdwDeIay=(DWORD)(((ThreadInfo*)(p))->dDeIayTime*INTE_PER_SEC);SIeep(dwDeIay);printf("Writerthread%dsentsthewritingrequire.\n",nSeriaINo);WaitForSingIeObject(hWCMutex,INFINITE);nWriterCnt++;if(nWriterCnt==1)(WaitForSingleObject(hRead,INFINITE);}ReIeaseMutex(hWCMutex);WaitForSingIeObject(hWrite,INFlNITE);printf("Writerthread%dbeginstowritetothefiIe.\n",nSeriaINo);SIeep(dwWriteTime);printf("Writerthread%dfinishedwritingtothefe.\n",nSeriaINo);ReIeaseSemaphore(hWrite,1,NULL);WaitForSingIeObject(hWCMutex,INFINITE):nWriterCnt—;if(nWriterCnt==0)(ReIeaseSemaphore(hRead,1,NULL);}ReIeaseMutex(hWCMutex);)//寫者優(yōu)先解決函數(shù)//file:文獻名voidWriterPriority(char*fiIe)(intnThreadCnt=0;DWORDdwThreadID;HANDLEhThreads[MAX_THREAD_NUM];ThreadInfooThreadInfo[MAX_THREAD_NUM];nReaderCnt=0;nWriterCnt=O;ifstreaminFiIe;inFiIe.open(fiIe):printf("Writerpriority:\n\n");while(inFiIe)inFiIe?oThreadInfo[nThreadCntJ.nSeriaINo;inFiIe?oThreadInfo[nThreadCnt].cType;inFiIe>>oThreadInfo[nThreadCnt].dDelayTime;inFiIe?oThreadInfo[nThreadCnt].dOpeTime;if('!=oThreadInfo[r)ThreadCnt].cType)(nThreadCnt++;1inFiIe.get();}for(inti=0;i<nThreadCnt;i++)//創(chuàng)建線程(if((oThreadlnfo[i].cType==READER)|I(oThreadInfo[i].cType==r1))(hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),//創(chuàng)建讀者進程&oThreadInfo[i],CREATE_SUSPENDED,&dwThreadID);)elsehThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_R0UTINE)(WP_WriterThread),&oThreadInfo[i],CREATE_SUSPENDED,&dwThreadID);1}for(i=0:i<nThreadCnt;i++)(ResumeThread(hThreads[i]);)WaitForMuItipIeObjects(nThreadCnt,hThreads,TRUE,INFINITE);printf("AlIreaderandwriterhavefinishedoperating.\n");}intmain(intargc,char*argv口){charch;whiIe(true)fppjntf("*************************************\n");printf("1.ReaderPriority\n");printf("2.WriterPriority。");printf("3.ExittoWindows\nH;prjntf("*************************************\n");printf("Enteryourchoice1,2,3:");do{ch=(char)_getch():Iwhile(ch!='1'&&ch!='2'&&ch!='3');system("cis");if(ch=='3')return0;elseif(ch==,1')ReaderPriority("thread,dat");elseWriterPriority("thread,datH;
printf("\nPressAnyKeytoCoutinue:");_getch();system("cIs");)return0;一、實驗內(nèi)容在Windows2023環(huán)境下,創(chuàng)建一個控制臺進程,此進程包含n個線程。用這n個線程來表達n個讀者或?qū)懻?。每個線程按相應(yīng)測試數(shù)據(jù)文獻(后面有介紹)的規(guī)定進行讀寫操作。用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。a讀者-寫者問題的讀寫操作限制(涉及讀者優(yōu)先和寫者優(yōu)先):1)寫一寫互斥,即不能有兩個寫者同時進行寫操作。2E讀一寫互斥,即不能同時有一個線程在讀,而另一個線程在寫。,3X)讀一讀允許,即可以有一個或多個讀者在讀。讀者優(yōu)先的附加限制:假如一個讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作。寫者優(yōu)先的附加限制:假如一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處在等待狀態(tài)后才干開始讀操作。A運營結(jié)果顯示規(guī)定:規(guī)定在每個線程創(chuàng)建、發(fā)出讀寫操作申請、開始讀寫操作和結(jié)束讀寫操作時分別顯示一行提醒信息,以擬定所有解決都遵守相應(yīng)的讀寫操作限制。二、實驗?zāi)康脑赪indows2023環(huán)境下,創(chuàng)建一個控制臺進程,此進程包含n個線程。用這n個線程來表達n個讀者或?qū)懻?。每個線程按相應(yīng)測試數(shù)據(jù)文獻(后面有介紹)的規(guī)定進行讀寫操作。用信號量機制分別實現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。三、實驗原理1)?讀者優(yōu)先a讀者優(yōu)先指的是除非有寫者在寫文獻,否則讀者不需要等待。所以可以用一個整型變量read_count記錄當(dāng)前的讀者數(shù)目,用于擬定是否需要釋放正在等待的寫者線程(當(dāng)read_count=0時,表白所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每一個讀者開始讀文獻時,必須修改read_count變量。因此需要一個互斥對象mutex來實現(xiàn)對全局變量readcount修改時的互斥。a此外,為了實現(xiàn)寫一寫互斥,需要增長一個臨界區(qū)對象writeo當(dāng)寫者發(fā)出寫請求時,必須申請臨界區(qū)對象的所有權(quán)。通過這種方法,也可以實現(xiàn)讀一寫互斥,當(dāng)read_count=l時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權(quán)。當(dāng)讀者擁有臨界區(qū)的所有權(quán)時,寫者阻塞在臨界區(qū)對象write上。當(dāng)寫者擁有臨界區(qū)的所有權(quán)時,第一個讀者判斷完〃read_count==l〃后阻塞在write上,其余的讀者由于等待對read_count的判斷,阻塞在mutex上。福).寫者優(yōu)先寫者優(yōu)先與讀者優(yōu)先類似;不同之處在于一旦一個寫者到來,它應(yīng)當(dāng)盡快對文獻進行寫操作,假如有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應(yīng)當(dāng)添加一個整型變量write_count,用于記錄正在等待的寫者的數(shù)目,當(dāng)write_count=0時,才可以釋放等待的讀者線程隊列。為了對全局變量write_count實現(xiàn)互斥,必須增長一個互斥對象mutex3o為了實現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)添加一個臨界區(qū)對象read,當(dāng)有寫者在寫文獻或等兇寺時,讀者必須阻塞在read上。-a讀者線程除了要對全局變量read_count實現(xiàn)操作上的互斥外,還必須有一個互斥對象對阻塞,read這一過程實現(xiàn)互斥。這兩個互斥對象分別命名為mutex1和mutex2oA四、實驗過程在Windows2023環(huán)境下,創(chuàng)建一個控制臺進程。用VC++實現(xiàn)。讀者優(yōu)先指的是除非有寫者在寫文獻,否則讀者不需要等待。所以可以用一個整型變量read_count記錄當(dāng)前的讀者數(shù)目,用于擬定是否需要釋放正在等待的寫者線程(當(dāng)read_count=0時,表白所有的讀者讀完,需要釋放寫者等待隊列中的一個寫者)。每一個讀者開始讀文獻時,必須修改read_count變量。因此需要一個互斥對象mutex來實現(xiàn)對全局變量read_count修改時的互斥。此外,為了實現(xiàn)寫一寫互斥,需要增長一個臨界區(qū)對象write。當(dāng)寫者發(fā)出寫請求時?,必須申請臨界區(qū)對象的所有權(quán)。通過這種方法,也可以實現(xiàn)讀-寫互斥,當(dāng)read_count=1時(即第一個讀者到來時),讀者線程也必須申請臨界區(qū)對象的所有權(quán)。a當(dāng)讀者擁有臨界區(qū)的所有權(quán)時,寫者阻塞在臨界區(qū)對象write上。當(dāng)寫者擁有臨界區(qū)的所有權(quán)時,第一個讀者判斷完〃read_count==l〃后阻塞在write上,其余的讀者由于等待對read_count的判斷,阻塞在mutex上。寫者優(yōu)先與讀者優(yōu)先類似;不同之處在于一旦一個寫者到來,它應(yīng)當(dāng)盡快對文獻進行寫操作,假如有一個寫者在等待,則新到來的讀者不允許進行讀操作。為此應(yīng)當(dāng)添加一個整型變量write_count,用于記錄正在等待的寫者的數(shù)目,當(dāng)write.count=0時,才可以釋放等待的讀者線程隊列。為了對全局變量write_count實現(xiàn)互斥,必須增長一個互斥對象mutex3。為了實現(xiàn)寫者優(yōu)先,應(yīng)當(dāng)添加一個臨界區(qū)對象read,當(dāng)有寫者在寫文獻或等待時,讀者必須阻塞在read上。?④讀者線程除了要對全局變量read_count實現(xiàn)操作上的互斥外,還必須有一個互斥對象對阻塞,read這一過程實現(xiàn)互斥。這兩個互斥對象分別命名為mulex1和mutex2o結(jié)構(gòu):頭文獻定義全局變量RP_ReaderThread()讀者優(yōu)先讀者線程RP_WriterThread()讀者優(yōu)先--寫者線程ReaderPriority()讀者優(yōu)先解決函數(shù)WP_ReaderThrea()寫者優(yōu)先一一讀者線程WP_WriterThread()寫者優(yōu)先——寫者線程WriterPriority()寫者優(yōu)先解決函數(shù)主函數(shù):包含對dat文獻的讀取以及函數(shù)的調(diào)用。代碼:附錄五、實驗結(jié)果界面:
.ReaderPriority.WriterPriority.ExittoUindowsEnteryourchoice!.,2,3:測試數(shù)據(jù):3R524R655W5.13結(jié)果讀者優(yōu)先ReaderPriority:Writethread2sentsthewritingrequire.Writerthread2beginstowritetothefile.Readerthread3sentsthereadingrequire.Writethread5sentsthewritingrequire.Readerthread4sentsthereadingrequire.file.Writethread2finishedwritingtothe13,file.13,川。rReaderReaderrrWriter13,川。rReaderReaderrrWriterthread3thread313,川。rReaderReaderrrWriterthread3thread3threadthreadthreadthreadbeginstoreadfile.beginstoreadfile.beginstoreadfile.finishedreadingfile.finishedreadingfile.beginstov/ritetotheWritethread5finishedwritingtothefile,file.Allreaderandwriterhauefinishedoperating.pressAnyKeytoCoutinue:寫者優(yōu)先Writerpriority:WriterWriterReaderWriterdeaderWriterWriterWriterBeaderBeaderBeaderReaderBeaderthread2thread2thread3thread5thread4thread2thread5thread5thread3thread3thread4thread3thread4sentsthewritingrequire.beginstosentsthesentsthesentsthewritetothefile.readingrequire,writingrequire.readingrequire.finishedwritingtothefile.beginstowritetothefile.finishedwritingtothefile.beginstoreadfile.WriterWriterReaderWriterdeaderWriterWriterWriterBeaderBeaderBeaderReaderBeaderthread2thread2thread3thread5thread4thread2thread5thread5thread3thread3thread4thread3thread4sentsthewritingrequire.beginstosentsthesentsthesentsthewritetothefile.readingrequire,writingrequire.readingrequire.finishedwritingtothefile.beginstowritetothefile.finishedwritingtothefile.beginstoreadfile.beginstoreadfile.beginstoreadfile.finishedreadingfile.finishedreadingfile.Allreaderandwriterhauefinishedoperating.PressAnyKeytoCoutinue:六、實驗心得體會通過對讀者寫者問題的編程,對線程有了更深的了解,希望在后面的學(xué)習(xí)中懂得更多。七、參考文獻老師提供的資料,以及互聯(lián)網(wǎng)查閱。八、附錄#incIude"windows.h"#incIude<conio.h>#incIude<stdIib.h>#incIude<fstream.h>#incIude<io.h>#include<string.h>
incIude<stdio.h>incIude"winbase.h"http://讀者//寫者#defineINTEPERSEC1000//每秒時鐘中斷的數(shù)目#defineMAXTHREADNUM64//最大線程數(shù)intnReaderCnt0;//讀者計數(shù)intnWriterCnt=0;寫者計數(shù)HANDLEhWrite::CreateSemaphor1,1,NULL);//寫開始信號HANDLEhRead=::CreateSemaphore(NULL,1,1,讀開始信號HANDLEhRCMutex::CreateMutex(NULL,FALSE,NULL);HANDLEhWCMutex::CreateMutex(NULL,FALSE,NULL);HANDLEhReadMutex::CreateMutex(NULL,FALSE,NULL);//從測試數(shù)據(jù)文獻中獲取的線程信息//讀者//寫者#defineINTEPERSEC1000//每秒時鐘中斷的數(shù)目#defineMAXTHREADNUM64//最大線程數(shù)intnReaderCnt0;//讀者計數(shù)intnWriterCnt=0;寫者計數(shù)HANDLEhWrite::CreateSemaphor1,1,NULL);//寫開始信號HANDLEhRead=::CreateSemaphore(NULL,1,1,讀開始信號HANDLEhRCMutex::CreateMutex(NULL,FALSE,NULL);HANDLEhWCMutex::CreateMutex(NULL,FALSE,NULL);HANDLEhReadMutex::CreateMutex(NULL,FALSE,NULL);//從測試數(shù)據(jù)文獻中獲取的線程信息structThreadInfoThreadInfo()nSeriaINo二0;dOpeTime=0.0;)//線程序號//線程序號//線程類別//線程延遲時間//線程讀寫操作時間charcTyp
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鏈家房屋買賣定金支付及退還標準協(xié)議
- 二零二五年度住房租賃補貼擔(dān)保服務(wù)合同
- 二零二五年度蘇州市教育機構(gòu)用工企業(yè)勞動合同書
- 二零二五年度云計算資源合作共享合同
- 2025年度電子商務(wù)平臺招防范合同法律風(fēng)險合作協(xié)議
- 2025年度涂料班組涂料行業(yè)市場分析咨詢合同
- 二零二五年度特色日租房短租體驗協(xié)議書
- 二零二五年度貸款居間代理及金融科技創(chuàng)新應(yīng)用合同
- 2025年度高端合同事務(wù)律師服務(wù)合同
- 2025年度智慧交通項目提前終止合同及交通設(shè)施移交協(xié)議
- 2025年鄂東高三語文2月調(diào)研聯(lián)考試卷附答案解析
- 滬教版數(shù)學(xué)四年級下冊全冊教案
- 數(shù)字孿生技術(shù) 課件 第1、2章 概述;數(shù)字孿生中的物聯(lián)網(wǎng)和人工智能
- 2025年廣東省廣晟控股集團有限公司招聘筆試參考題庫含答案解析
- 湖南省2023年普通高等學(xué)校對口招生考試英語試卷
- 2024年山東外貿(mào)職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 數(shù)字經(jīng)濟學(xué)導(dǎo)論-全套課件
- NB/T 10742-2021智能化綜采工作面設(shè)計規(guī)范
- 第6章向量空間ppt課件
- 醫(yī)療機構(gòu)聘用(返聘)證明
- 碘-淀粉比色法測定淀粉酶活力
評論
0/150
提交評論