【Linux】匿名管道的应用场景 --- 进程池

news2024/12/24 22:05:59

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


前言

本篇博客不会对代码有非常详细的解析,但是只要你看完这篇博客(点击跳转),然后再来看这篇,我保证跟看小说一样 ~

目录

  • 前言
  • 一、池化技术
  • 二、设计思路
  • 三、代码实现之管理管道
  • 四、代码实现之创建子进程和初始化管道字段
  • 五、代码实现之任务列表
  • 六、代码实现之发布任务
  • 七、代码实现之读取任务
  • 八、代码实现之菜单版
  • 九、代码实现之子进程回收
  • 十、一个隐藏bug
  • 十一、相关代码

一、池化技术

不知道大家有没有听过xx池(如内存池等),这些池其实统称池化技术

以内存池为例,比方说有一个偏远的村庄,这个村庄离河边有一定距离,那么村民需要水的时候就跑去河边打水,可是每次需要水的时候就去打未免效率太低了。因此,村民可以提前打完一周所需要的用水。

因此,可以将村民看作是程序,而水则是内存。在没有内存池的情况下,程序每次需要内存时都需要向操作系统申请,而频繁进行系统调用是有成本的,就像村民每次需要水都要跑去河边打水一样,效率较低。而有了内存池,就像村民提前打好一周的水存放在家里一样,程序在启动时就预先分配了一定量的内存,并将其存放在内存池中。当程序需要内存时,就直接从内存池中获取,而不是每次都向系统请求,这样可以减少内存分配的开销和系统的负担,提高程序的运行效率。

因此,不管是xx池,这些池化技术的共同特点是:通过提前分配一定数量的资源并在需要时复用这些资源,来提高系统的性能和效率。

进程池是一种并发编程中常用的技术,特别是在需要处理大量任务的情况下。它类似于内存池的概念,想象一下有很多任务需要处理,而每个任务都需要独立的进程来执行。如果每次都创建一个新的进程来处理任务(如创建进程控制块、进程地址空间等),会增加系统开销和资源消耗,特别是在任务量大的情况下。这时,就可以使用进程池。

进程池在程序启动时就会创建一定数量的进程,并将它们保存在池中。当有任务需要执行时,就从池中获取一个空闲的进程来处理任务,任务执行完毕后,该进程不会被销毁,而是返回到池中,等待下一个任务的到来。这样可以避免频繁创建和销毁进程的开销,提高系统的性能和效率。

二、设计思路

请添加图片描述

首先我们可以通过父进程bash,来提前创建好若干个子进程。接下来为了让父进程和这些子进程建立联系,在父进程和子进程之间设计匿名管道,父进程下达任务数据到管道中,再由子进程接收任务并执行。

三、代码实现之管理管道

为了让子进程和父进程建立可靠的数据传输通道,应该要对管道进行管理。那么就要先描述,再组织。

描述管道的字段有:

  • _cmdfd:父进程需要向哪个管道发送任务,因此需要知道各管道的写端,即文件描述符。
  • _sonid:当父进程将任务发送到管道中时,子进程可以通过自己的pid来确定是否是自己需要执行的任务。

在这里插入图片描述

四、代码实现之创建子进程和初始化管道字段

我们可以封装一个函数创建子进程,并且初始化子进程对应的管道字段。具体代码如下:

在这里插入图片描述

传参的小技巧

  1. 输入型参数:用于传递数据给函数,但形参的改变不用影响实参 -> const&
  2. 输出型参数:形参改变要影响实参,当函数被调用时,输出型参数可以不初始化 -> *
  3. 输入输出型参数:和输出型参数的区别是 -> 这些参数在函数调用前需要被初始化 -> &

我们可以通过打印的方式来来验证是否真的创建成功了

在这里插入图片描述

【程序结果】

在这里插入图片描述

五、代码实现之任务列表

新建一个文件名为tasks.hpp,里面用来存放任务的实现。具体代码如下:

补充:.hppc++常见的头文件。该文件中通常会包含类的定义、模板类和函数的实现,即定义和声明不分离。

在这里插入图片描述

六、代码实现之发布任务

父进程需要发布任务给进程池中的任意一个进程,需要经历以下步骤:

  1. 选择任务。这里我们可以这样规定:我使用一个数据结构(如vector)管理任务列表,然后父进程可以通过随机选取任务列表中的下标,我们可以称为任务码。最后将这个任务码发送给子进程,让子进程来执行任务码对应的任务。
  2. 选择进程:我们可以随机选取进程池中的任意一个进程来执行。
  3. 发布任务:将任务码写入到管道文件中

首先我们需要将任务列表中的所有任务用一种数据结构管理起来,这里就以vector为例

C++标准库中的 <functional> 头文件提供了一组模板类和函数,用于实现函数对象(包括函数指针)的封装、组合和操作

在这里插入图片描述

接下来我们需要控制任意一个进程来执行任务

在这里插入图片描述

七、代码实现之读取任务

在这里插入图片描述

【程序结果】

在这里插入图片描述

八、代码实现之菜单版

我们只需要修改【发布任务】的代码即可实现

在这里插入图片描述

【程序结果】

在这里插入图片描述

九、代码实现之子进程回收

如上菜单所示,当程序退出的时候,可以选择将子进程回收

在这里插入图片描述

【程序结果】

在这里插入图片描述

十、一个隐藏bug

在这里插入图片描述

当我们的父进程创建子进程的时候,因为我们用的是循环的方式,所以导致父进程每创建一个子进程,那么下一个进程就会继承上一个管道的写端。这样子进程之间也可以相互进行通信了。

那有什么问题呢?我们上面代码都跑的好好的呀!但如果你写出以下代码,就是一个bug

在这里插入图片描述

【程序结果】

在这里插入图片描述

为什么会阻塞呢?

在关闭第一个进程的时候,我们先是将写端关闭,那么对应的读端的read函数就会返回0,表示可以退出通信了。退出通信后代码就要开始回收第一个进程。可是,第二个进程甚至后面的进程都继承了这个写端(写端没关完),那么操作系统还是认定系统还在通信,那么read函数就不会返回0,可是我们在关闭文件描述符后,紧接就要回收这第一个进程了,可是第一个进程还在通信,并没有退出,那么系统就要等待它退出,所以就阻塞了。

  • 解决方法1:先将文件描述符全部关闭,再回收所有子进程。(最开始的方案)

  • 解决方法2:可以关闭和回收一起做。只需要倒着来就行。(可以配合刚开始的那个图理解)

在这里插入图片描述

【运行结果】

在这里插入图片描述

  • 解决方法3:让一个管道只有一个读端,一个写端。在创建一个子进程前,将继承父进程的写端文件描述符关闭即可。

在这里插入图片描述

【程序结果】

在这里插入图片描述

十一、相关代码

Gitee仓库链接:点击跳转

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

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

相关文章

Makefile:从零开始入门Makefile

目录 1.前言 2.Makefile的简单介绍 3.Makefile中的指令规则 4.Makefile的执行流程 5.Makefile中的变量类型 6.Makefile中的模式匹配 7.Makefile中的函数 8.Makefile补充知识 前言 在Linux中编译CPP文件&#xff0c;我们能够使用GCC命令进行编译&#xff0c;但当项目文件多且繁杂…

OpenGauss数据库-5.数据更新

第1关&#xff1a;插入数据 gsql -d postgres -U gaussdb -W "passwd123123" create table student (id integer primary key,name char(20),age integer ); insert into student values(1,"lily",20),(2,lily,21),(3,marry,19); 第2关&#xff1a;删除数…

C51学习归纳9 --- I2C通讯学习(重点)

首先&#xff0c;我自己学习过以后的直观感觉&#xff0c;通信协议是单片机的灵魂之一&#xff0c;只有规定好了通信协议我们才能够正确的接收到信息&#xff0c;才能实现更加深入的研究。所以这一部分是需要好好学习的。 本节借助一个可存储的芯片AT24C02&#xff0c;进行在I2…

仿饿了么的谁去拿外卖游戏源码

源码介绍 喝酒 没有游戏玩&#xff1f; 懒得下床 不想出去 那么好 这个游戏会 满足你! 玩法 每人都选择一个序号 4 个人为例 张三选第 ① 李四选第 ② 王五选第 ③ 赵前选第 ④ 然后就按 4 下 其中最小的数对应的序号就是他输了就去拿外卖&#xff01; 源码下载 仿饿了么…

快速开始一个go程序(极简-快速入门)

一、 实验介绍 1.1 实验简介 为了能更高效地使用语言进行编码&#xff0c;Go 语言有自己的哲学和编程习惯。Go 语言的设计者们从编程效率出发设计了这门语言&#xff0c;但又不会丢掉访问底层程序结构的能力。设计者们通过一组最少的关键字、内置的方法和语法&#xff0c;最终…

IDEA创建SpringBoot项目的时候,如何使用Java8,怎么办?

在创建springboot项目的时候,IDEA提示&#xff0c;最低Java版本要求17&#xff0c;但是实际上我们可能不需要这么高的版本&#xff0c;怎么使用Java8呢&#xff1f; 解决办法 修改Server URL地址即可&#xff1a;https://start.aliyun.com

【PHP【实战训练】系统性学习】——最经典的web端头像上传,数据库内容安全精简

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

SpringBoot个人网盘系统-计算机毕业设计源码92922

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势或改善自身的缺点&#xff0c;互联网的发展文件管理带来了福音。个人网盘系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…

算法——Floyd判圈算法

介绍 Floyd判圈算法用于判断一个链表中是否有环。 思想 使用快慢指针fast, slow&#xff0c;快指针每次走两步fast fast.next.next&#xff0c;慢指针每次走一步slow slow.next。当出现fast null || fast.next null时&#xff0c;说明链表不存在环&#xff0c;如果存在环…

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时&#xff0c;经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库&#xff0c;但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…

欢乐打地鼠小游戏html源码

这是一款简单的js欢乐打地鼠游戏&#xff0c;挺好玩的&#xff0c;老鼠出来用鼠标点击锤它&#xff0c;击中老鼠获得一积分。 欢乐打地鼠小游戏html源码

信息系统项目管理师0150:工具与技术(9项目范围管理—9.4收集需求—9.4.2工具与技术)

点击查看专栏目录 文章目录 9.4.2 工具与技术9.4.2 工具与技术 专家判断 收集需求过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:可行性研究与评估;需求获取;需求分析;需求文件;以往类似项目的项目需求;图解技术;引导;冲…

这个国际档案日,大比武放榜、直播预约、课件下载,一样都不能少!

关注我们 - 数字罗塞塔计划 - 2024年6月9日第十七个国际档案日来临&#xff0c;数字罗塞塔计划放大招&#xff1a;第二届大比武活动榜单揭晓、ARCHE-2024上海智慧档案高峰论坛直播预约、2024上半年度课件大礼包下载。如此大礼&#xff0c;岂能错过&#xff1f; PART.01 榜单…

通过 Python+Nacos实现微服务,细解微服务架构

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 背景 一直以来的想法比较多&#xff0c;然后就用Python编写各种代码脚本。很多…

【线性代数】向量空间,子空间,向量空间的基和维数

向量空间 设V为n维向量的集合&#xff0c;如果V非空&#xff0c;且集合V对于向量的加法以及数乘两种运算封闭&#xff0c;那么就称集合V为向量空间 x&#xff0c;y是n维列向量。 x 向量组等价说明可以互相线性表示 向量组等价则生成的向量空间是一样的 子空间 例题18是三位向…

4.大模型微调技术LoRA

大模型低秩适配(LoRA)技术 现有PEFT 方法的局限与挑战 Adapter方法,通过增加模型深度而额外增加了模型推理延时。Prompt Tuning、Prefix Tuning、P-Tuning等方法中的提示较难训练,同时缩短了模型可用的序列长度。往往难以同时实现高效率和高质量,效果通常不及完全微调(f…

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归) 文章目录 算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)一、层序遍历二、226. 翻转二叉树(优先掌握递归)三、101. 对…

小程序中实现自定义头部导航组件

在页面中实现自定义头部导航的组件&#xff0c;如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”&#xff0c;如果是项目中所有页面都想使用自定义的组件&#xff0c;可在app.json的window中全局配置"navigationStyle"…

2024-6-9

今日安排&#xff1a; 学校的课程作业windows SEH 机制简单入门windows 用户态 pwn / 内核态入门 计网实验报告 && 网安实验报告继续审计 nf_tables 源码&#xff0c;主要看 active 相关逻辑。复现 CVE-2022-32250 这个漏洞【 && iptables 相关学习】♥♥♥♥…

【车载开发系列】MCU选型

【车载开发系列】MCU选型 【车载开发系列】MCU选型 【车载开发系列】MCU选型一. 重要概念二. MCU选型的风险风险1风险2 三. MCU选型要点四. MCU选型维度五. MCU 选型需要考虑的因素1&#xff09;ROM/RAM2&#xff09;速度/主频3&#xff09;分析外设需求4&#xff09;工作电压(…