当前位置: 首页 > article >正文

山东大学2023操作系统实验2

目录

(1)操作系统实验2内容:

 (2)完成方式:

(3)使用函数和功能:

1.pipe函数与有关的功能

2.pipe的返回值

3.pipe的参数

4.使用事项:

(4)实现代码

(5)实现效果


(1)操作系统实验2内容:

创建三个并行的进程,分别完成计算F(x),F(y),F(x,y)三个函数的计算

 (2)完成方式:

实验环境:ubuntn22.04  vscode2023

函数计算:其中两个一维函数可以使用递归计算(fy即为斐波那契数列的计算方式,这两个函数可以使用dp的方式完成优化,这里因为数据量较小不再实现) , 计算二维函数需要使用管道通信,将前两个进程的数据通过管道发送到另一个管道中,实现进程的通信.

并行进程:三个并行进程建立方式是,每次建立子进程后,判断当前的进程是否为父进程,如果当前为父进程,则可以再创建一个进程,这就是三个并行进程的创建方式.

其实这就是fork函数的本质:当某个进程根据fork函数创建子进程的时候,会给根据这个函数创建的两个进程分别配一个返回值,父进程得到的返回值是大于0的,而子进程得到的返回值是0.

一个fork函数只能针对两个进程赋值,但是一个进程(比如父进程)可以得到很多fork函数的返回值

(3)使用函数和功能:

1.pipe函数与有关的功能

int pipe(int port[2]);

 在cpp中,使用这样的方式创建管道,管道也是一种资源,不应该独属于某个进程.

 管道的特点就是只有管道为满的时候,才能读取.在管道为空的时候才能读入,不存在两个端口都开放的情况

在cpp中的体现为:只有用close关闭指定的端口,另一个端口才能正常工作:例如没有关闭管道输入端口,就从管道的输出端口读取数据,会发生阻塞

2.pipe的返回值

数值,当返回值为0的时候,代表这个管道成功创建

3.pipe的参数

是一个两个长度的整数数组,port[0]为管道的输出端口的表示(可以读出),port[1]为管道的输入端口的表示(可以写入)

当一个pipe创建成功的时候,端口的标识符会自动打入这个数组中

4.使用事项:

(1)读取时:要先关闭管道的写入端口,才能从输出端口进行读出

read函数的三个参数分别为:

close(port[1]);
read(port[0],数据,要传输的数据长度);

 注意read的第二个函数要传入引用的形式

(2)输出时:大同小异

close(port[0]);
write(port[1],数据,要传输的数据长度);

(4)实现代码

#include <bits/stdc++.h>
using namespace std;
int fx(int x){
   if(x==1)  return 1;
   else      return fx(x-1)*x;
}
int fy(int y){
   if(y==1||y==2) return 1;
   else           return fy(y-1)+fy(y-2);
}
int main(int args,char * arg[]){
    // try to create a son_process
    int Fx[2];
    if(pipe(Fx)==0)   cout<<"pipe Fy is created"<<endl;
    int Fy[2];
    if(pipe(Fy)==0)   cout<<"pipe Fy is created"<<endl;
    
    //create a process as my first son process
    pid_t pid=fork();

    if(pid==0){// Fx
        close(Fx[0]);
        int x;              cout<<"please input a number as x"<<endl;
        cin>>x;
        x=fx(x);
        write(Fx[1],&x,8);  cout<<"F(x)="<<x<<endl;
    }else if(pid>0){
      pid_t pid1=fork();    //create a process as my second son process
      if(pid1==0){//Fy
        close(Fy[0]);
        int y;               cout<<"please input a number as y"<<endl;
        cin>>y;
        y=fy(y);
        write(Fy[1],&y,8);   cout<<"F(y)="<<y<<endl;
      }else if(pid1>0){//Fxy
        close(Fx[1]);
        close(Fy[1]);
        int x,y;
        read(Fx[0],&x,8);
        read(Fy[0],&y,8);    cout<<"F(x,y)="<<x+y<<endl;
      }
    }
    return 0;
}

(5)实现效果

 


http://www.kler.cn/a/15182.html

相关文章:

  • Excel数据动态获取与映射
  • Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失
  • ue中使用webui有效果白色拖动条 有白边
  • 安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机
  • 机器学习(基础2)
  • Restful API接⼝简介及为什么要进⾏接⼝压测
  • 神经网络模型入门及蠓虫分类问题简单实战
  • 分类和扩展与继承
  • Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练
  • 无HMI和PLC设备时,模拟程序收发是否正常
  • MobileNetV3详细原理(含torch源码)
  • Hytrix原理
  • ​工程师如何对待开源
  • 【keil5开发ARM工程时使用STLink调试的技巧分享】
  • 数据结构之KMP算法:彻底搞懂kmp算法
  • Ajax XHR请求
  • c++元编程
  • Maven 如何下载依赖包的源码包
  • 2023年第二十届五一数学建模竞赛题目 C题详细思路
  • [最小距离的最大值] 跳石头
  • node(express框架)连接mysql 基础篇
  • 数据结构——求二叉树的属性
  • 制造策略 ETO、MTO、ATO、MTS
  • 09 【Sass语法介绍-函数指令】
  • 原理这就是索引下推呀
  • ChatGPT能让智能客服更上一层楼么?