課程設計:采用“讀寫平等”的策略演示“讀者-寫者”_第1頁
課程設計:采用“讀寫平等”的策略演示“讀者-寫者”_第2頁
課程設計:采用“讀寫平等”的策略演示“讀者-寫者”_第3頁
課程設計:采用“讀寫平等”的策略演示“讀者-寫者”_第4頁
課程設計:采用“讀寫平等”的策略演示“讀者-寫者”_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘要 一個數(shù)據(jù)文件或記錄可被多個進程共享,我們把只要求讀該文件的進程稱為“Reader進程,其他進程那么稱為“Writer進程。允許多個進程同時讀一個共享文件,因為讀操作不會使數(shù)據(jù)文件混亂。但不允許一個Writer進程和其他Reader進程或Writer進程同時訪問共享對象,因為這種訪問會引起混亂。所謂“讀者寫者問題是指保證一個Writer進程必須與其他進程互斥的訪問共享對象的同步問題。目錄 TOC o 1-3 h z u HYPERLINK l _Toc413356819 1. 概述 PAGEREF _Toc413356819 h 4 HYPERLINK l _Toc413356820 2.

2、 課程設計任務及要求 PAGEREF _Toc413356820 h 5 HYPERLINK l _Toc413356821 2.1 設計任務 PAGEREF _Toc413356821 h 5 HYPERLINK l _Toc413356822 2.2 設計要求 PAGEREF _Toc413356822 h 5 HYPERLINK l _Toc413356823 2.3 任務分工 PAGEREF _Toc413356823 h 5 HYPERLINK l _Toc413356824 3. 算法及數(shù)據(jù)結構 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ù)結構及數(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 實驗結果 PAGEREF _Toc413356831 h 15 HYPERLINK l _Toc413356832 5. 結論 PAGEREF _Toc413356832 h 17 HYPERLINK l _Toc413356833 6. 收獲、體會和建議 PAGEREF _Toc413356833 h 18 HYPERLINK l _Toc413356834 6.1 黃宏亮心得體會 PAGEREF _Toc41335683

5、4 h 18 HYPERLINK l _Toc413356835 6.2 林派騰心得體會 PAGEREF _Toc413356835 h 18 HYPERLINK l _Toc413356836 7. 參考文獻 PAGEREF _Toc413356836 h 19概述 讀寫者問題,就是指讀進程跟寫進程同時訪問共享一個對象的問題,將所有讀者和所有寫者分別存于一個讀者等待隊列和一個寫者等待隊列中,每當讀允許時,就從讀者隊列中釋放一個或多個讀者線程進行讀操作;每當寫允許時,就從寫者隊列中釋放一個寫者進行寫操作。讀寫平等策略,就是讀進程跟寫進程的優(yōu)先級一樣,當同時有讀進程和寫進程請求操作時,按鏈表的順

6、序讓進程對該對象進行操作,讀進程可多個同時進行,寫進程只能有一個進行。課程設計任務及要求2.1 設計任務用高級語言編寫和調試一個采用“讀寫平等策略的“讀者-寫者問題的模擬程序。2.2 設計要求1讀者與寫者至少包括ID、進入內存時間、讀寫時間三項內容,可在界面上進行輸入。2) 讀者與寫者均有兩個以上,可在程序運行期間進行動態(tài)增加讀者與寫者。3) 可讀取樣例數(shù)據(jù)要求存放在外部文件中,進行讀者/寫者、進入內存時間、讀寫時間的初始化。4) 要求將運行過程用可視化界面動態(tài)顯示,可隨時暫停,查看閱覽室中讀者/寫者數(shù)目、讀者等待隊列、讀寫時間、等待時間。5) 讀寫策略:讀寫互斥、寫寫互斥、讀寫平等嚴格按照讀

7、者與寫者到達的順序進入閱覽室,有寫者到達,那么阻塞后續(xù)到達的讀者;有讀者到達,那么阻塞后續(xù)到達的寫者。2.3 任務分工時間成員姓名任務完成情況第1天上午黃宏亮功能分析,查找資料完成林派騰查找資料第1天下午黃宏亮參考資料,分析算法完成林派騰參考資料,分析算法第2天上午黃宏亮編寫代碼,調試代碼完成林派騰調試代碼,查找問題第2天下午黃宏亮測試功能,編寫課程設計報告完成林派騰測試功能,編寫并修改課程設計報告第3天上午黃宏亮完善課程設計報告完成林派騰完善課程設計報告算法及數(shù)據(jù)結構三個線性鏈表,分別為h1、h2、h3。h1為寫入序列,h2為就緒序列,h3為執(zhí)行序列。其中h1用來存放輸入進去的讀者和寫者的信

8、息,h2根據(jù)讀入內存的時間將h1中的讀者寫者的信息進行排序,并將排完序的讀者與寫者信息存在h2中,把h2的內容調入到執(zhí)行序列h3中,從而執(zhí)行要求的內容。3.2輸入讀/寫者模塊 通過手動輸入讀寫者的信息、包括讀寫者的進入內存時間、進程序號、讀或寫(r or w) 類型、開始時間、執(zhí)行時間。數(shù)據(jù)結構 process *h1=NULL,*h2=NULL,*h3=NULL;/三個鏈表,分別用于存儲各個進程的信息,存儲就緒隊列的進程信息,存儲可執(zhí)行的進程的信息3.2.3 算法 process *h1=NULL,*h2=NULL,*h3=NULL; int i,j; printf(tt輸入進程數(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個進程:n,j); printf(tt(按空格或回車隔開)n); printf(tt進程序號 讀或寫(r or w) 開始時間t 執(zhí)行時間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ù)結構Process *p,*q; /定義進程變量指針,用于存儲讀者寫者信息 3.3.3 算法 int k; if(fp=fopen(file.txt,r)=NULL)printf(文件翻開失敗!n); main(); printf(tt進程序號 讀或寫(r or w) 開始時間t 執(zhí)行時間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ù)結構及數(shù)據(jù)int Wmutex=1;/互斥讀寫的信號量int readcount=0; /讀者數(shù)目struct process/進程結構體int ID; /進程序號char type; /進程類別(判斷是讀者還是寫者)int starttime; /進程開始時間int needtime; /進程讀寫需要的時間int runtime; /進程在內存中已運行的時間struct process *ne

13、xt;process *h1=NULL,*h2=NULL,*h3=NULL;/三個鏈表函數(shù)成員:void input()/輸入信息函數(shù)int main()/主函數(shù)void choose()/選擇函數(shù)void ready(int i)/進入就緒隊列函數(shù)int wait(int &a)/等待隊列函數(shù)void reader()/讀寫平等下的讀者信息函數(shù)void writer()/讀寫平等下的寫者信息函數(shù)void add(int i)/動態(tài)增加函數(shù)void print(int i)/輸出函數(shù)void leave()/離開執(zhí)行隊列程序設計與實現(xiàn)4.1 程序流程圖4.2 程序代碼struct proces

14、s /數(shù)據(jù)結構int ID; /進程序號char type; /進程類別(判斷是讀者還是寫者)int starttime; /進程開始時間int needtime; /進程讀寫需要的時間int runtime; /進程在內存中已運行的時間struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void ready(int i) /進入就緒隊列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) /動態(tài)增加process *p,*q;int a;p=h1;q=(process *)malloc(sizeof(process);printf(tt進程序號:);scanf(%d,&q-ID);printf(ttt讀或寫:);fflush(stdin);scanf(

18、%c,&q-type);printf(tt開始時間:);scanf(%d,&a);q-starttime=a+i;printf(tt執(zhí)行時間:);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í)行隊列: );p=h3;if(p=N

19、ULL)printf();elsewhile(p!=NULL)printf(%d ,p-ID);p=p-next;printf(ntt等待隊列: );p=h2;if(p=NULL)printf();else while(p!=NULL) printf(%d,p-ID);p=p-next;printf(n);void leave() /離開執(zhí)行隊列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時間一秒鐘fflush(stdin);/清空緩沖區(qū)char ch= ;if (kbhit()=1)/檢查當前是否有鍵盤輸入,假設有那么返回一個非0值,否那么返回0 ch=getchar();if(ch=S)|(ch=s) printf(tt已暫停,任意鍵繼續(xù).n添加新的進程輸入an);ch=getchar();if(ch=a)add(i);printf(nntt執(zhí)行完畢n); Wmutex=1; readcount=0;main();while(1);return 0;4.3 實驗結果 5. 結論平等策略下的讀者寫者問題,執(zhí)行讀者與寫者在公平競爭下的同步進程問題,另外可以實現(xiàn)進程的可視化顯示、暫停和動態(tài)增加最后退出, 實現(xiàn)了讀讀相容,讀寫互斥,當讀寫同時請求時,按順序進行請求響應操作。6. 收獲、體會和建議 黃宏亮心得體會這次的課程設計雖然時間

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論