東北大學(xué)操作系統(tǒng)實驗三報告_第1頁
東北大學(xué)操作系統(tǒng)實驗三報告_第2頁
東北大學(xué)操作系統(tǒng)實驗三報告_第3頁
東北大學(xué)操作系統(tǒng)實驗三報告_第4頁
東北大學(xué)操作系統(tǒng)實驗三報告_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、操作系統(tǒng)實驗報告班級物聯(lián)網(wǎng)1302班學(xué)號姓名實驗3進程同步和通信-生產(chǎn)者和消費者問題模擬1 .目的:調(diào)試、修改、運行模擬程序,通過形象化的狀態(tài)顯示,使學(xué)生理解進程的概念,了解同步和通信的過程,掌握進程通信和同步的機制,特別是利用緩沖區(qū)進行同步和通信的過程。通過補充新功能,使學(xué)生能靈活運用相關(guān)知識,培養(yǎng)創(chuàng)新能力。2 .內(nèi)容及要求:1)調(diào)試、運行模擬程序。2)發(fā)現(xiàn)并修改程序中不完善的地方。3)修改程序,使用隨機數(shù)控制創(chuàng)建生產(chǎn)者和消費者的過程。4)在原來程序的基礎(chǔ)上,加入緩沖區(qū)的寫互斥控制功能,模擬多個進程存取一個公共緩沖區(qū),當有進程正在寫緩沖區(qū)時,其他要訪問該緩沖區(qū)的進程必須等待,當有進程正在讀取

2、緩沖區(qū)時,其他要求讀取的進程可以訪問,而要求寫的進程應(yīng)該等待。5)完成1)、2)、3)功能的,得基本分,完成4)功能的加2分,有其它功能改進的再加2分3 .程序說明:本程序是模擬兩個進程,生產(chǎn)者(producer)和消費者(Consumer)工作。生產(chǎn)者每次產(chǎn)生一個數(shù)據(jù),送入緩沖區(qū)中。消費者每次從緩沖區(qū)中取走一個數(shù)據(jù)。緩沖區(qū)可以容納8個數(shù)據(jù)。因為緩沖區(qū)是有限的,因此當其滿了時生產(chǎn)者進程應(yīng)該等待,而空時,消費者進程應(yīng)該等待;當生產(chǎn)者向緩沖區(qū)放入了一個數(shù)據(jù),應(yīng)喚醒正在等待的消費者進程,同樣,當消費者取走一個數(shù)據(jù)后,應(yīng)喚醒正在等待的生產(chǎn)者進程。就是生產(chǎn)者和消費者之間的同每次寫入和讀出數(shù)據(jù)時,都將讀和

3、寫指針加一。當讀寫指針同樣時,又一起退回起點。當寫指針指向最后時,生產(chǎn)者就等待。當讀指針為零時,再次要讀取的消費者也應(yīng)該等待。為簡單起見,每次產(chǎn)生的數(shù)據(jù)為0-99的整數(shù),從0開始,順序遞增。兩個進程的調(diào)度是通過運行者使用鍵盤來實現(xiàn)的。4 .程序使用的數(shù)據(jù)結(jié)構(gòu)進程控制塊:包括進程名,進程狀態(tài)和執(zhí)行次數(shù)。緩沖區(qū):一個整數(shù)數(shù)組。緩沖區(qū)說明塊:包括類型,讀指針,寫指針,讀等待指針和寫等待指針。5 .程序使用說明啟動程序后,如果使用p'鍵則運行一次生產(chǎn)者進程,使用c'鍵則運行一次消費者進程。通過屏幕可以觀察到兩個進程的狀態(tài)和緩沖區(qū)變化的情況。6 .實驗流程圖源程序#include<

4、stdio.h>#include<stdlib.h>#include<string.h># definePIPESIZE8enumStatusRUN,WAIT,READY;# defineNORMAL0# defineSLEEP1# defineAWAKE2structPCBcharname3;enumStatusstatus;inttime;structwaitqueuestructPCBpcb;structwaitqueue*next;;structPCB"producer;/*writewaitpoint*/structPCB"consu

5、mer;/*readwaitpoint*/structwaitqueue*headerqueue,*tailqueue;intwriteptr;intreadptr;intwritein,readout;intbufferPIPESIZE;intempty,full;voidrunp(charin3),runc(charin3),print();intmain()charin3;writeptr=0;readptr=0;writein=0;empty=PIPESIZE;full=0;producer=(structPCB*)malloc(sizeof(structPCB);consumer=(

6、structPCB*)malloc(sizeof(structPCB);headerqueue=(structwaitqueue*)malloc(sizeof(structwaitqueue);headerqueue->next=NULL;tailqueue=headerqueue;producer->status=READY;consumer->status=WAIT;producer->time=consumer->time=0;printf("Nowstartingtheprogram!n");printf("Press'

7、;p1'torunPRODUCER1,Press'p1'torunPRODUCER2n");printf("Press'c1'torunCONSUMER1,Press'c2'torunCONSUMER2n");printf("Press'e'toexitfromtheprogram.n");while(1)strcpy(in,"N");while(!strcmp(in,"N")printf("n");&&a

8、mp;strcmp(in,scanf("%s",in);if(strcmp(in,"e")&&strcmp(in,"p1")&&strcmp(in,"p2")c1")&&strcmp(in,"c2")printf("error,pleaseinputagain!n");strcpy(in,"N");if('p'=in0)runp(in);producer->time+;else

9、if('c'=in0)runc(in);consumer->time+;elseprintf("PRODUCERproduct%dtimesn",producer->time);printf("CONSUMERconsumer%dtimesn",consumer->time);exit(0);print();printf("n");voidrunp(cha門n3)if(full>=8)structwaitqueue*search;search=headerqueue->next;while

10、(search!=NULL)if(!strcmp(in,search->)printf("error!n");exit(1);search=search->next;producer->status = WAIT;printf("PRODUCER%sprocessiswaiting,can'tbescheduled.n",in);structwaitqueue*p=(structwaitqueue*)malloc(sizeof(structwaitqueue);strcpy(p->,in);

11、p->pcb.status=WAIT;p->pcb.time=producer->time+1;p->next=NULL;tailqueue->next=p;tailqueue=p;full+;elsewritein=(writein+1)%100;producer->status=RUN;printf("runPRODUCER%duct%d",in,writein);bufferwriteptr=writein;if(empty>8)structwaitqueue*p;p=headerqueue->n

12、ext;printf("runCONSUMER%sprocess.use%d",p->,bufferwriteptr);if(tailqueue=p)tailqueue=headerqueue;headerqueue->next=p->next;free(p);consumer->status=WAIT;empty-;elseif(writeptr>readptr)writeptr+;if(writeptr>=PIPESIZE)writeptr=0;if(readptr=0)producer->status=WAIT

13、;elseproducer->status=READY;elsewriteptr+;if(writeptr=readptr)producer->status = WAIT;elseproducer->status=READY;consumer->status=READY;empty-;full+;voidrunc(cha門n3)if(empty>=8)structwaitqueue*search;search=headerqueue->next;while(search!=NULL)if(!strcmp(in,search->)prin

14、tf("error!n");exit(1);search=search->next;consumer->status=WAIT;printf("CONSUMER%siswaiting,can'tbescheduled.n",in);structwaitqueue*p=(structwaitqueue*)malloc(sizeof(structwaitqueue);strcpy(p->,in);p->pcb.status=WAIT;p->pcb.time=consumer->time+1;p-&g

15、t;next=NULL;tailqueue->next=p;tailqueue=p;empty+;elseconsumer->status=RUN;readout=bufferreadptr;printf("runCONSUMER%sprocess.use%d",in,readout);if(full>8)writein=(writein+1)%100;bufferwriteptr=writein;structwaitqueue*p;p=headerqueue->next;printf("runPRODUCER%du

16、ct%d",p->,bufferwriteptr);if(tailqueue=p)tailqueue=headerqueue;headerqueue->next=p->next;free(p);producer->status=WAIT;full-;writeptr+;readptr+;elseif(readptr>writeptr)readptr+;if(readptr>=PIPESIZE)readptr=0;if(writeptr=0)consumer->status=WAIT;elseconsumer->statu

17、s=READY;elseconsumer->status=READY;elsereadptr+;if(readptr=writeptr)consumer->status=WAIT;writeptr=readptr=0;elseconsumer->status=READY;producer->status=READY;full-;empty+;voidprint()inti=0;intj=0;intlow=0;inthigh=0;printf("n");for(i;i<PIPESIZE;i+)printf("");for (l

18、ow = 0; low < writeptr; low+)printf("n");if(readptr<writeptr)for(low=0;low<readptr;low+)printf("|");for(low=readptr;low<writeptr;low+)printf("|%2d|",bufferlow);for(low=writeptr;low<PIPESIZE;low+)printf("|");elseif(readptr>writeptr)printf("|%2d|",bufferlow);for(low=writeptr;low<readptr;low+)printf("|");for(low=readptr;low<PIPESIZE;low+)printf("|%2d|",bufferlow);elseif(producer->status=WAIT)for(low=0;low<PIPESIZE;low+)printf("|%2d|",bufferlo

溫馨提示

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

評論

0/150

提交評論