操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼_第1頁
操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼_第2頁
操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼_第3頁
操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼_第4頁
操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上操作系統(tǒng)課程設計采用讀寫平等策略的讀者寫者問題完整版內含代碼專心-專注-專業(yè)淮北師范大學課 程 設 計 采用讀寫平等策略的讀者寫者問題 學 號: 姓 名: 專 業(yè): 指導教師: 日 期: 目錄 1.5 時間安排. 4 第1部分 課設簡介1.1 課程設計題目采用讀寫平等策略的讀者寫者問題1.2 課程設計目的操作系統(tǒng)課程設計是計算機專業(yè)重要的教學環(huán)節(jié),它為學生提供了一個既動手又動腦,將課本上的理論知識和實際有機的結合起來,獨立分析和解決實際問題的機會。1)進一步鞏固和復習操作系統(tǒng)的基礎知識。2)培養(yǎng)學生結構化程序、模塊化程序設計的方法和能力。3)提高學生調試程序的技巧和軟

2、件設計的能力。4)提高學生分析問題、解決問題以及綜合利用C語言進行課程設計的能力。1.3 課程設計內容用高級語言編寫和調試一個采用“讀寫平等”策略的“讀者-寫者”問題的模擬程序。1.4 課程設計要求1)讀者與寫者至少包括ID、進入內存時間、讀寫時間三項內容,可在界面上進行輸入。2) 讀者與寫者均有兩個以上,可在程序運行期間進行動態(tài)增加讀者與寫者。3) 可讀取樣例數(shù)據(jù)(要求存放在外部文件中),進行讀者/寫者、進入內存時間、讀寫時間的初始化。4) 要求將運行過程用可視化界面動態(tài)顯示,可隨時暫停,查看閱覽室中讀者/寫者數(shù)目、讀者等待隊列、讀寫時間、等待時間。5) 讀寫策略:讀寫互斥、寫寫互斥、讀寫平

3、等(嚴格按照讀者與寫者到達的順序進入閱覽室,有寫著到達,則阻塞后續(xù)到達的讀者;有讀者到達,則阻塞后續(xù)到達的寫者)。1.5 時間安排 1)分析設計貯備階段 (1 天) 2)編程調試階段 (7 天) 3)寫課程設計報告、考核(2 天) 第2部分 實驗原理分析2.1問題描述 有一個被許多進程共享的數(shù)據(jù)區(qū),這個數(shù)據(jù)區(qū)能夠是一個文件,或者主存的一塊空間,甚至能夠是一組處理器寄存器。有一些只讀取這個數(shù)據(jù)區(qū)的進程reader和一些只往數(shù)據(jù)區(qū)中寫數(shù)據(jù)的進程writer以下假設共享數(shù)據(jù)區(qū)是文件。這些讀者和寫者對數(shù)據(jù)區(qū)的操作必須滿足以下條件:讀讀允許;讀寫互斥;寫寫互斥。這些條件具體來說就是:1)任意多的讀進程能

4、夠同時讀這個文件;2)一次只允許一個寫進程往文件中寫;3)如果一個寫進程正在往文件中寫,禁止任何讀進程或寫進程訪問文件;4)寫進程執(zhí)行寫操作前,應讓已有的寫者或讀者全部退出。這說明當有讀者在讀文件時不允許寫者寫文件。2.2算法思想 三個線性鏈表,分別為h1、h2、h3。h1為寫入序列,h2為就緒序列,h3為執(zhí)行序列。其中h1用來存放輸入進去的讀者和寫者的信息,h2根據(jù)讀入內存的時間將h1中的讀者寫者的信息進行排序,并將排完序的讀者與寫者信息存在h2中,把h2的內容調入到執(zhí)行序列h3中,從而執(zhí)行要求的內容。 2.3主要功能模塊流程圖開始ready(int i)typereader()rwrite

5、r ()wruntime+runtime=needtime離開h3h1=Null&h2=Null&h3=NullYN i+Y結束第3部分 主要的功能模塊 3.1 數(shù)據(jù)結構 主要的數(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 *next;proces

6、s *h1=NULL,*h2=NULL,*h3=NULL;/三個鏈表函數(shù)成員:void input()/輸入信息函數(shù)void 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í)行隊列3.2 測試用例及運行結果運行程序進入界面后,選擇1,運行界面如圖1-1;選擇2,運行完后

7、查看文件顯示如圖1-2;選擇3查看信息,運行界面如圖1-3;在執(zhí)行過程中按下s能夠暫停進程的執(zhí)行,在進程暫停的情況下,按下a能夠增加進程,運行結果如圖1-4所示。 圖 1-1圖1-2圖1-3圖1-4第4部分 源代碼#include #include #include #include windows.hint Wmutex=1;/互斥讀寫的信號量int readcount=0; /讀者數(shù)目void input();void main();struct processint ID; /進程序號char type; /進程類別(判斷是讀者還是寫者)int starttime; /進程開始時間int

8、 needtime; /進程讀寫需要的時間int runtime; /進程在內存中已運行的時間struct process *next;process *h1=NULL,*h2=NULL,*h3=NULL;void choose()/選擇 int a;process *p,*q;q=h1=(process *)malloc(sizeof(process);FILE *fp; scanf(%d,&a);switch(a)case 1: /手動輸入 int i,j; printf(tt輸入進程數(shù):); fp=fopen(file.txt,w+);scanf(%d,&i); fprintf(fp,%

9、dn,i);for(j=1;i0;i-,j+)p=(process *)malloc(sizeof(process);q-next=p;printf(tt第%d個進程:n,j);printf(tt進程序號t讀或寫tt開始時間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-starttime,p-needtime);printf(n);p-runtime=0;q=q-next;p-next=NULL;fclose(fp);p=h1;

10、h1=h1-next;p-next=NULL;free(p);break;case 2: /文件讀入if(fp=fopen(file.txt,r)=NULL)printf(文件打開失敗!n); system(pause); system(cls); main();fscanf(fp,%d,&i); for(j=1;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); p-runtime=0;q=q-next;p-ne

11、xt=NULL;fclose(fp);p=h1;h1=h1-next;p-next=NULL;free(p); break; case 3: int k; if(fp=fopen(file.txt,r)=NULL)printf(文件打開失敗!n); system(pause); system(cls); main(); printf(tt進程序號t讀或寫tt開始時間t執(zhí)行時間n); fscanf(fp,%d,&i); k=0; for(j=0;i0;i-,j+) p=(process *)malloc(sizeof(process);q-next=p;fscanf(fp,%d %c %d %d

12、,&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); printf(tt寫者數(shù)目:); printf(t%dn,j);fclose(fp); p=h1;h1=h1-next;p-next=NULL;free(p); system(pause); sy

13、stem(cls); main();break; case 4: exit(0); default :printf(tt您輸入的有錯誤,請重新輸入:n);system(pause); system(cls); main();void input() /輸入函數(shù)printf(tt*讀寫平等策略*n);printf(ttt1.請輸入進程信息n);printf(ttt2.文件載入進程信息n); printf(ttt3.查看進程信息n);printf(ttt4.退出n);printf(tt*n);printf(tt請選擇:); choose();void ready(int i) /進入就緒隊列pro

14、cess *p,*q,*j,*k;p=h1;q=h2;int t=0;if(h2=NULL)q=h2=(process *)malloc(sizeof(process);q-next=NULL;t=1;elsewhile(q-next!=NULL)q=q-next;j=(process *)malloc(sizeof(process);j-next=head1;while(h1-starttime=i)q-next=head1;h1=h1-next;q=q-next;q-next=NULL;j-next=head1;if(h1=NULL)break;p=h1;while(p!=NULL)if(

15、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-next;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-ne

16、xt=NULL;readcount+;if(readcount=0)&(wait(Wmutex)=1)p-next=h2;h2=h2-next;p=p-next;p-next=NULL;readcount+;else Wmutex+;if(t=1)p=h3;h3=h3-next;p-next=NULL;free(p);void writer() /讀寫平等下的寫者信息if(wait(Wmutex)=1)&(head3=NULL)h3=h2;h2=h2-next;h3-next=NULL;else Wmutex+;void add(int i) /動態(tài)增加process *p,*q;int a;

17、p=head1;q=(process *)malloc(sizeof(process);printf(tt進程序號:);scanf(%d,&q-ID); printf(ttt讀或寫:);fflush(stdin);scanf(%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

18、(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=NULL)printf();elsewhile(p!=NULL)printf(%d ,p-ID);p=p-next;printf(ntt等待隊列: );p=h2;if(p=NULL)printf();elsewhile(p!=NULL)printf(%d,p-ID);p=p-next;printf(n);void leave() /離開執(zhí)行隊列process *p,*q;p

19、=q=(process *)malloc(sizeof(process);p-next=NULL;while(h3!=NULL)if(h3-needtime!=h3-runtime)p-next=h3;p=p-next;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); void 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)

溫馨提示

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

評論

0/150

提交評論