操作系统实验报告2-进程间通信

实 验 报 告

( 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就没有一点线索。只能硬着头皮去看之前做实验的程序代码,理解每个模块的作用,然后记录下来,对照之前老师给我们的讲解。我发现通过流程图编写程序是一个很好的方法,不仅仅调理清晰,最重要的是减少很多的参数,便于程序员很快的了解每个参数、模块的功能。

之后我们根据老师给的流程图写出了程序代码。

    通过这个实验,我决定以后的编程过程中,我必定会写好每一个项目的流程,以最好的效率完成既定的任务。

相关推荐