教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

操作系统程序进程通信实验报告

来源:网络收集 时间:2026-09-05
导读: 进 程 通 信 指导老师: 夏 建 一、实验题目 进程通信上机实验(消息缓冲通信) 二、算法思想 1、在进程管理(调度)实验基础上,加入进程通信的功能,采用消 息缓冲通信机制进行通信。 2、P1发送数据给P2,P2排序后发送给P3,P3接收数据并输出。 3、 要发送

进 程 通 信

指导老师: 夏 建

一、实验题目

进程通信上机实验(消息缓冲通信)

二、算法思想

1、在进程管理(调度)实验基础上,加入进程通信的功能,采用消

息缓冲通信机制进行通信。

2、P1发送数据给P2,P2排序后发送给P3,P3接收数据并输出。

3、 要发送的数据内容由操作者实时输入。

三、小组分工:

四、算法程序

1、 缓冲区结构

typedef struct node

{int id;

int size;

char text[100];

struct node *next;

}buftype;

2、 进程控制块PCB

struct {int id;

char status;

int waiter1;

int priority;

char stack[5];

int sm;

buftype *front;

buftype *rear;

}pcb[4];

3 .发送、接收、排序程序算法流程

(1)发送函数 send()

分配缓冲区空间,由P指向

接收进程标识符、信息长度存入缓冲区

置链接指针为空,将信息正文从发送区复制到正文区

队尾指针指向新插入缓冲区 队列缓冲区个数计数加1

程序:

void send(int rec_id,char a[],int n){

buftype *p;

p=(buftype *)malloc(sizeof(buftype));

p->id=rec_id; //接收消息进程id

p->size=n; //消息的大小

strcpy(p->text,a); //将消息拷贝到节点之中

p->next=0;

if(pcb[rec_id].sm<=0)//如果消息缓冲队列空..就将p放在链

{

pcb[rec_id].front=p;

}

else

pcb[rec_id].rear->next=p;//如果不空..放在队尾..rear指针后移一位

pcb[rec_id].rear=p;//队尾指针指向新加入的缓冲区 pcb[rec_id].sm++; //接收进程的消息个数+1

}

(2)接收函数 receive()

调用参数:

rec_id 接收进程标识符

输出“无消息”提示信息,返回 b

释放缓冲区

程序:

int receive(int rec_id,char b[])

{

buftype *p;

if(pcb[rec_id].sm<=0){

printf("no message!!\n");

return 0;

}else{

p=pcb[rec_id].front;

pcb[rec_id].sm--;

pcb[rec_id].front=pcb[rec_id].front->next;//

后..front指针后移一位

strcpy(b,p->text);

free(p);

if(pcb[rec_id].front==NULL)

pcb[rec_id].rear=NULL;

return 1;

}

}

(3)排序函数 sort() 取出来

调用参数:a[ ] 待排序数组,n 数据个数;

程序:

void sort(char a[],int n)

{

int i,j;

a数组

字符)

len

P2

a[j]=temp;

}//if

}//for

}

}

2.修改P1、P2、P3程序

Process1() 在阻塞前插入以下操作代码

Process1() 在阻塞前插入以下操作

Process1程序:

process1(){

char flag;

a数组

字符)

len

P2

否发送消息 是

flag=getchar();

if(flag=='y'||flag=='Y'){

printf("input data:");

scanf("%s",a); 提示用户输入选择字符

将消息输送到缓冲队列中

b数组

P3

return (0);

m: printf("\n=>process1 i=%d\n\n",i);

i=i+5;

goto a;

}

Process2程序:

process2(){

char flag;

char b[100];

int len;

if(addr=='m') goto m;

if(addr=='n') goto n;

i=1;

a: printf("\n process2 printing m1=%d\n",m1);

m2=2*m1;

printf("do you want to receive message?(y/n)");//是否接收消息

getchar();

flag=getchar();

if(flag=='y'||flag=='Y')

{

if(receive(1,b)==0){ //消息队列为空

getchar();

}else{ //打印接收的消息,并且排序 printf("\n%s\n\n",b);

len=strlen(b);

sort(b,len);

printf("\n%s\n\n",b);

send(2,b,len);}

}

printf("process2 call p on sem2\n");

if(p(2,2,'m')==0)

return (0);

m: printf("process2 call v on sem1!\n");

if(v(1,2,'n')==0)

return (0);

n: printf("\n=>process2 i=%d\n\n",i);

i=i+10;

goto a;

}

Process3()在P3调用V操作唤醒P2前加入以下操作

Process3程序:

process3(){

char c[100];

if(addr=='m') goto m;

if(addr=='n') goto n;

i=1;

a: printf("\n=>process3 i=%d\n",i); if(i>=num) goto b; 调用接收函数,接收数据送到接收区c数组 输出接收区数据

printf("\n process3 printing 2^i=%d\n\n",m2);

m1=m2;

if(receive(2,c)){

printf("==>SORT RESULT:%s\n\n",c);

getchar();

}

else{

printf("==>SORT RESULT:\n\n");

getchar();

}

getchar();

printf("process3 call v on sem2!\n");

if(v(2,3,'m')==0) return (0);

m: i++;

goto a;

b: if(receive(2,c)){

printf("==>result:%s\n\n",c);

getchar();

}

else{

printf("==>result:\n\n");

getchar();

}

printf("\nprocess3 calls p on sem2\n");

if(p(2,3,'n')==0) return (0);

n: ;

}

四、测试情况、分析

下面的是调试正确后的程序结果:

(1)发送后立刻接受:

(2)接下来三个进程

五、收获与体会

经过这次的实验,我收获良多,同时也让我明白,动手了,实践了就有希望,就会有希望完成任务。

刚开始做这次实验的时候,发现很没有头绪,除了老师给的PPT就没有一点线索。只能硬着头皮去看之前做实验的程序代码,理解每个模块的作用,然后记录下来,对照之前老师给我们的讲解。我发现通过流程图编写程序是一个很好的方法,不仅仅调理清晰,最重要的是减少很多的参数,便于程序员很快的了解每个参数、模块的功能。 之后我们根据老师给的流程图写出了程序代码。

通过这个实验,我决定以后的编程过程中,我必定会写好每一个

项目的流程,以最好的效率完成既定的任务。

…… 此处隐藏:1420字,全部文档内容请下载后查看。喜欢就下载吧 ……
操作系统程序进程通信实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1107878.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)