问题描述

设有二元函数 f(x,y) = f(x) + f(y)
其中: f(x) = f(x-1) * x (x >1)
f(x)=1 (x=1)
f(y) = f(y-1) + f(y-2) (y> 2)
f(y)=1 (y=1,2)
请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)

示例程序

使用实验示例程序应实现一个并发的父子程序合作将整数 1 从 1 累加到 10 的功能。
打开命令行终端,新建一个文件夹。
命令:cd 创建路径
Mkdir myfirst3
在新建文件夹中建立以下名为 ppipe.c 的 的 C 语言程序
命令:vi ppipe.c
建立项目管理文件 Makefile(其实后面会发现这个文件不建也可以)
命令生成 ppipe.o 文件
生成 ppipe 执行文件
执行 pctl 程序

独立实验

请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)
f(x,y) = f(x) + f(y)
f(x) = f(x-1) * x (x >1)
f(x)=1 (x=1)
f(y) = f(y-1) + f(y-2) (y> 2)
f(y)=1 (y=1,2)
这里可以将整个进程分为 3 段,分别执行 f[x],f[y],f[x]+f[y],所以这里分别使用 3 个进程来进行这里的控制,首先创建一个子进程 1,用于计算 f[x],在父进程中再次创建一个子进程用于计算 f[y],由于程序的并发执行,可以分别设置两个管程,保证二者之间是互斥的,最后将二者相加即可。
pipe.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int f1(int x)
{if(x==1)
{return 1;
}
else
{return f1(x-1)*x;
}
}
int f2(int y)
{if(y ==1||y==2)
{return 1;
}
else
{return f2(y-1)+f2(y-2);
}
}
int main(int argc,char* argv[])
{int x,y;
printf("Input x,y\n");
scanf("%d %d",&x,&y);
int pid1,pid2;
int pipe1[2];
int pipe2[2];
int pipe3[2];
int pipe4[2];
if(pipe(pipe1)<0)
{printf("pipe1 error");
}
if(pipe(pipe2)<0)
{printf("pip2 error");
}
if(pipe(pipe3)<0)
{printf("pipe3 error");
}
if(pipe(pipe4)<0)
{printf("pipe4 error");
}
if((pid1=fork())<0)
{perror("pipe not create");
}
else if(pid1==0)
{close(pipe1[1]);
close (pipe2[0]);
int x1;
read(pipe1[0],&x1,sizeof(int));
int z=f1(x1);
write(pipe2[1],&z,sizeof(int));
close(pipe1[0]);
close(pipe2[1]);
exit(0);
}
else
{//Father process
if((pid2=fork())<0)
{perror("Process not create ");
exit(EXIT_FAILURE);
}
else if(pid2==0)
{close(pipe3[1]);
close(pipe4[0]);
int y1;
read(pipe3[0],&y1,sizeof(int));
int z=f2(y1);
write(pipe4[1],&z,sizeof(int));
close(pipe3[0]);
close(pipe4[1]);
exit(0);
}
close(pipe1[0]);
close(pipe2[1]);
close(pipe3[0]);
close(pipe4[1]);
int z;
write(pipe1[1],&x,sizeof(int));
write(pipe3[1],&y,sizeof(int));
read(pipe2[0],&x,sizeof(int));
read(pipe4[0],&y,sizeof(int));
z=x+y;
printf("the result is %d\n",z);
close(pipe1[1]);
close(pipe2[0]);
close(pipe3[1]);
close(pipe4[0]);
}
return 0;
}

运行
小结
管程在功能上和信号量及 PV 操作类似,属于一种进程同步互斥工具,但是具有与信号量及 PV 操作不同的属性。管道以半双工方式工作,即它的数据流是单方向的。因此使用一个管道一般的规则是读管道数据的进程关闭管道写入端,而写管道进程关闭其读出端。

父进程和子进程通过返回值是否为 0 来进一步标识,二者并发运行,具体方式有操作系统的内部调度完成,父进程和子进程交替输出的形式是并发和管程控制的共同结果。另外在计算 f[x]和 f[y]时采用调用函数的形式也显得更加清晰。

操作系统实验二、进程通信实验——f(x,y) = f(x) + f(y)相关推荐

  1. 嵌入式系统 实验二 串口通信实验

    实验二 串口通信实验 一.实验目的 1.)了解 USART 的基本特性: 2.)掌握用库函数操作 USART 的方法: 3.)掌握如何使用 STM32 的串口发送和接收数据. 二.实验环境 1.)硬件 ...

  2. 2020 操作系统 实验二 进程通信

    实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...

  3. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

  4. Linux第二次试验:Linux下的进程通信实验

    Linux第二次试验:Linux下的进程通信实验 前言 一.实验目的 二.实验工具与设备 三.实验预备知识 三.实验内容和步骤 五.实验代码及步骤截图 六.实验总结 前言 为了帮助同学们完成痛苦的实验 ...

  5. 【通信原理】实验二 角度调制实验

    目录 实验二 角度调制实验 一.实验目的 二.实验原理: 1.角度调制 (1)角度调制 (1)频率调制(FM): (2)相位调制(PM) (3)单音调制FM与PM (4)非相干解调 2.MATLAB中 ...

  6. CSAPP实验二——bomb lab实验

    CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...

  7. 计算机操作系统感悟随笔--进程通信

    一.进程通信是指进程之间的信息交换 1.低级通信--进程之间的互斥和同步 信号量机制是有效的同步工具,但作为通信工具缺点如下: (1)效率低(通信量少) (2)通信对用户不透明(程序员实现,操作系统只 ...

  8. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  9. 20172310《程序设计与数据结构》(下)实验二:二叉树实验报告

    20172310<程序设计与数据结构>(下)实验二:二叉树实验报告 报告封面 课程:<软件结构与数据结构> 班级: 1723 姓名: 仇夏 学号:20172310 实验教师:王 ...

  10. matlab建立二阶开环系统仿真图,实验二 Simulink仿真实验

    实验二 Simulink仿真实验 一. 实验目的: 1.学会使用Matlab软件中的Simulink仿真工具. 2.了解二阶系统瞬态响应指标的意义其计算. 二. 实验内容及原理 1. 用Matlab仿 ...

最新文章

  1. 通俗易懂的Harris 角点检测
  2. anaconda powershell prompt 启动vscode_记一个VS Code终端显示问题的较完美解决
  3. 模拟浏览器自动化测试工具Selenium之六设置代理篇
  4. python3类的继承详解_python3中类的继承以及self和super的区别详解
  5. 3-7 基于SpringBoot的Apache Shiro环境快速搭建与配置实操
  6. catcti监控linux主机,CentOS7搭建Prometheus 监控Linux主机
  7. 智能会议系统(16)---LinphoneService
  8. vue.js页面刷新出现闪烁问题的解决
  9. ubuntu8.04 之aptitude
  10. Creating and Interning Symbols
  11. 打破“信息孤岛”不能透支信息安全
  12. 小米笔试题--数组移动
  13. pandas小记:pandas基本设置
  14. java面试题2018带答案_java面试题及答案下载
  15. 区块链数据分析1-如何查询token余额
  16. linux中安装无线网卡驱动
  17. VMVare 安装centos系统时,界面显示不全
  18. html5动态加载图片和加载视频
  19. html边框显示长短调整,CSS之border边框长度控制
  20. uboot 下mmc read/write命令使用和验证方法

热门文章

  1. Prescan:关于Prescan与Matlab联合仿真问题小总(不定时补充)
  2. 监控提示服务器状态变更,服务器故障排除与状态监控
  3. 基于51单片机的呼吸灯程序编写
  4. pytorch固定BN层参数
  5. J2EE JavaEE 教程系列
  6. matlab色差,计算CMC色差公式的matlab程序
  7. Ubuntu安装FreeSWITCH亲测
  8. 基于Java实现的免疫算法-克隆选择算法
  9. 第一次申请去美国面签,需要注意哪些事项提高成功率?
  10. QCC3003项目实战:BlueMotor6 AGHFP CVC 蓝牙对讲耳机