




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、摘要 一個(gè)數(shù)據(jù)文件或記錄可被多個(gè)進(jìn)程共享,我們把只要求讀該文件的進(jìn)程稱為“Reader進(jìn)程,其他進(jìn)程那么稱為“Writer進(jìn)程。允許多個(gè)進(jìn)程同時(shí)讀一個(gè)共享文件,因?yàn)樽x操作不會(huì)使數(shù)據(jù)文件混亂。但不允許一個(gè)Writer進(jìn)程和其他Reader進(jìn)程或Writer進(jìn)程同時(shí)訪問(wèn)共享對(duì)象,因?yàn)檫@種訪問(wèn)會(huì)引起混亂。所謂“讀者寫者問(wèn)題是指保證一個(gè)Writer進(jìn)程必須與其他進(jìn)程互斥的訪問(wèn)共享對(duì)象的同步問(wèn)題。目錄 TOC o 1-3 h z u HYPERLINK l _Toc413356819 1. 概述 PAGEREF _Toc413356819 h 4 HYPERLINK l _Toc413356820 2.
2、 課程設(shè)計(jì)任務(wù)及要求 PAGEREF _Toc413356820 h 5 HYPERLINK l _Toc413356821 2.1 設(shè)計(jì)任務(wù) PAGEREF _Toc413356821 h 5 HYPERLINK l _Toc413356822 2.2 設(shè)計(jì)要求 PAGEREF _Toc413356822 h 5 HYPERLINK l _Toc413356823 2.3 任務(wù)分工 PAGEREF _Toc413356823 h 5 HYPERLINK l _Toc413356824 3. 算法及數(shù)據(jù)結(jié)構(gòu) PAGEREF _Toc413356824 h 6 HYPERLINK l _Toc4
3、13356825 算法的總體思想 PAGEREF _Toc413356825 h 6 HYPERLINK l _Toc413356826 輸入讀/寫者模塊 PAGEREF _Toc413356826 h 6 HYPERLINK l _Toc413356827 查看讀/寫者模塊 PAGEREF _Toc413356827 h 6 HYPERLINK l _Toc413356828 3.4 主要的數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù) PAGEREF _Toc413356828 h 7 HYPERLINK l _Toc413356829 4.1 程序流程圖 PAGEREF _Toc413356829 h 9 HYPERL
4、INK l _Toc413356830 4.2 程序代碼 PAGEREF _Toc413356830 h 10 HYPERLINK l _Toc413356831 4.3 實(shí)驗(yàn)結(jié)果 PAGEREF _Toc413356831 h 15 HYPERLINK l _Toc413356832 5. 結(jié)論 PAGEREF _Toc413356832 h 17 HYPERLINK l _Toc413356833 6. 收獲、體會(huì)和建議 PAGEREF _Toc413356833 h 18 HYPERLINK l _Toc413356834 6.1 黃宏亮心得體會(huì) PAGEREF _Toc41335683
5、4 h 18 HYPERLINK l _Toc413356835 6.2 林派騰心得體會(huì) PAGEREF _Toc413356835 h 18 HYPERLINK l _Toc413356836 7. 參考文獻(xiàn) PAGEREF _Toc413356836 h 19概述 讀寫者問(wèn)題,就是指讀進(jìn)程跟寫進(jìn)程同時(shí)訪問(wèn)共享一個(gè)對(duì)象的問(wèn)題,將所有讀者和所有寫者分別存于一個(gè)讀者等待隊(duì)列和一個(gè)寫者等待隊(duì)列中,每當(dāng)讀允許時(shí),就從讀者隊(duì)列中釋放一個(gè)或多個(gè)讀者線程進(jìn)行讀操作;每當(dāng)寫允許時(shí),就從寫者隊(duì)列中釋放一個(gè)寫者進(jìn)行寫操作。讀寫平等策略,就是讀進(jìn)程跟寫進(jìn)程的優(yōu)先級(jí)一樣,當(dāng)同時(shí)有讀進(jìn)程和寫進(jìn)程請(qǐng)求操作時(shí),按鏈表的順
6、序讓進(jìn)程對(duì)該對(duì)象進(jìn)行操作,讀進(jìn)程可多個(gè)同時(shí)進(jìn)行,寫進(jìn)程只能有一個(gè)進(jìn)行。課程設(shè)計(jì)任務(wù)及要求2.1 設(shè)計(jì)任務(wù)用高級(jí)語(yǔ)言編寫和調(diào)試一個(gè)采用“讀寫平等策略的“讀者-寫者問(wèn)題的模擬程序。2.2 設(shè)計(jì)要求1讀者與寫者至少包括ID、進(jìn)入內(nèi)存時(shí)間、讀寫時(shí)間三項(xiàng)內(nèi)容,可在界面上進(jìn)行輸入。2) 讀者與寫者均有兩個(gè)以上,可在程序運(yùn)行期間進(jìn)行動(dòng)態(tài)增加讀者與寫者。3) 可讀取樣例數(shù)據(jù)要求存放在外部文件中,進(jìn)行讀者/寫者、進(jìn)入內(nèi)存時(shí)間、讀寫時(shí)間的初始化。4) 要求將運(yùn)行過(guò)程用可視化界面動(dòng)態(tài)顯示,可隨時(shí)暫停,查看閱覽室中讀者/寫者數(shù)目、讀者等待隊(duì)列、讀寫時(shí)間、等待時(shí)間。5) 讀寫策略:讀寫互斥、寫寫互斥、讀寫平等嚴(yán)格按照讀
7、者與寫者到達(dá)的順序進(jìn)入閱覽室,有寫者到達(dá),那么阻塞后續(xù)到達(dá)的讀者;有讀者到達(dá),那么阻塞后續(xù)到達(dá)的寫者。2.3 任務(wù)分工時(shí)間成員姓名任務(wù)完成情況第1天上午黃宏亮功能分析,查找資料完成林派騰查找資料第1天下午黃宏亮參考資料,分析算法完成林派騰參考資料,分析算法第2天上午黃宏亮編寫代碼,調(diào)試代碼完成林派騰調(diào)試代碼,查找問(wèn)題第2天下午黃宏亮測(cè)試功能,編寫課程設(shè)計(jì)報(bào)告完成林派騰測(cè)試功能,編寫并修改課程設(shè)計(jì)報(bào)告第3天上午黃宏亮完善課程設(shè)計(jì)報(bào)告完成林派騰完善課程設(shè)計(jì)報(bào)告算法及數(shù)據(jù)結(jié)構(gòu)三個(gè)線性鏈表,分別為h1、h2、h3。h1為寫入序列,h2為就緒序列,h3為執(zhí)行序列。其中h1用來(lái)存放輸入進(jìn)去的讀者和寫者的信
8、息,h2根據(jù)讀入內(nèi)存的時(shí)間將h1中的讀者寫者的信息進(jìn)行排序,并將排完序的讀者與寫者信息存在h2中,把h2的內(nèi)容調(diào)入到執(zhí)行序列h3中,從而執(zhí)行要求的內(nèi)容。3.2輸入讀/寫者模塊 通過(guò)手動(dòng)輸入讀寫者的信息、包括讀寫者的進(jìn)入內(nèi)存時(shí)間、進(jìn)程序號(hào)、讀或?qū)?r or w) 類型、開始時(shí)間、執(zhí)行時(shí)間。數(shù)據(jù)結(jié)構(gòu) process *h1=NULL,*h2=NULL,*h3=NULL;/三個(gè)鏈表,分別用于存儲(chǔ)各個(gè)進(jìn)程的信息,存儲(chǔ)就緒隊(duì)列的進(jìn)程信息,存儲(chǔ)可執(zhí)行的進(jìn)程的信息3.2.3 算法 process *h1=NULL,*h2=NULL,*h3=NULL; int i,j; printf(tt輸入進(jìn)程數(shù):); f
9、p=fopen(file.txt,w+);scanf(%d,&i); fprintf(fp,%dn,i);for(j=1;i0;i-,j+)p=(process *)malloc(sizeof(process);q-next=p;printf(tt第%d個(gè)進(jìn)程:n,j); printf(tt(按空格或回車隔開)n); printf(tt進(jìn)程序號(hào) 讀或?qū)?r or w) 開始時(shí)間t 執(zhí)行時(shí)間ntt); scanf(%d %c %d %d,&p-ID,&p-type,&p-starttime,&p-needtime);fprintf(fp,%d %c %d %dn,p-ID,p-type,p-st
10、arttime,p-needtime);printf(n);p-runtime=0;q=q-next;p-next=NULL;fclose(fp);p=h1;h1=h1-next;p-next=NULL;free(p);break;3.3查看讀/寫者模塊 查詢已輸入的讀寫者信息數(shù)據(jù)結(jié)構(gòu)Process *p,*q; /定義進(jìn)程變量指針,用于存儲(chǔ)讀者寫者信息 3.3.3 算法 int k; if(fp=fopen(file.txt,r)=NULL)printf(文件翻開失敗!n); main(); printf(tt進(jìn)程序號(hào) 讀或?qū)?r or w) 開始時(shí)間t 執(zhí)行時(shí)間n); fscanf(fp,
11、%d,&i); k=0; for(j=0;i0;i-,j+) p=(process *)malloc(sizeof(process);q-next=p;fscanf(fp,%d %c %d %d,&p-ID,&p-type,&p-starttime,&p-needtime);if(p-type=r|p-type=R) k+; printf(tt%dtt%ctt%dtt%dn,p-ID,p-type,p-starttime,p-needtime);p-runtime=0;q=q-next;p-next=NULL; j=j-k; printf(tt讀者數(shù)目:); printf(t%dn,k); p
12、rintf(tt寫者數(shù)目:); printf(t%dn,j);fclose(fp);p=h1;h1=h1-next;p-next=NULL;free(p); main();break;3.4 主要的數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)int Wmutex=1;/互斥讀寫的信號(hào)量int readcount=0; /讀者數(shù)目struct process/進(jìn)程結(jié)構(gòu)體int ID; /進(jìn)程序號(hào)char type; /進(jìn)程類別(判斷是讀者還是寫者)int starttime; /進(jìn)程開始時(shí)間int needtime; /進(jìn)程讀寫需要的時(shí)間int runtime; /進(jìn)程在內(nèi)存中已運(yùn)行的時(shí)間struct process *ne
13、xt;process *h1=NULL,*h2=NULL,*h3=NULL;/三個(gè)鏈表函數(shù)成員:void input()/輸入信息函數(shù)int main()/主函數(shù)void choose()/選擇函數(shù)void ready(int i)/進(jìn)入就緒隊(duì)列函數(shù)int wait(int &a)/等待隊(duì)列函數(shù)void reader()/讀寫平等下的讀者信息函數(shù)void writer()/讀寫平等下的寫者信息函數(shù)void add(int i)/動(dòng)態(tài)增加函數(shù)void print(int i)/輸出函數(shù)void leave()/離開執(zhí)行隊(duì)列程序設(shè)計(jì)與實(shí)現(xiàn)4.1 程序流程圖4.2 程序代碼struct proces
14、s /數(shù)據(jù)結(jié)構(gòu)int ID; /進(jìn)程序號(hào)char type; /進(jìn)程類別(判斷是讀者還是寫者)int starttime; /進(jìn)程開始時(shí)間int needtime; /進(jìn)程讀寫需要的時(shí)間int runtime; /進(jìn)程在內(nèi)存中已運(yùn)行的時(shí)間struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void ready(int i) /進(jìn)入就緒隊(duì)列process *p,*q,*j,*k;p=h1;q=h2;int t=0;if(h2=NULL)q=h2=(process *)malloc(sizeof(process);q-next=NULL;
15、t=1;elsewhile(q-next!=NULL)q=q-next;j=(process *)malloc(sizeof(process);j-next=h1;while(h1-starttime=i)q-next=h1;h1=h1-next;q=q-next;q-next=NULL;j-next=h1;if(h1=NULL)break;p=h1;while(p!=NULL)if(p-starttime=i)k=j;while(k-next!=p)k=k-next;k-next=p-next;q-next=p;q=q-next;p=p-next;q-next=NULL;elsep=p-ne
16、xt;h1=j-next;j-next=NULL;free(j);if(t=1)p=h2;h2=h2-next;p-next=NULL;free(p);int wait(int &a) a-;if(anext=NULL;t=1;elsewhile(p-next!=NULL)p=p-next;if(readcount0)p-next=h2;h2=h2-next;p=p-next;p-next=NULL;readcount+;if(readcount=0)&(wait(Wmutex)=1)p-next=h2;h2=h2-next;p=p-next;p-next=NULL;readcount+;el
17、se Wmutex+;if(t=1)p=h3;h3=h3-next;p-next=NULL;free(p);void writer() /讀寫平等下的寫者信息if(wait(Wmutex)=1)&(h3=NULL)h3=h2;h2=h2-next;h3-next=NULL;else Wmutex+;void add(int i) /動(dòng)態(tài)增加process *p,*q;int a;p=h1;q=(process *)malloc(sizeof(process);printf(tt進(jìn)程序號(hào):);scanf(%d,&q-ID);printf(ttt讀或?qū)?);fflush(stdin);scanf(
18、%c,&q-type);printf(tt開始時(shí)間:);scanf(%d,&a);q-starttime=a+i;printf(tt執(zhí)行時(shí)間:);scanf(%d,&q-needtime);q-runtime=0;q-next=NULL;if(h1!=NULL)while(p-next!=NULL)p=p-next;p-next=q;elseh1=q;void print(int i) /輸出函數(shù)process *p;p=h3;while(p!=NULL)p-runtime+;p=p-next;printf(ntt執(zhí)行 %d :n,i);printf(tt執(zhí)行隊(duì)列: );p=h3;if(p=N
19、ULL)printf();elsewhile(p!=NULL)printf(%d ,p-ID);p=p-next;printf(ntt等待隊(duì)列: );p=h2;if(p=NULL)printf();else while(p!=NULL) printf(%d,p-ID);p=p-next;printf(n);void leave() /離開執(zhí)行隊(duì)列process *p,*q;p=q=(process *)malloc(sizeof(process);p-next=NULL;while(h3!=NULL)if(h3-needtime!=h3-runtime) p-next=h3;p=p-next;
20、elseif(h3-type=r)|(h3-type=R)readcount-; if(readcount=0)Wmutex=1; else signal(Wmutex);h3=h3-next;p-next=NULL;h3=q-next;q-next=NULL;free(q); int main()int i=0;input();while(h1!=NULL)|(h2!=NULL)|(h3!=NULL)i+;if(h1!=NULL)ready(i);if(h2!=NULL)while(h2-type=r)reader();if(h3!=NULL)if(h3-type=w)break;if(h2
21、=NULL)break;if(h2!=NULL)if(h2-type=w)writer();print(i); leave(); sleep(1); /交出線程占用CPU時(shí)間一秒鐘fflush(stdin);/清空緩沖區(qū)char ch= ;if (kbhit()=1)/檢查當(dāng)前是否有鍵盤輸入,假設(shè)有那么返回一個(gè)非0值,否那么返回0 ch=getchar();if(ch=S)|(ch=s) printf(tt已暫停,任意鍵繼續(xù).n添加新的進(jìn)程輸入an);ch=getchar();if(ch=a)add(i);printf(nntt執(zhí)行完畢n); Wmutex=1; readcount=0;main();while(1);return 0;4.3 實(shí)驗(yàn)結(jié)果 5. 結(jié)論平等策略下的讀者寫者問(wèn)題,執(zhí)行讀者與寫者在公平競(jìng)爭(zhēng)下的同步進(jìn)程問(wèn)題,另外可以實(shí)現(xiàn)進(jìn)程的可視化顯示、暫停和動(dòng)態(tài)增加最后退出, 實(shí)現(xiàn)了讀讀相容,讀寫互斥,當(dāng)讀寫同時(shí)請(qǐng)求時(shí),按順序進(jìn)行請(qǐng)求響應(yīng)操作。6. 收獲、體會(huì)和建議 黃宏亮心得體會(huì)這次的課程設(shè)計(jì)雖然時(shí)間
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級(jí)數(shù)學(xué)趣味課堂活動(dòng)計(jì)劃2024
- 膽囊癌圍根治術(shù)后護(hù)理
- 六年級(jí)上冊(cè)心理素質(zhì)提升教學(xué)計(jì)劃
- 房地產(chǎn)行業(yè)反洗錢2025年工作總結(jié)及行動(dòng)計(jì)劃
- 健康醫(yī)療行業(yè)趨勢(shì)報(bào)告表
- 六年級(jí)下學(xué)期班主任培訓(xùn)計(jì)劃
- 職業(yè)技術(shù)學(xué)校實(shí)訓(xùn)課程教學(xué)計(jì)劃
- 農(nóng)業(yè)項(xiàng)目進(jìn)度管理及控制措施
- 物資部庫(kù)存周轉(zhuǎn)率提升計(jì)劃
- 外研版英語(yǔ)四年級(jí)上冊(cè)文化活動(dòng)方案
- 2025山西晉城市城區(qū)城市建設(shè)投資經(jīng)營(yíng)限公司招聘15人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 危險(xiǎn)廢物收集、貯存擴(kuò)建項(xiàng)目環(huán)境風(fēng)險(xiǎn)評(píng)價(jià)專項(xiàng)報(bào)告
- 2025屆高考生物知識(shí)總結(jié)快速記憶(答案版)
- 人工智能與新質(zhì)生產(chǎn)力發(fā)展
- 研究生考試考研思想政治理論(101)試題與參考答案(2024年)
- 鑄造安全培訓(xùn)課件
- 保安員資格考試復(fù)習(xí)題庫(kù)及答案(800題)
- 消防員職業(yè)技能鑒定中級(jí)技能題庫(kù)
- 《公路建設(shè)項(xiàng)目文件管理規(guī)程》
- 小兒常見出疹性疾病皮疹圖譜和治療課件
- 獎(jiǎng)牌設(shè)計(jì) 課件 2024-2025學(xué)年人教版(2024)初中美術(shù)七年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論