Liunx:简易版进程池

        进程向系统申请资源存在一定的效率问题。系统调用在底层是有成本的。频繁的向操作系统申请资源会造成一定的开销。解决办法是一次性向系统申请你需要的资源,将这些资源在用户层管理维护起来,减少程序频繁的陷入内核。这就是池化的意思,可以简单的理解层,一次性申请全部的资源,然后将这些资源在用户层管理维护,需要使用时不再陷入内核。       


#include<iostream>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<vector>
#include<string>
#include<stdio.h>
#include <stdlib.h>
#include"Task.hpp"#define Tasknum 2//输入 const &
//输出 *
//输入输出 &using namespace std;//子进程的pid,管道的writefdstruct channel
{pid_t _pid;int _child_fd;string _name;channel():_pid(-1),_child_fd(-1),_name(""){}channel(pid_t pid,int fd,const string& name):_pid(pid),_child_fd(fd),_name(name){}
};
void mission(int read_fd)
{sleep(5);cout<<"process run...\n"<<endl;cout<<"child::read_fd:"<<read_fd<<endl<<endl;int cnt=5;while(cnt--){  int task_id=0;int n=read(read_fd,&task_id,sizeof(int));if(n==0) //没有读取到就为0{cout<<"没有数据\n"<<endl;close(read_fd);exit(0);}cout<<"child:: read task_id--------"<<task_id<<endl;}return ;
}void Init_ProcessPool(vector<channel>& pool)
{//创建子进程建立管道for(int i=0;i<Tasknum;i++){    int pipefd[2];int ret = pipe(pipefd);if(ret==-1){cout<<"main:: pipe error ...\n"<<endl;exit(-2);}pid_t pid=fork();if(pid<0){cout<<"main:fork() error...\n"<<endl;exit(-1);}//建立管道//子进程执行if(pid==0){cout<<"child:: "<<getpid()<<" 关闭写端\n"<<endl;close(pipefd[1]);//子进程关闭写端//dup2(pipefd[0],0);cout<<"child::执行任务\n"<<endl;mission(pipefd[0]);cout<<"child::进程退出\n"<<endl;exit(0);}close(pipefd[0]);//父进程关闭读端sleep(1);string name="process-"+to_string(i);cout<<"main::组织子进程\n"<<endl;pool.push_back(channel(pid,pipefd[1],name));//将子进程的管道写端,pid,name组织cout<<pool.back()._name<<endl;}
}int main()
{time_t t;srand(time(&t));vector<channel> pool;//组织子进程Init_ProcessPool(pool);for(int i=0;i<Tasknum;i++){cout<<pool[i]._pid<<"---"<<pool[i]._child_fd<<"---"<<pool[i]._name<<endl;}//控制进程sleep(2);int cnt=5;while(cnt--){int task_id=rand()%Tasknum;//选择任务int process_id=rand()%Tasknum;//选择进程 //这里是随机选择,也可以轮询选择,cnt++%sizecout<<task_id<<endl;cout<<process_id<<endl;cout<<"main:: 选择子进程 "<<pool[process_id]._name<<" 任务码 "<<task_id<<endl;int n=write(pool[process_id]._child_fd,&task_id,sizeof(task_id));//将任务码传递给进程if(n<0){cout<<"main::write to "<<pool[process_id]._child_fd<<" false\n"<<endl;}sleep(1);}for(int i=0;i<Tasknum;i++){waitpid(-1,NULL,0);}// int child_ret=0;// int n=waitpid(-1,&child_ret,0);// if(n>0)// {//     cout<<"wait sucessfully:: "<<n<<endl;// }return 0;
}

        

        父进程第一次申请读写端文件描述符是3,4,fork后,子进程关闭4,子进程的task_struct中复制此时打开的内存级文件指针。父进程关闭读,在父进程的taskstruct中同步关闭相应的文件。

        循环式的创建管道,子进程读端的fd值一样,但是指向的文件不一样。     

        管道应该在fork()之前创建。 

 

        父进程创建管道,他的写端也会被其他子进程拷贝,管道文件的写段也会被其他进程接收。

         

        这影响父进程等待回收子进程的过程。需要先在中主进程依次关闭写端,再依次等待子进程。否则子进程会因为由于管道文件未关闭而阻塞等待,父进程也会阻塞等待子进程退出。导致程序宕机。

        程序在最后wait时宕机。

        或者在父进程中创建一个数组记录上一次打开的读端fd,子进程关闭所有的读端。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11240.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

百亿AI数字人社会初现:Project Sid展示智能代理文明进化路径

项目背景 Project Sid 是一项开创性的AI代理人文明实验,旨在通过新开发的认知架构 PIANO 探讨AI代理人是否能够在大规模数字社会中实现文明的演进。这项实验不仅展示了社会进步、角色分化、治理体系及文化传播等特征,还揭示了一个包含百亿“数字人类”的社会可能性。 PIANO…

CoCa: Contrastive Captioners are Image-Text Foundation Models

Jiahui Yu† Zirui Wang†{jiahuiyu, ziruiw}google.comVijay Vasudevan Legg Yeung Mojtaba Seyedhosseini Yonghui WuGoogle Research 参考代码链接&#xff1a;https://github.com/lucidrains/CoCa-pytorch 模型效果对比网址&#xff1a;CoCa: Contrastive Captioners are …

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发

功能级一多开发与工程级一多开发 引言功能级一多开发SysCaps机制介绍能力集canlUse接口 工程级一多开发三层架构规范 引言 一次开发多端部署 定义&#xff1a;一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署 目标&#xff1a;支撑开发者快速高效的开发多终端设…

c中的文件管理

大家好&#xff0c;今天我们来看看语言中的文件管理&#xff0c;聊到这个&#xff0c;我们就得先说说文件的特点。 1.文件是一种让数据持久化的方法&#xff0c;使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据持久化。 那么什么是文件呢&#xff1f; 硬盘上…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

python中常见的8种数据结构之一数组的应用

在Python中&#xff0c;数组是一种常见的数据结构&#xff0c;用于存储一系列相同类型的元素。在实际应用中&#xff0c;数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用&#xff1a; 1. 存储和访问数据&#xff1a;数组可以用于存储和访问一组数据。可以通过…

Android 实现柱形图

在 Android 中实现柱状图&#xff0c;可以使用流行的图表库 MPAndroidChart&#xff0c;它支持多种类型的图表&#xff0c;包括柱状图、折线图、饼图等。下面是一个基本的柱状图实现步骤&#xff0c;具体分为以下几个部分&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在 …

python基础

1.python的第一个程序 2.代码注释 3.交互模式 4.变量与常量 电影文件是有文件类型&#xff1a;MP4&#xff0c;avi 图片文件&#xff1a;jpeg&#xff0c;png&#xff0c;jpg 5.数据类型 python类型决定了当前变量在内存中的存储体积 字符串&#xff0c;字符&a…

13.UE5流星火雨,引导施法技能制作

2-15 流星火雨&#xff0c;引导施法技能制作、随机数_哔哩哔哩_bilibili 目录 1.为流星火雨添加按键映射 2.创建流星火雨的动画蒙太奇 3.实现播放动画蒙太奇的逻辑 ​编辑 4.定义发射一波流星火雨的发射物 5.使用动画通知释放流星火雨 1.为流星火雨添加按键映射 创建名为流…

【python程序】恢复曾经删除的QQ说说

是否还能想起曾经的QQ说说&#xff0c;是否还想知道自己以前删除了什么 今天就给大家介绍下这个可以恢复以前删除的QQ说说的 小工具 这个工具是由python编写的&#xff0c;也已经打包好了小程序&#xff0c;一键运行 具体下载地址&#xff1a;https://pan.quark.cn/s/b3f41e3…

Springboot 整合 Java DL4J 打造企业知识图谱构建系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

goroutine 介绍

引子&#xff1a; 线程比如打开腾讯视频然后开始下载多个视频&#xff0c;下载任务就是线程 但是这并不是同时进行的&#xff0c;只是时间片比较短切换的比较快 进程和线程的关系 有些程序可以多进程有些可能不支持 并发和并行 并发和并行的根本区别是&#xff1a;并发在同一时…

Ubuntu[无桌面]——修改Docker镜像源文件

下载镜像的时候&#xff0c;一般有两种方式&#xff1a; &#xff08;1&#xff09;在宿主主机配置相应的文件/etc/docker/daemon.json&#xff0c;配置镜像源环境地址 &#xff08;2&#xff09;进入https://quay.io/search中&#xff0c;输入搜索需要下载的镜像名称&#xff…

Linux开发讲课49--- Linux 启动过程分析

理解运转良好的系统对于处理不可避免的故障是最好的准备。 启动过程非常简单。内核在单核上以单线程和同步状态启动&#xff0c;似乎可以理解。但内核本身是如何启动的呢&#xff1f;initrd&#xff08;initial ramdisk&#xff09; 和引导程序(bootloader)具有哪些功能&#…

简单安全的密码生成器PSWD

在我们折腾的过程中&#xff0c;经常要生成 APP KEY、JWT_SECRET、SECRET_KEY 一类的参数&#xff0c;除了可以用 openssl rand 命令来生成外&#xff0c;也可以用在线的密码生成器来生成&#xff0c;例如我们今天介绍的 PSWD 什么是 PSWD ? PSWD 是一个简单且安全的密码生成…

【cursor添加azure】在cursor中添加azure的openai api

右上角-设置 会弹出 下拉找到azure 这部分从你的azure后台获取 返回cuesor&#xff0c;点击 输入你的模型名称 然后回车 就可以开始使用了&#xff5e;

JSqlParser、JavaCC实操

1. 背景 项目中使用mubatis-plus&#xff0c;有个sql报错&#xff0c;信息如下 通过debug我发现是第四行代码报错 net.sf.jsqlparser.parser.CCJSqlParserUtil#parseStatements public static Statements parseStatements(String sqls) throws JSQLParserException {CCJSqlP…

【人工智能训练师】3 集群搭建

开启集群环境 本次环境为单节点伪集群环境&#xff0c;环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。— 1.环境中已经安装/root/software/hadoop-2.7.7&#xff0c;格式化HDFS&#xff0c;开启集群&#xff0c;查看集群状态。&#xff08;HDFS端口为9000&#x…

力扣二叉树题解含思路(C++实现)

1.求二叉树的最近公共祖先&#xff1a; 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 假设这题的p&#xff0c;q分别为7和8&#xff0c;而它们的最近公共祖先肯定是为3。 这题我们大致的思路为保存p&#xff0c;q的绝对路径&#xff0c;接着通过存储的绝对路…

稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣

稀硫酸介质中 V 型球阀的材质选择与选型要点 在工业生产中&#xff0c;稀硫酸是一种常见的化学介质&#xff0c;对于输送和控制稀硫酸的阀门&#xff0c;正确的材质选择和选型至关重要。本文将介绍稀硫酸介质中 V 型球阀的材质选择&#xff0c;并提供一些选型的要点。 一、稀硫…