操作系統(tǒng)程序進(jìn)程通信實(shí)驗(yàn)報(bào)告_第1頁(yè)
操作系統(tǒng)程序進(jìn)程通信實(shí)驗(yàn)報(bào)告_第2頁(yè)
操作系統(tǒng)程序進(jìn)程通信實(shí)驗(yàn)報(bào)告_第3頁(yè)
操作系統(tǒng)程序進(jìn)程通信實(shí)驗(yàn)報(bào)告_第4頁(yè)
操作系統(tǒng)程序進(jìn)程通信實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 進(jìn) 程 通 信 指導(dǎo)老師: 夏 建一、實(shí)驗(yàn)題目進(jìn)程通信上機(jī)實(shí)驗(yàn)(消息緩沖通信)二、算法思想1、在進(jìn)程管理(調(diào)度)實(shí)驗(yàn)基礎(chǔ)上,加入進(jìn)程通信的功能,采用消息緩沖通信機(jī)制進(jìn)行通信。2、P1發(fā)送數(shù)據(jù)給P2,P2排序后發(fā)送給P3,P3接收數(shù)據(jù)并輸出。3、 要發(fā)送的數(shù)據(jù)內(nèi)容由操作者實(shí)時(shí)輸入。三、小組分工:四、算法程序1、 緩沖區(qū)結(jié)構(gòu)typedef struct nodeint id; int size; char text100; struct node *next;buftype;2、 進(jìn)程控制塊PCBstruct int id; char status;int waiter1; int priori

2、ty; char stack5; int sm; buftype *front; buftype *rear;pcb4;3 .發(fā)送、接收、排序程序算法流程(1)發(fā)送函數(shù) send()接收進(jìn)程標(biāo)識(shí)符、信息長(zhǎng)度存入緩沖區(qū)置鏈接指針為空,將信息正文從發(fā)送區(qū)復(fù)制到正文區(qū)分配緩沖區(qū)空間,由P指向隊(duì)列空?插在鏈?zhǔn)撞逶阪溛瞃N隊(duì)尾指針指向新插入緩沖區(qū)隊(duì)列緩沖區(qū)個(gè)數(shù)計(jì)數(shù)加1程序:void send(int rec_id,char a,int n)buftype *p;p=(buftype *)malloc(sizeof(buftype);p->id=rec_id; /接收消息進(jìn)程idp->size

3、=n; /消息的大小strcpy(p->text,a); /將消息拷貝到節(jié)點(diǎn)之中p->next=0;if(pcbrec_id.sm<=0)/如果消息緩沖隊(duì)列空.就將p放在鏈?zhǔn)?pcbrec_id.front=p;else pcbrec_id.rear->next=p;/如果不空.放在隊(duì)尾.rear指針后移一位pcbrec_id.rear=p;/隊(duì)尾指針指向新加入的緩沖區(qū)pcbrec_id.sm+; /接收進(jìn)程的消息個(gè)數(shù)+1(2)接收函數(shù) receive()隊(duì)列空?輸出“無(wú)消息”提示信息,返回取隊(duì)首緩沖區(qū),由P指向,隊(duì)列計(jì)數(shù)減1隊(duì)首指針為空?置隊(duì)尾指針為空復(fù)制數(shù)據(jù)到接收區(qū)

4、數(shù)組b釋放緩沖區(qū)調(diào)用參數(shù):rec_id 接收進(jìn)程標(biāo)識(shí)符b 接收區(qū)數(shù)組程序:int receive(int rec_id,char b) buftype *p; if(pcbrec_id.sm<=0) printf("no message!n"); return 0; else p=pcbrec_id.front; pcbrec_id.sm-; pcbrec_id.front=pcbrec_id.front->next;/取出來(lái)后.front指針后移一位 strcpy(b,p->text); free(p);if(pcbrec_id.front=NULL)

5、pcbrec_id.rear=NULL;return 1;(3)排序函數(shù) sort()調(diào)用參數(shù):a 待排序數(shù)組,n 數(shù)據(jù)個(gè)數(shù);提示用戶輸入選擇字符發(fā)送?NY提示用戶輸入發(fā)送數(shù)據(jù)存入發(fā)送區(qū)a數(shù)組(不超過(guò)100字符)求出輸入字符個(gè)數(shù)èlen調(diào)用發(fā)送函數(shù)發(fā)送信息給P2程序:void sort(char a,int n)int i,j;char temp;for(i=0;i<n;i+) for(j=i+1;j<n;j+) if(aj<ai) temp=ai; ai=aj; aj=temp; /if/for2.修改P1、P2、P3程序Process1()在阻塞前插入以下操作代

6、碼Process1()在阻塞前插入以下操作提示用戶輸入選擇字符發(fā)送?NY提示用戶輸入發(fā)送數(shù)據(jù)存入發(fā)送區(qū)a數(shù)組(不超過(guò)100字符)求出輸入字符個(gè)數(shù)èlen調(diào)用發(fā)送函數(shù)發(fā)送信息給P2提示用戶輸入選擇字符接收?NY調(diào)用接收函數(shù),接收數(shù)據(jù)送到接收區(qū)b數(shù)組調(diào)用排序函數(shù)進(jìn)行排序,輸出排序結(jié)果將排序結(jié)果發(fā)送給P3 Process1程序:process1()char flag;char a100;int len;if(addr='m') goto m;i=1;m1=1;a: printf("n process1 printing m1=%dnn",m1); pri

7、ntf("do you want to send data ?(y/n)"); /是否發(fā)送消息 flag=getchar(); if(flag='y'|flag='Y')printf("input data:");scanf("%s",a);len=strlen(a);send(1,a,len); /將消息輸送到緩沖隊(duì)列中printf("n");printf("process1 calls p on sem1!n");if(p(1,1,'m')=0

8、) return (0);m: printf("n=>process1 i=%dnn",i); i=i+5; goto a;Process2程序:process2()char flag;char b100;int len;if(addr='m') goto m;if(addr='n') goto n;i=1;a: printf("n process2 printing m1=%dn",m1); m2=2*m1; printf("do you want to receive message?(y/n)&quo

9、t;);/是否接收消息getchar();flag=getchar();if(flag='y'|flag='Y')if(receive(1,b)=0) /消息隊(duì)列為空 getchar();else /打印接收的消息,并且排序 printf("n%snn",b);len=strlen(b);sort(b,len);printf("n%snn",b);send(2,b,len); printf("process2 call p on sem2n"); if(p(2,2,'m')=0) ret

10、urn (0);m: printf("process2 call v on sem1!n"); if(v(1,2,'n')=0) return (0);n: printf("n=>process2 i=%dnn",i); i=i+10; goto a;Process3()在P3調(diào)用V操作喚醒P2前加入以下操作調(diào)用接收函數(shù),接收數(shù)據(jù)送到接收區(qū)c數(shù)組輸出接收區(qū)數(shù)據(jù)Process3程序: process3()char c100;if(addr='m') goto m; if(addr='n') goto n

11、; i=1; a: printf("n=>process3 i=%dn",i); if(i>=num) goto b; printf("n process3 printing 2i=%dnn",m2); m1=m2; if(receive(2,c) printf("=>SORT RESULT:%snn",c); getchar(); else printf("=>SORT RESULT:nn"); getchar(); getchar(); printf("process3 cal

12、l v on sem2!n"); if(v(2,3,'m')=0) return (0);m: i+; goto a;b: if(receive(2,c) printf("=>result:%snn",c); getchar(); else printf("=>result:nn"); getchar(); printf("nprocess3 calls p on sem2n"); if(p(2,3,'n')=0) return (0);n: ;四、測(cè)試情況、分析 下面的是調(diào)試正確后的程序結(jié)果:(1)發(fā)送后立刻接受:(2)接下來(lái)三個(gè)進(jìn)程五、收獲與體會(huì)經(jīng)過(guò)這次的實(shí)驗(yàn),我收獲良多,同時(shí)也讓我明白,動(dòng)手了,實(shí)踐了就有希望,就會(huì)有希望完成任務(wù)。剛開(kāi)始做這次實(shí)驗(yàn)的時(shí)候,發(fā)現(xiàn)很沒(méi)有頭緒,除了老師給

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論