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

在这里插入图片描述

👦个人主页: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仓库链接:点击跳转

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

体素技术在AI绘画中的革新作用

随着人工智能技术的不断进步&#xff0c;AI绘画已经成为艺术创作和视觉设计领域的一大趋势。在众多推动AI绘画发展的技术中&#xff0c;体素技术以其独特的优势&#xff0c;正在逐渐改变着我们对计算机生成图像的认识。本文旨在探讨体素技术在AI绘画中的应用与影响&#xff0c;…

【车载开发系列】MCU选型

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

DNS域名解析服务和bond网卡

DHS域名解析 概述 DNS是域名系统的简称&#xff0c;它的作用就是域名和ip地址之间的映射关系。 在互联网中&#xff0c;ip地址是通信的唯一标识。&#xff08;逻辑地址&#xff09; 访问网站需要一个域名 域名解析的目的就是为了实现访问域名就等于访问ip地址。 在访问域…

【数据结构】前缀树(字典树)汇总

基础 {“a”,“abc”,“bac”,“bbc”,“ca” }的字典树如下图&#xff1a; 最主用的应用&#xff1a;一&#xff0c;字符串编码。二&#xff0c;位运算。 字符串编码 相比利用哈希映射编码&#xff0c;优点如下&#xff1a; 依次查询长度为n的字符串s的前缀时间复杂度是O(…

直接用sql语句来查询和分析excel表,不需要导数据,提供了sql语句自动生成,不会sql也能用

用sql语句来查询excel表&#xff0c;我们需要把excel表格导入到数据库中&#xff0c;然后用数据库的管理工具写sql语句来进行查询。方法有很多&#xff0c;我们不一一描述。 今天我们要说的是直接用sql语句来查询和分析excel表。为什么有这么一个想法呢&#xff1f;程…

《软件定义安全》之五:软件定义的安全架构

第5章 软件定义的安全架构 1.软件定义安全架构 安全控制平台&#xff0c;主要负责安全设备的资源池化管理、各类安全信息源的收集和分析、与客户业务系统对接&#xff0c;以及相应安全应用的策略解析和执行。 安全应用是根据特定的安全需求所开发的程序&#xff0c;它利用安全…

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中&#xff0c;对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具&#xff0c;能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…

上位机图像处理和嵌入式模块部署(f407 mcu项目开发、产品开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和做项目、产品相比较&#xff0c;做技术还是比较简单的。一般来说&#xff0c;所谓的技术&#xff0c;就是把相关的功能实现即可。但是做项目和产…

月薪70-100k,京东招ML算法工程师和运筹优化专家!

Datawhale分享 推荐&#xff1a;黄玉琳&#xff0c;京东&#xff0c;Datawhale成员 团队介绍 我们是京东零售集团供应链算法优化团队&#xff0c;通过在人工智能与运筹优化领域的持续性技术革新,为京东自营千万级商品提供算法策略支持,实现了以用户为中心的供应链管理和更高效…

这两款kimi和豆包插件,用来辅助文献阅读和总结,太香了!娜姐亲测好用

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 ChatGPT刚出来的时候&#xff0c;几款速读PDF的AI工具ChatDoc、ChatPDF也跟着火了起来&#xff0c;可见大家对于速读文献、总结文档需求很高。 我记得ChatPDF只有几次免费机会…

这4个科研思维陷阱,可能正在阻碍你发表论文!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 昨天&#xff0c;有位同学忧心忡忡的过来问我&#xff1a;一区文章已经接收了&#xff0c;因为两张图里有错误&#xff0c;想要撤稿重投。 我的建议如下&#xff1a; 1 重新投…

LabVIEW 用于 MES 系统和卡钳上位机检测

LabVIEW 确实可以用于制造执行系统&#xff08;MES&#xff09;的开发以及卡钳上位机检测。以下是详细说明&#xff1a; 使用 LabVIEW 开发 MES 系统 数据采集与处理&#xff1a;LabVIEW 擅长实时数据采集和处理&#xff0c;可以连接多种传感器和设备&#xff0c;获取生产线上…

如何远程桌面连接?

远程桌面连接是一种方便快捷的方式&#xff0c;可以帮助用户在不同地区的设备之间实现信息的远程通信。我们将介绍一种名为【天联】的组网产品&#xff0c;它可以帮助用户轻松实现远程桌面连接。 【天联】组网是一款异地组网内网穿透产品&#xff0c;由北京金万维科技有限公司…

最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程

简介&#xff1a; 最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6 ![CYA]CPZMY8NK8YADA.png](https://img-blog.csdnimg.cn/img_convert/fe17ef2c4663e1ad9d79b5e55f1db146.png)

【ARM】PK51-如何添加芯片型号的方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 遇到打开工程提示没有该芯片设备提示如何解决。 2、 问题场景 客户发来一个工程文件&#xff0c;打开后软件提示没有发现该芯片设备提示。 图 1 3、软硬件环境 1&#xff09;、软件版本&#xff1a;keil μvision…

【Linux】用户和组的管理、综合实训

目录 实训1&#xff1a;用户的管理 实训2:组的管理 实训3:综合实训 实训1&#xff1a;用户的管理 (1)创建一个新用户userl&#xff0c;设置其主目录为/home/user 1。 (2)查看/etc/passwd 文件的最后一行&#xff0c;看看是如何记录的。 (3)查看文件/etc/shadow文件的最后一…

【Qt秘籍】[010]-Qt常用控件

一、控件概述 在GUI&#xff08;图形用户界面&#xff09;开发领域&#xff0c;Qt无疑是众多开发者心中的首选框架之一。它不仅跨平台、功能强大&#xff0c;而且拥有丰富且灵活的控件库&#xff0c;使得开发者能够快速构建美观、高效的用户界面。对于初学者而言&#xff0…

k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装

文章目录 前言VPA简介简单理解详细解释VPA的优缺点优点1.自动化资源管理2.资源优化3.性能和稳定性提升5.成本节约6.集成性和灵活性 缺点1.Pod 重启影响可用性2.与 HPA 冲突3.资源监控和推荐滞后&#xff1a;4.实现复杂度&#xff1a; 核心概念Resource Requests 和 Limits自动调…

星空如何异地组网?

网络已经成为人们生活的重要组成部分。无论是个人还是企业&#xff0c;都需要通过网络进行信息传输和资源共享。在传统的网络连接方式中&#xff0c;存在着网络限制、访问速度慢、数据安全等问题。随着科技的发展&#xff0c;一种全新的网络连接方式──星空异地组网&#xff0…

正确理解iOS中的同步锁

在 iOS 开发中&#xff0c;同步锁&#xff08;synchronized lock&#xff09;是一种用于管理多线程访问共享资源的机制&#xff0c;而不是某一种特定类型的锁。它涵盖了多种具体实现和技术&#xff0c;用于确保同一时间只有一个线程能够访问某个共享资源&#xff0c;从而避免数…