版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上 采用“寫優(yōu)先”策略的“讀者-寫者”問題學(xué) 院 計(jì)算機(jī)科學(xué)與技術(shù) 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號(hào) 學(xué) 生 姓 名 指導(dǎo)教師姓名 2014-3-11專心-專注-專業(yè)目 錄 (1 ) 、課程設(shè)計(jì)的目的.-1-(2 ) 、課程設(shè)計(jì)的內(nèi)容-1-(3 ) 、課程設(shè)計(jì)的要求-1-一、設(shè)計(jì)目的與內(nèi)容(1)課程設(shè)計(jì)的目的:操作系統(tǒng)課程設(shè)計(jì)是計(jì)算機(jī)專業(yè)重要的教學(xué)環(huán)節(jié),它為學(xué)生提供了一個(gè)既動(dòng)手又動(dòng)腦,將課本上的理論知識(shí)和實(shí)際有機(jī)的結(jié)合起來,獨(dú)立分析和解決問題的機(jī)會(huì)。l 進(jìn)一步鞏固和復(fù)習(xí)操作系統(tǒng)的基礎(chǔ)知識(shí)。l 培養(yǎng)學(xué)生結(jié)構(gòu)化程序、模塊化程序設(shè)計(jì)的方法和能力。l 提高學(xué)生調(diào)試程序的技巧和軟
2、件設(shè)計(jì)的能力。l 提高學(xué)生分析問題、解決問題以及綜合利用C語言進(jìn)行程序設(shè)計(jì)的能力。(2) 課程設(shè)計(jì)的內(nèi)容:用高級(jí)語言編寫和調(diào)試一個(gè)采用“寫優(yōu)先”策略的“讀者寫者”問題的模擬程序。(3) 課程設(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)行過程用可視化界面動(dòng)態(tài)顯示,可隨時(shí)暫停,查看閱覽室中讀者/寫者數(shù)目、讀者等待隊(duì)列、讀寫時(shí)間、等待時(shí)間。5. 讀寫策略:讀寫互斥、寫寫互斥、
3、寫優(yōu)先 (只要寫者到達(dá),就阻塞后續(xù)的所有讀者,一旦閱覽室無人,寫者能最快進(jìn)入閱覽室;在寫者未出閱讀室之前,又有新的讀者與寫者到達(dá),仍然是寫者排在前面)二、算法的基本思想 進(jìn)程結(jié)構(gòu)體:struct processint name; /進(jìn)程ID 號(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; 創(chuàng)建三個(gè)鏈表,分別為process1 、process2 、process3 。process1 存儲(chǔ)各個(gè)進(jìn)程
4、的信息,process2 存儲(chǔ)就緒隊(duì)列的進(jìn)程信息,process3 存儲(chǔ)正在執(zhí)行的進(jìn)程的信息。系統(tǒng)有兩個(gè)功能,一個(gè)是手動(dòng)輸入進(jìn)程,另一個(gè)是文件輸入進(jìn)程。文件讀入功能,是從文件“123.txt”中讀入進(jìn)程。用整形數(shù)I 模擬時(shí)間片,每次時(shí)間片開始時(shí)先將需要進(jìn)入就緒隊(duì)列的進(jìn)程用ready() 函數(shù)拉入就緒隊(duì)列。接著用sort() 函數(shù)進(jìn)行排序,將寫者排在讀者前面。然后判斷就緒隊(duì)列的開頭是讀者還是寫者,然后調(diào)用相應(yīng)的函數(shù)Reader()或Writer()。時(shí)間片結(jié)束時(shí),對(duì)各個(gè)進(jìn)程的runtime+,并判斷進(jìn)程是否執(zhí)行完畢,如果完畢就其離開process3 鏈表。最后將時(shí)間片i+,反復(fù)循環(huán),直到所有進(jìn)程
5、執(zhí)行完畢。 三、模塊流程圖開始ready(int i)typereader()rwriter ()wruntime+runtime=needtime離開process3process1,process2,process3均為空Y NY結(jié)束Sort()i+N四、測試結(jié)果程序運(yùn)行實(shí)例如下:1、 進(jìn)入主界面2、 選擇1,運(yùn)行界面如下:3、選擇2,運(yùn)行界面如下:4.在執(zhí)行過程中動(dòng)態(tài)暫停。5 、在進(jìn)程暫停的情況下,按A 可以增加進(jìn)程。6 、退出五、結(jié)論這次課設(shè)成功采用了“寫優(yōu)先”策略通過輸入、排序、就緒等函數(shù)實(shí)現(xiàn)“讀者寫者”問題,在這兩周時(shí)間里我重新翻閱了C 語言程序設(shè)計(jì)、操作系統(tǒng)等書,也參考了很多網(wǎng)絡(luò)
6、資源,對(duì)“讀者- 寫者”問題有了更深的理解,對(duì)C 語言和數(shù)據(jù)結(jié)構(gòu)也有了更好的掌握,使我體會(huì)到了理論與實(shí)踐結(jié)合的效果。這次課程設(shè)計(jì)對(duì)我有很大的幫助,在這過程中還掌握了很多編程的小技巧。六、源程序#include <stdio.h>#include <stdlib.h>#include "windows.h"#include <conio.h>int mutex=1; /互斥讀寫的信號(hào)量int readcount=0; /用readcount變量來記錄讀者數(shù)struct processint num; /進(jìn)程序號(hào)char type; /進(jìn)程類
7、別(判斷是讀者還是寫者)int starttime; /進(jìn)程開始時(shí)間int needtime; /進(jìn)程讀寫需要的時(shí)間int runtime; /進(jìn)程在內(nèi)存中已運(yùn)行的時(shí)間struct process *next;process *process1=NULL,*process2=NULL,*process3=NULL;void input()process *p,*q;q=process1=(process *)malloc(sizeof(process); /在內(nèi)存中給q分配了一個(gè)動(dòng)態(tài)的存儲(chǔ)空間int a;FILE *fp; /是聲明,聲明fp是指針,用來指向FILE類型的對(duì)象printf(&q
8、uot;ttt *n");printf("ttt *1.手動(dòng)輸入進(jìn)程*n");printf("ttt *2.文件輸入進(jìn)程*n");printf("ttt *3.退出 *n");printf("ttt *n");printf("n請選擇序號(hào):");QK:fflush(stdin); /清空輸入緩沖區(qū)scanf("%d",&a);switch(a)case 1:CS:printf("輸入進(jìn)程數(shù):");int i,j;scanf("%
9、d",&i);if(i=0)printf("無進(jìn)程,重新輸入!n");goto CS;for(j=1;i>0;i-,j+)p=(process *)malloc(sizeof(process);q->next=p;printf("第%d個(gè)進(jìn)程:n",j);printf("進(jìn)程序號(hào):");scanf("%d",&p->num);printf("n"); printf("讀寫:");getchar();scanf("%c&qu
10、ot;,&p->type);printf("n");printf("開始時(shí)間:");scanf("%d",&p->starttime);printf("n");printf("讀寫時(shí)間:");scanf("%d",&p->needtime);printf("n");p->runtime=0;q=q->next;p->next=NULL;p=process1;process1=process1-&g
11、t;next;p->next=NULL;free(p);break;case 2:if(fp=fopen("d:123.txt","r")=NULL)printf("文件打開失敗!n");exit(0);while(!(feof(fp)p=(process *)malloc(sizeof(process);q->next=p;fscanf(fp,"%d %c %d %d",&p->num,&p->type,&p->starttime,&p->nee
12、dtime);p->runtime=0;q=q->next;p->next=NULL;fclose(fp);p=process1;process1=process1->next;p->next=NULL;free(p);break;case 3:exit(0);default :printf("輸入錯(cuò)誤,重新輸入:");goto QK;void ready(int i) /每次時(shí)間片開始時(shí)先將需要進(jìn)入就緒隊(duì)列的進(jìn)程用ready()函數(shù)拉入就緒隊(duì)列process *p,*q,*j,*k;p=process1;q=process2;int t=0;
13、if(process2=NULL)q=process2=(process *)malloc(sizeof(process);q->next=NULL;t=1;j=(process *)malloc(sizeof(process);j->next=process1;while(p!=NULL)if(p->starttime=i)k=j;while(k->next!=p)k=k->next;/比如i=1,這個(gè)作用就是尋找所有開始時(shí)間等于1的進(jìn)程k->next=p->next;q->next=p;q=q->next;p=p->next;q-
14、>next=NULL;/找到之后插入鏈表elsep=p->next;process1=j->next;j->next=NULL;free(j);if(t=1)p=process2;process2=process2->next;p->next=NULL;free(p);int wait(int &a)if(a<=0)return 0;a-;return 1;void signal(int &a)a+;void Reader() process *p;int t=0;p=process3;if(process3=NULL)p=proces
15、s3=(process *)malloc(sizeof(process);p->next=NULL;t=1;if(readcount>0)p->next=process2;process2=process2->next;p=p->next;p->next=NULL;readcount+;/讀者就開始讀if(readcount=0)&&(wait(mutex)=1)p->next=process2;process2=process2->next;p=p->next;p->next=NULL;readcount+;/寫者開
16、始寫if(t=1)p=process3;process3=process3->next;p->next=NULL;free(p);void Writer()if(wait(mutex)=1)&&(process3=NULL)process3=process2;process2=process2->next;process3->next=NULL;void sort()process *p,*q,*j,*k;j=p=(process *)malloc(sizeof(process);p->next=NULL;k=q=(process *)malloc
17、(sizeof(process);q->next=NULL;while(process2!=NULL)if(process2->type='w')|(process2->type='W')p->next=process2;process2=process2->next;p=p->next;p->next=NULL;elseq->next=process2;process2=process2->next;q=q->next;q->next=NULL;process2=j->next;j->
18、;next=NULL;free(j);q=k->next;k->next=NULL;free(k);if(process2!=NULL)p->next=q;/如果寫者不為空,就讓寫者先進(jìn)行elseprocess2=q;/不然讀者進(jìn)行void add(int i)process *p,*q;int a;p=process1;q=(process *)malloc(sizeof(process);printf("進(jìn)程序號(hào):");scanf("%d",&q->num);printf("n"); printf(
19、"讀寫:");fflush(stdin);scanf("%c",&q->type);printf("n");printf("開始時(shí)間:");scanf("%d",&a);q->starttime=a+i;printf("n");printf("讀寫時(shí)間:");scanf("%d",&q->needtime);q->runtime=0;q->next=NULL;if(process1!
20、=NULL)while(p->next!=NULL)p=p->next;p->next=q;/q是尾結(jié)點(diǎn)elseprocess1=q;/把q中的信息賦值給process1void main() system("color 1a");printf("tt-n");printf("ttt*寫優(yōu)先的讀者-寫者問題*n");printf("tt-nn");int i=0;process *p,*q;/定義兩個(gè)指向process的指針變量input();printf("n以下輸出各時(shí)間片進(jìn)程狀態(tài)n
21、");printf("<運(yùn)行時(shí)如需暫停請輸入P>n");Sleep(1000);while(process1!=NULL)|(process2!=NULL)|(process3!=NULL)i+;if(process1!=NULL)ready(i);sort();if(process2!=NULL)while(process2->type='r')|(process2->type='R')Reader();if(process3!=NULL)if(process3->type='w')|
22、(process3->type='W')break;if(process2=NULL)break;if(process2!=NULL)if(process2->type='w')|(process2->type='W')Writer();p=process3;while(p!=NULL)p->runtime+;p=p->next;printf("n時(shí)間 %d :n",i);printf("t正執(zhí)行進(jìn)程: ");p=process3;if(p=NULL)printf("<空>");elsewhile(p!=NULL)printf("%d ",p->num);p=p->next;printf("nt就緒隊(duì)列: ");p=process2;if(p=NULL)printf("<空>");elsewhile(p!=NULL)printf("%d ",p->num);p=p->next;printf("n");p=q=(process *)malloc(sizeof(process);p-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025武漢市微型計(jì)算機(jī)的買賣合同
- 農(nóng)村土地流轉(zhuǎn)合同標(biāo)準(zhǔn)(2025年度):土地規(guī)模經(jīng)營與效益提升
- 2025年度農(nóng)產(chǎn)品電商平臺(tái)入駐合作合同2篇
- 2025北京市室內(nèi)裝修合同
- 二零二五年度風(fēng)力發(fā)電工程款結(jié)算與環(huán)境保護(hù)合同3篇
- 二零二五年度旅游公司整體轉(zhuǎn)讓合同3篇
- 2025年度年度公司終止職工勞動(dòng)合同補(bǔ)償方案合同3篇
- 2025年度工業(yè)用地租賃合同書(含環(huán)保標(biāo)準(zhǔn))3篇
- 2025年度農(nóng)村房屋土地租賃與農(nóng)村環(huán)境治理合作協(xié)議
- 二零二五年度智能停車場租賃管理服務(wù)合同3篇
- 小兒肺炎支氣管鏡護(hù)理查房課件
- Part 6 Unit 8 Green Earth 教案-【中職專用】高一英語精研課堂(高教版2021·基礎(chǔ)模塊2)
- 艾森克人格問卷(EPQ)(成人)
- 設(shè)備維護(hù)與故障排除項(xiàng)目風(fēng)險(xiǎn)評(píng)估報(bào)告
- (新版)質(zhì)量知識(shí)競賽參考題庫400題(含各題型)
- 幼兒園小班語言《誰的耳朵》課件
- 院前急救診療技術(shù)操作規(guī)范
- 患者轉(zhuǎn)診記錄單
- 美好生活“油”此而來-暨南大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 買賣合同糾紛案民事判決書
- 神經(jīng)內(nèi)科應(yīng)急預(yù)案完整版
評(píng)論
0/150
提交評(píng)論