版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
/蘭州交通大學(xué)操作系統(tǒng)課程設(shè)計課程:計算機操作系統(tǒng)題目:進程同步(讀者--寫者)班級:姓名:學(xué)號:指導(dǎo)教師:日期:2012年12月21日目錄1題目 12設(shè)計概述 12.1問題描述 12.2采用信號量機制 13課程設(shè)計目的與功能 13.1設(shè)計目的 13.2設(shè)計功能 14總體設(shè)計思想概述 24.1功能流程圖 24.2開發(fā)平臺與源程序的主要部分 34.3數(shù)據(jù)結(jié)構(gòu) 34.4模塊說明 34.5源程序 35測試用例,運行結(jié)果與運行情況分析 125.1測試用例 125.2運行結(jié)果 125.3運行結(jié)果分析 146總結(jié)與心得 151題目進程同步模擬設(shè)計——讀者和寫者問題2設(shè)計概述2.1問題描述模擬用信號量機制實現(xiàn)讀者和寫者問題,即有兩組并發(fā)進程:讀者和寫者,共享一組數(shù)據(jù)區(qū),進行讀寫操作,要求任一時刻“寫者”最多只允許一個,而“讀者”則允許多個。2.1.1要求允許多個讀者同時執(zhí)行讀操作;不允許讀者、寫者同時操作;不允許多個寫者同時操作。2.1.2讀者和寫者的相互關(guān)系:2.2采用信號量機制1)Wmutex表示讀寫的互斥信號量,初值:Wmutex=1;2)公共變量Rcount表示“正在讀”的進程數(shù),初值:Rcount=0;3)Rmutex:表示對Rcount的互斥操作,初值:Rmutex=1。3課程設(shè)計目的與功能3.1設(shè)計目的通過實驗?zāi)M讀者和寫者之間的關(guān)系,了解并掌握他們之間的關(guān)系與其原理。由此增加對進程同步的問題的了解。具體如下:1)掌握基本的同步互斥算法,理解讀者和寫者模型;2)了解windows中多線程(多進程)的并發(fā)執(zhí)行機制,線程(進程)間的同步和互斥;3)學(xué)習(xí)使用windows中基本的同步對象,掌握相應(yīng)的API。3.2設(shè)計功能利用模擬用信號量機制實現(xiàn)讀者和寫者問題:通過用戶控制讀進程和寫進程,反應(yīng)讀者和寫者問題中所涉與的進程的同步與互斥。4總體設(shè)計思想概述4.1功能流程圖開始開始輸入讀者和寫者個數(shù)用戶進行選擇操作操作運行進程讀者進程同時進行讀操作,寫者依次進入等待第一個寫者進行寫操作,后面進程依次進入等待狀態(tài)多進程?NNo.1寫者?YY用戶進行選擇操作操作結(jié)束N4.2開發(fā)平臺與源程序的主要部分本實驗用C++語言在VisualC++6.0中編程。4.3數(shù)據(jù)結(jié)構(gòu)intr_num;//讀者個數(shù)intw_num;//寫者個數(shù)intWmutex=1;//表示允許寫或允許讀intRcount=0;//表示正在讀的進程數(shù)intRmutex=1;//表示對Rcount的互斥操作intr[10]={0,0,0,0,0,0,0,0,0,0};//表示讀者的狀態(tài),1表示正在讀intw[10]={0,0,0,0,0,0,0,0,0,0};//表示寫者的狀態(tài),1表示正在寫//表示等待隊列,0-9表示寫者,10時需引入讀者的等待隊列,-1表示空intw_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//讀者的等待隊列,0-9表示對應(yīng)的讀者,-1為空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};4.4模塊說明四組P、V函數(shù):1)寫者進程由3個函數(shù)組成voidwrite_p(inti)//模擬寫者對Wmutex的P操作,同時也作為寫者進程的入口voidwrite(inti)//開始寫操作voidwrite_v(inti)//模擬寫者對Wmutex的V操作,寫操作完成的時候調(diào)用2)讀者進程由8個函數(shù)組成voidradd_p(inti)//模擬讀之前對Rmutex的P操作,同時也作為讀者進程的入口voidradd(inti)//Rcount加1voidread_p(inti)//模擬讀者對Wmutex的P操作voidradd_v(inti)//模擬讀之前對Rmutex的V操作voidread(inti)//讀voidrsub_p(inti)//模擬讀之后對Rmutex的P操作,讀操作完成的時候調(diào)用voidrsub(inti)//Rcount減1voidread_v(inti)//模擬讀者對Wmutex的V操作voidrsub_v(inti)//模擬讀之后對Rmutex的V操作4.5源程序#include<stdio.h>#include<windows.h>#include<process.h>#include<iostream>usingnamespacestd;intr_num;//讀者個數(shù)intw_num;//寫者個數(shù)intWmutex=1;//表示允許寫或允許讀intRcount=0;//表示正在讀的進程數(shù)intRmutex=1;//表示對Rcount的互斥操作intr[10]={0,0,0,0,0,0,0,0,0,0};//表示讀者的狀態(tài),1表示正在讀intw[10]={0,0,0,0,0,0,0,0,0,0};//表示寫者的狀態(tài),1表示正在寫intw_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//表示等待隊列,0-9表示寫者,10時需引入讀者的等待隊列,-1表示空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//讀者的等待隊列,0-9表示對應(yīng)的讀者,-1為空voidwrite_p(inti);//模擬寫者對Wmutex的P操作,同時也作為寫者進程的入口voidwrite(inti);//開始寫操作voidwrite_v(inti);//模擬寫者對Wmutex的V操作,寫操作完成的時候調(diào)用voidradd_p(inti);//模擬讀之前對Rmutex的P操作,同時也作為讀者進程的入口voidradd(inti);//Rcount加1voidread_p(inti);//模擬讀者對Wmutex的P操作voidradd_v(inti);//模擬讀之前對Rmutex的V操作voidread(inti);//讀voidrsub_p(inti);//模擬讀之后對Rmutex的P操作,讀操作完成的時候調(diào)用voidrsub(inti);//Rcount減1voidread_v(inti);//模擬讀者對Wmutex的V操作voidrsub_v(inti);//模擬讀之后對Rmutex的V操作//模擬寫者對Wmutex的P操作,同時為寫者進程也作寫的入口voidwrite_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,則該寫者進入等待隊列 { w_wait[-Wmutex-1]=i; } else write(i);}//進行寫操作voidwrite(inti){ w[i]=1;}//模擬寫者對Wmutex的V操作,寫操作完成的時候調(diào)用voidwrite_v(inti){ w[i]=0; Wmutex++; if(Wmutex<=0) //表示如果Wmutex<=0,則從等待隊列中選擇寫者或讀者進行操作 { intk,j; if((w_wait[0]>=0)&&(w_wait[0]<w_num)) { j=w_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; write(j); } else { j=r_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd_v(j); } }}//模擬讀之前對Rmutex的P操作,同時也作為讀者進程的入口voidradd_p(inti){ Rmutex--; if(Rmutex<0)//表示如果Rmutex<0,則進入等待隊列 { r_wait[-Rmutex]=i; } else radd(i);}//對于Rcount加1的控制voidradd(inti){ Rcount++; if(Rcount==1) read_p(i); else radd_v(i);}//模擬讀者對Wmutex的P操作:voidread_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,則進入等待隊列 { w_wait[-Wmutex-1]=10; r_wait[0]=i; } else radd_v(i);}//模擬讀之前對Rmutex的V操作voidradd_v(inti){ Rmutex++; if(Rmutex<=0)//表示如果Rmutex<=0,則從等待隊列中選擇讀者進入Rcount的臨界區(qū) { intk,j; j=r_wait[0]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd(j); } read(i);}//進行讀操作voidread(inti){ r[i]=1;}//模擬讀之后對Rmutex的P操作,讀操作完成的時候調(diào)用voidrsub_p(inti){ r[i]=0; Rmutex--; rsub(i);}//對Rcount減1的控制voidrsub(inti){ Rcount--; if(Rcount==0) read_v(i); else rsub_v(i);}//模擬讀者對Wmutex的V操作voidread_v(inti){ Wmutex++; if(Wmutex<=0)//表示如果Wmutex<=0,則從等待隊列中選擇寫者或讀者進行操作 { intk,j; if((w_wait[0]>=0)&&(w_wait[0]<w_num)) { j=w_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; write(j); } else { j=r_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd_v(j); } } rsub_v(i);}//模擬讀之后對Rmutex的V操作voidrsub_v(inti){ Rmutex++;}intmain(){ cout<<"\t\t\t==========讀者--寫者問題演示=========="<<endl; cout<<endl; cout<<"請輸入寫者個數(shù)(1-10):"; cin>>w_num; while(w_num<1||w_num>10) { cout<<"輸入有誤,請重新輸入寫者個數(shù)(1-10):"; cin>>w_num; }//完成對寫者個數(shù)的輸入 cout<<"請輸入讀者個數(shù)(1-10):"; cin>>r_num; while(r_num<1||r_num>10) { cout<<"輸入有誤,請重新輸入讀者個數(shù)(1-10):"; cin>>r_num; }//完成對讀者個數(shù)的輸入intx,k,j,a[20]; while(1) { cout<<"***********************************************************"<<endl; for(k=0;k<20;k++) a[k]=0; cout<<"Wmutex="<<Wmutex<<"\t"<<"Rcount="<<Rcount<<"\t"<<"Rmutex="<<Rmutex<<endl; cout<<endl; for(k=0;k<w_num;k++) { if(w[k]==1) cout<<"==========寫者"<<(k+1)<<"正在寫=========="<<endl; } for(k=0;k<r_num;k++) { if(r[k]==1) cout<<"==========讀者"<<(k+1)<<"正在讀=========="<<endl; } if(w_wait[0]==-1){ cout<<"等待隊列中無對象········"<<endl; cout<<endl; } else { cout<<"等待隊列中有:"; for(k=0;k<w_num;k++) { if(w_wait[k]==10) for(j=0;j<5;j++) { if(r_wait[j]!=-1) cout<<"-->"<<"讀者"<<(r_wait[j]+1)<<"\t"; } if((w_wait[k]>=0)&&(w_wait[k]<w_num)) cout<<"-->"<<"寫者"<<(w_wait[k]+1)<<"\t"; } cout<<endl; } for(k=0;k<w_num;k++) { x=0; for(j=0;j<w_num;j++) { if(k==w_wait[j]) { a[k]=1; x=1; } } if(x==1) continue; cout<<"("<<(k+1)<<")寫者"<<(k+1); if(w[k]==0) cout<<"申請"; else cout<<"完成"; } for(k=0;k<r_num;k++) { x=0; for(j=0;j<r_num;j++) { if(k==r_wait[j]) { a[k+w_num]=1; x=1; } } if(x==1) continue; cout<<"("<<(k+1+w_num)<<")讀者"<<(k+1); if(r[k]==0) cout<<"申請"; else cout<<"完成"; } cout<<"("<<(w_num+r_num+1)<<")結(jié)束"<<endl;cout<<"請輸入選項序號:"; cin>>x; while(x<1||x>(w_num+r_num+1)||a[x-1]==1) { if(a[x-1]==1) cout<<"該對象已在等待隊列中,請重新輸入:"; else cout<<"輸入有誤,請重新輸入:"; cin>>x; } for(k=0;k<w_num;k++) { if(x==(k+1)) { if(w[k]==0) write_p(k); else write_v(k); break; } } for(k=0;k<r_num;k++) { if(x==(k+1+w_num)) { if(r[k]==0) radd_p(k); else rsub_p(k); break; } } if(x==(w_num+r_num+1)) return0; }}5測試用例,運行結(jié)果與運行情況分析5.1測試用例本程序模擬讀者和寫者問題,每個讀者和寫者對讀操作或?qū)懖僮鞯纳暾埡屯瓿啥加捎脩羰謩舆x擇。測試用例如下:輸入寫者個數(shù):3輸入讀者個數(shù):53、寫者1申請寫操作(選擇選項(1))4、寫者3申請寫操作(選擇選項(3))5、讀者2申請讀操作(選擇選項(5))6、寫者1完成寫操作(選擇選項(1))7、讀者5申請讀操作(選擇選項(8))8、寫者3完成寫操作(選擇選項(3))9、讀者5完成讀操作(選擇選項(8))10、讀者2完成讀操作(選擇選項(5))11、結(jié)束(選擇選項(9))5.2運行結(jié)果結(jié)果一:結(jié)果二:結(jié)果三:5.3運行結(jié)果分析1、輸入寫者個數(shù):32、輸入讀者個數(shù):53、剛開始時Wmutex=1Rcount=0Rmutex=1,寫者1申請寫操作,此時,信號量Wmutex減1,所以Wmutex=0,寫者1可以直接開始寫操作4、寫者3申請寫操作此時,信號量Wmutex減1,所以Wmutex=-1,寫者1正在寫,所以寫者3進入等待隊列5、讀者2申請讀操作此時,信號量Rmutex減1,所以Rmutex=0,Rcount加1,所以Rcount=1,又因為Rcount=1,所以Wmutex減1,Wmutex=-2,寫者1正在寫,所以讀者2進入等待隊列6、寫者1完成寫操作此時,信號量Wmutex加1,所以Wmutex=-1,寫者3開始寫操作7、讀者5申請讀操作此時,信號量Rmutex減1,所以Rmutex=-1,讀者2還在Rcount的臨界區(qū)中,所以讀者5等待8、寫者3完成寫操作此時,信號量Wmutex加1,所以Wmutex=0,讀者2從等待隊列中取出,并且Rmutex加1,則Rmutex=0,讀者2開始讀操作,讀者5進入Rcount的臨界區(qū),Rcount加1,Rcount=2,
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2181-2024塑料薄膜和薄片氧氣透過率測試儀校準規(guī)范
- 2024年版簡易個人向公司借款合同模板
- 2024年版權(quán)授權(quán)費用協(xié)議
- 杞縣特色小鎮(zhèn)投資建設(shè)研究報告
- 硫酸鹽項目申請報告可行性研究報告
- 中秋節(jié)假日作文大全10篇
- 水滸傳每章讀書筆記
- 雙十一促銷活動策劃方案8篇
- 保護樹木的建議書模板匯編十篇
- 法律執(zhí)法課程設(shè)計
- 普外科醫(yī)療組長競聘演講
- 北京市朝陽區(qū)2022-2023學(xué)年三年級上學(xué)期英語期末試卷
- 嗶哩嗶哩MATES人群資產(chǎn)經(jīng)營白皮書【嗶哩嗶哩】
- 【歷史】第一、二單元測試題2024~2025學(xué)年統(tǒng)編版七年級歷史上冊
- 婚姻家庭規(guī)劃
- 認識實習(xí)報告(10篇)
- 【MOOC】內(nèi)科護理學(xué)-中山大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年商業(yè)地產(chǎn)買賣合同樣本
- 2023-2024學(xué)年廣東省深圳市福田區(qū)七年級(上)期末英語試卷
- 雙碳全景系列培訓(xùn)第一章碳達峰、碳中和
- 【企業(yè)盈利能力探析的國內(nèi)外文獻綜述2400字】
評論
0/150
提交評論