版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
/蘭州交通大學(xué)操作系統(tǒng)課程設(shè)計(jì)課程:計(jì)算機(jī)操作系統(tǒng)題目:進(jìn)程同步(讀者--寫者)班級(jí):姓名:學(xué)號(hào):指導(dǎo)教師:日期:2012年12月21日目錄1題目 12設(shè)計(jì)概述 12.1問題描述 12.2采用信號(hào)量機(jī)制 13課程設(shè)計(jì)目的與功能 13.1設(shè)計(jì)目的 13.2設(shè)計(jì)功能 14總體設(shè)計(jì)思想概述 24.1功能流程圖 24.2開發(fā)平臺(tái)與源程序的主要部分 34.3數(shù)據(jù)結(jié)構(gòu) 34.4模塊說明 34.5源程序 35測(cè)試用例,運(yùn)行結(jié)果與運(yùn)行情況分析 125.1測(cè)試用例 125.2運(yùn)行結(jié)果 125.3運(yùn)行結(jié)果分析 146總結(jié)與心得 151題目進(jìn)程同步模擬設(shè)計(jì)——讀者和寫者問題2設(shè)計(jì)概述2.1問題描述模擬用信號(hào)量機(jī)制實(shí)現(xiàn)讀者和寫者問題,即有兩組并發(fā)進(jìn)程:讀者和寫者,共享一組數(shù)據(jù)區(qū),進(jìn)行讀寫操作,要求任一時(shí)刻“寫者”最多只允許一個(gè),而“讀者”則允許多個(gè)。2.1.1要求允許多個(gè)讀者同時(shí)執(zhí)行讀操作;不允許讀者、寫者同時(shí)操作;不允許多個(gè)寫者同時(shí)操作。2.1.2讀者和寫者的相互關(guān)系:2.2采用信號(hào)量機(jī)制1)Wmutex表示讀寫的互斥信號(hào)量,初值:Wmutex=1;2)公共變量Rcount表示“正在讀”的進(jìn)程數(shù),初值:Rcount=0;3)Rmutex:表示對(duì)Rcount的互斥操作,初值:Rmutex=1。3課程設(shè)計(jì)目的與功能3.1設(shè)計(jì)目的通過實(shí)驗(yàn)?zāi)M讀者和寫者之間的關(guān)系,了解并掌握他們之間的關(guān)系與其原理。由此增加對(duì)進(jìn)程同步的問題的了解。具體如下:1)掌握基本的同步互斥算法,理解讀者和寫者模型;2)了解windows中多線程(多進(jìn)程)的并發(fā)執(zhí)行機(jī)制,線程(進(jìn)程)間的同步和互斥;3)學(xué)習(xí)使用windows中基本的同步對(duì)象,掌握相應(yīng)的API。3.2設(shè)計(jì)功能利用模擬用信號(hào)量機(jī)制實(shí)現(xiàn)讀者和寫者問題:通過用戶控制讀進(jìn)程和寫進(jìn)程,反應(yīng)讀者和寫者問題中所涉與的進(jìn)程的同步與互斥。4總體設(shè)計(jì)思想概述4.1功能流程圖開始開始輸入讀者和寫者個(gè)數(shù)用戶進(jìn)行選擇操作操作運(yùn)行進(jìn)程讀者進(jìn)程同時(shí)進(jìn)行讀操作,寫者依次進(jìn)入等待第一個(gè)寫者進(jìn)行寫操作,后面進(jìn)程依次進(jìn)入等待狀態(tài)多進(jìn)程?NNo.1寫者?YY用戶進(jìn)行選擇操作操作結(jié)束N4.2開發(fā)平臺(tái)與源程序的主要部分本實(shí)驗(yàn)用C++語言在VisualC++6.0中編程。4.3數(shù)據(jù)結(jié)構(gòu)intr_num;//讀者個(gè)數(shù)intw_num;//寫者個(gè)數(shù)intWmutex=1;//表示允許寫或允許讀intRcount=0;//表示正在讀的進(jìn)程數(shù)intRmutex=1;//表示對(duì)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表示正在寫//表示等待隊(duì)列,0-9表示寫者,10時(shí)需引入讀者的等待隊(duì)列,-1表示空intw_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//讀者的等待隊(duì)列,0-9表示對(duì)應(yīng)的讀者,-1為空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};4.4模塊說明四組P、V函數(shù):1)寫者進(jìn)程由3個(gè)函數(shù)組成voidwrite_p(inti)//模擬寫者對(duì)Wmutex的P操作,同時(shí)也作為寫者進(jìn)程的入口voidwrite(inti)//開始寫操作voidwrite_v(inti)//模擬寫者對(duì)Wmutex的V操作,寫操作完成的時(shí)候調(diào)用2)讀者進(jìn)程由8個(gè)函數(shù)組成voidradd_p(inti)//模擬讀之前對(duì)Rmutex的P操作,同時(shí)也作為讀者進(jìn)程的入口voidradd(inti)//Rcount加1voidread_p(inti)//模擬讀者對(duì)Wmutex的P操作voidradd_v(inti)//模擬讀之前對(duì)Rmutex的V操作voidread(inti)//讀voidrsub_p(inti)//模擬讀之后對(duì)Rmutex的P操作,讀操作完成的時(shí)候調(diào)用voidrsub(inti)//Rcount減1voidread_v(inti)//模擬讀者對(duì)Wmutex的V操作voidrsub_v(inti)//模擬讀之后對(duì)Rmutex的V操作4.5源程序#include<stdio.h>#include<windows.h>#include<process.h>#include<iostream>usingnamespacestd;intr_num;//讀者個(gè)數(shù)intw_num;//寫者個(gè)數(shù)intWmutex=1;//表示允許寫或允許讀intRcount=0;//表示正在讀的進(jìn)程數(shù)intRmutex=1;//表示對(duì)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};//表示等待隊(duì)列,0-9表示寫者,10時(shí)需引入讀者的等待隊(duì)列,-1表示空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//讀者的等待隊(duì)列,0-9表示對(duì)應(yīng)的讀者,-1為空voidwrite_p(inti);//模擬寫者對(duì)Wmutex的P操作,同時(shí)也作為寫者進(jìn)程的入口voidwrite(inti);//開始寫操作voidwrite_v(inti);//模擬寫者對(duì)Wmutex的V操作,寫操作完成的時(shí)候調(diào)用voidradd_p(inti);//模擬讀之前對(duì)Rmutex的P操作,同時(shí)也作為讀者進(jìn)程的入口voidradd(inti);//Rcount加1voidread_p(inti);//模擬讀者對(duì)Wmutex的P操作voidradd_v(inti);//模擬讀之前對(duì)Rmutex的V操作voidread(inti);//讀voidrsub_p(inti);//模擬讀之后對(duì)Rmutex的P操作,讀操作完成的時(shí)候調(diào)用voidrsub(inti);//Rcount減1voidread_v(inti);//模擬讀者對(duì)Wmutex的V操作voidrsub_v(inti);//模擬讀之后對(duì)Rmutex的V操作//模擬寫者對(duì)Wmutex的P操作,同時(shí)為寫者進(jìn)程也作寫的入口voidwrite_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,則該寫者進(jìn)入等待隊(duì)列 { w_wait[-Wmutex-1]=i; } else write(i);}//進(jìn)行寫操作voidwrite(inti){ w[i]=1;}//模擬寫者對(duì)Wmutex的V操作,寫操作完成的時(shí)候調(diào)用voidwrite_v(inti){ w[i]=0; Wmutex++; if(Wmutex<=0) //表示如果Wmutex<=0,則從等待隊(duì)列中選擇寫者或讀者進(jìn)行操作 { 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); } }}//模擬讀之前對(duì)Rmutex的P操作,同時(shí)也作為讀者進(jìn)程的入口voidradd_p(inti){ Rmutex--; if(Rmutex<0)//表示如果Rmutex<0,則進(jìn)入等待隊(duì)列 { r_wait[-Rmutex]=i; } else radd(i);}//對(duì)于Rcount加1的控制voidradd(inti){ Rcount++; if(Rcount==1) read_p(i); else radd_v(i);}//模擬讀者對(duì)Wmutex的P操作:voidread_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,則進(jìn)入等待隊(duì)列 { w_wait[-Wmutex-1]=10; r_wait[0]=i; } else radd_v(i);}//模擬讀之前對(duì)Rmutex的V操作voidradd_v(inti){ Rmutex++; if(Rmutex<=0)//表示如果Rmutex<=0,則從等待隊(duì)列中選擇讀者進(jìn)入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);}//進(jìn)行讀操作voidread(inti){ r[i]=1;}//模擬讀之后對(duì)Rmutex的P操作,讀操作完成的時(shí)候調(diào)用voidrsub_p(inti){ r[i]=0; Rmutex--; rsub(i);}//對(duì)Rcount減1的控制voidrsub(inti){ Rcount--; if(Rcount==0) read_v(i); else rsub_v(i);}//模擬讀者對(duì)Wmutex的V操作voidread_v(inti){ Wmutex++; if(Wmutex<=0)//表示如果Wmutex<=0,則從等待隊(duì)列中選擇寫者或讀者進(jìn)行操作 { 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);}//模擬讀之后對(duì)Rmutex的V操作voidrsub_v(inti){ Rmutex++;}intmain(){ cout<<"\t\t\t==========讀者--寫者問題演示=========="<<endl; cout<<endl; cout<<"請(qǐng)輸入寫者個(gè)數(shù)(1-10):"; cin>>w_num; while(w_num<1||w_num>10) { cout<<"輸入有誤,請(qǐng)重新輸入寫者個(gè)數(shù)(1-10):"; cin>>w_num; }//完成對(duì)寫者個(gè)數(shù)的輸入 cout<<"請(qǐng)輸入讀者個(gè)數(shù)(1-10):"; cin>>r_num; while(r_num<1||r_num>10) { cout<<"輸入有誤,請(qǐng)重新輸入讀者個(gè)數(shù)(1-10):"; cin>>r_num; }//完成對(duì)讀者個(gè)數(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<<"等待隊(duì)列中無對(duì)象········"<<endl; cout<<endl; } else { cout<<"等待隊(duì)列中有:"; 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<<"申請(qǐng)"; 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<<"申請(qǐng)"; else cout<<"完成"; } cout<<"("<<(w_num+r_num+1)<<")結(jié)束"<<endl;cout<<"請(qǐng)輸入選項(xiàng)序號(hào):"; cin>>x; while(x<1||x>(w_num+r_num+1)||a[x-1]==1) { if(a[x-1]==1) cout<<"該對(duì)象已在等待隊(duì)列中,請(qǐng)重新輸入:"; else cout<<"輸入有誤,請(qǐng)重新輸入:"; 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測(cè)試用例,運(yùn)行結(jié)果與運(yùn)行情況分析5.1測(cè)試用例本程序模擬讀者和寫者問題,每個(gè)讀者和寫者對(duì)讀操作或?qū)懖僮鞯纳暾?qǐng)和完成都由用戶手動(dòng)選擇。測(cè)試用例如下:輸入寫者個(gè)數(shù):3輸入讀者個(gè)數(shù):53、寫者1申請(qǐng)寫操作(選擇選項(xiàng)(1))4、寫者3申請(qǐng)寫操作(選擇選項(xiàng)(3))5、讀者2申請(qǐng)讀操作(選擇選項(xiàng)(5))6、寫者1完成寫操作(選擇選項(xiàng)(1))7、讀者5申請(qǐng)讀操作(選擇選項(xiàng)(8))8、寫者3完成寫操作(選擇選項(xiàng)(3))9、讀者5完成讀操作(選擇選項(xiàng)(8))10、讀者2完成讀操作(選擇選項(xiàng)(5))11、結(jié)束(選擇選項(xiàng)(9))5.2運(yùn)行結(jié)果結(jié)果一:結(jié)果二:結(jié)果三:5.3運(yùn)行結(jié)果分析1、輸入寫者個(gè)數(shù):32、輸入讀者個(gè)數(shù):53、剛開始時(shí)Wmutex=1Rcount=0Rmutex=1,寫者1申請(qǐng)寫操作,此時(shí),信號(hào)量Wmutex減1,所以Wmutex=0,寫者1可以直接開始寫操作4、寫者3申請(qǐng)寫操作此時(shí),信號(hào)量Wmutex減1,所以Wmutex=-1,寫者1正在寫,所以寫者3進(jìn)入等待隊(duì)列5、讀者2申請(qǐng)讀操作此時(shí),信號(hào)量Rmutex減1,所以Rmutex=0,Rcount加1,所以Rcount=1,又因?yàn)镽count=1,所以Wmutex減1,Wmutex=-2,寫者1正在寫,所以讀者2進(jìn)入等待隊(duì)列6、寫者1完成寫操作此時(shí),信號(hào)量Wmutex加1,所以Wmutex=-1,寫者3開始寫操作7、讀者5申請(qǐng)讀操作此時(shí),信號(hào)量Rmutex減1,所以Rmutex=-1,讀者2還在Rcount的臨界區(qū)中,所以讀者5等待8、寫者3完成寫操作此時(shí),信號(hào)量Wmutex加1,所以Wmutex=0,讀者2從等待隊(duì)列中取出,并且Rmutex加1,則Rmutex=0,讀者2開始讀操作,讀者5進(jìn)入Rcount的臨界區(qū),Rcount加1,Rcount=2,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司綜合管理部工作總結(jié)及2025年工作計(jì)劃
- 公司部門人員工作計(jì)劃范文書
- 2025幼兒園學(xué)期工作計(jì)劃表
- 一:主席團(tuán)工作計(jì)劃
- 2025年秋季幼兒園小班工作計(jì)劃
- 人事年度工作計(jì)劃范文
- 學(xué)校班集體工作計(jì)劃報(bào)告寫作
- 幼兒園春季學(xué)期大班工作計(jì)劃
- 《多變的價(jià)格》課件
- 《型數(shù)控系統(tǒng)簡(jiǎn)介》課件
- 危急值的考試題及答案
- 法務(wù)崗位招聘面試題及回答建議(某大型央企)2024年
- 職業(yè)生涯規(guī)劃-體驗(yàn)式學(xué)習(xí)智慧樹知到期末考試答案章節(jié)答案2024年華僑大學(xué)
- 2024年華潤(rùn)電力投資有限公司招聘筆試參考題庫含答案解析
- 湘少版六年級(jí)英語上冊(cè)《Unit 12 第二課時(shí)(Part CPart D)》課堂教學(xué)課件公開課
- 人工挖探孔專項(xiàng)施工方案(共17頁)
- 復(fù)合肥料配方大公開
- ZDJ9系列轉(zhuǎn)轍機(jī)課件
- 鄰近營(yíng)業(yè)線施工方案)
- 揚(yáng)州市梅嶺二年級(jí)數(shù)學(xué)上冊(cè)期末復(fù)習(xí)試卷(一)及答案
- 新西蘭旅行計(jì)劃日行程單簽證
評(píng)論
0/150
提交評(píng)論