实 验 报 告
( 20## / 20##学年 第1学期)
进 程 通 信
指导老师: 夏 建
一、实验题目
进程通信上机实验(消息缓冲通信)
二、算法思想
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()
程序:
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()
程序:
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;
char temp;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[j]<a[i]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}//if
}//for
}
}
2.修改P1、P2、P3程序
Process1() 在阻塞前插入以下操作代码
Process1() 在阻塞前插入以下操作
Process1程序:
process1(){
char flag;
char a[100];
int len;
if(addr=='m') goto m;
i=1;m1=1;
a: printf("\n process1 printing m1=%d\n\n",m1);
printf("do you want to send data ?(y/n)"); //是否发送消息
flag=getchar();
if(flag=='y'||flag=='Y'){
printf("input data:");
scanf("%s",a);
len=strlen(a);
send(1,a,len); //将消息输送到缓冲队列中
printf("\n");
}
printf("process1 calls p on sem1!\n");
if(p(1,1,'m')==0)
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;
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就没有一点线索。只能硬着头皮去看之前做实验的程序代码,理解每个模块的作用,然后记录下来,对照之前老师给我们的讲解。我发现通过流程图编写程序是一个很好的方法,不仅仅调理清晰,最重要的是减少很多的参数,便于程序员很快的了解每个参数、模块的功能。
之后我们根据老师给的流程图写出了程序代码。
通过这个实验,我决定以后的编程过程中,我必定会写好每一个项目的流程,以最好的效率完成既定的任务。
实验一进程管理一目的进程调度是处理机管理的核心内容本实验要求编写和调试一个简单的进程调度程序通过本实验加深理解有关进程控制块进程队…
昆明理工大学信息工程与自动化学院学生实验报告20xx20xx学年第二学期课程名称操作系统开课实验室信自楼44420xx年4月10日…
操作系统进程管理实验实验题目1进程的创建编写一段程序使用系统调用fork创建两个子进程当此程序运行时在系统中有一个父进程和两个子进…
实验报告纸院系专业班组课实验一进程管理3学时必做一实验目的通过实验使学生进一步了解进程进程状态进程控制等基本概念基本能达到下列具体…
一、实验目的本实验要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁…
课程设计综合实验报告201320xx年度第二学期名称Windows体系编程题目院系班级学号学生姓名指导教师王新颖实验学时12学时成…
软件学院计算机课程实验报告册课程名称计算机操作系统实验学期20xx年至20xx年第2学期学生所在院系软件学院年级11软件专业班级软…
进程间通信实验报告班级10网工三班学生姓名谢昊天学号1215134046实验目的和要求Linux系统的进程通信机构IPC允许在任意…
实验三进程的同步一实验目的1了解进程同步和互斥的概念及实现方法2更深一步的了解fork的系统调用方式二实验内容1预习操作系统进程同…
进程控制与处理机调度实验报告院系:计算机与通信工程学院班级:嵌入式10-02班姓名:学号:一、实验目的通过模拟进程控制方法及单处理…