【Linux】进程池

目录

进程池

进程池的概念:

手搓进程池:

1、创建信道和子进程

2、通过channel控制子进程

3、回收管道和子进程


进程池

进程池的概念:

        定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,直接将进程再放回进程池中继续等待任务;
        如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,进池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行;这样不会增加操作系统的调度难度,还节省了开关进程的时间,也一定程度上能够实现并发效果。

看下图,父进程和子进程之间可以通过管道来交互;

如果管道中没有数据,则worker进程就阻塞等待;master向哪个管道写入就唤醒哪一个子进程来处理任务;

手搓进程池:

1、创建信道和子进程

我们用一个类来录父进程读写端的fd和子进程的id,用vector来存储;

  • 先来创建一个管道(pipe)
  • 管道创建成功后,再创建子进程(fork)
  • 关闭不需要的fd
  • 将信息存储到vector中

可以将上述代码封装到一个函数中,这样比较好看

#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
using namespace std;class channel
{
public:channel(int wfd, pid_t id, const string &name) : _wfd(wfd), childid(id), _name(name){}~channel(){}int getwfd() { return _wfd; }pid_t getid() { return childid; }string getname() { return _name; }private:int _wfd;pid_t childid;string _name;
};void work(int rfd)
{
}void create(vector<channel> &channels, int num)
{for (int i = 0; i < num; i++){int pipfd[2] = {0};int n = pipe(pipfd);pid_t id = fork();if (id == 0){// child --readclose(pipfd[1]);work(pipfd[0]);close(pipfd[0]);exit(0);}// father --writeclose(pipfd[0]);string name = "channel-" + to_string(i);channels.push_back(channel(pipfd[1], id, name));close(pipfd[1]);}}int main(int argc, char *argv[])
{if (argc != 2){cerr << "processnum???" << endl;return 1;}int num = stoi(argv[1]);// 1、创建子进程和信道vector<channel> channels;create(channels, num);for (auto channel : channels){cout << channel.getid() << " " << channel.getwfd() << " " << channel.getname() << endl;}}

运行结果:

2、通过channel控制子进程

信道建立好后,下面就是接收主进程给我们的任务就可以了,可是子进程如何接收和识别任务呢?

这里我们可以开一个hpp文件来模拟我们的任务:

.hpp文件是允许声明和实现写到一起的;

 在这个文件中使用函数指针类型来初始化,并且有随机选择任务的函数,执行任务的函数;

#pragma once#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;#define NUM 3
typedef void (*task_t)();task_t tasks[NUM];// 创建任务
void Print()
{cout << "I am Print Task" << endl;
}
void Flush()
{cout << "I am Flush Task" << endl;
}
void Download()
{cout << "I am Download Task" << endl;
}// 初始化
void Loadtask()
{srand(time(nullptr) ^ getpid());tasks[0] = Print;tasks[1] = Download;tasks[2] = Flush;
}void Excutetask(int num)
{if (num < 0 || num > 2)return;tasks[num]();
}int selecttask()
{return rand()%NUM;
}

完成.hpp文件后,在我们的.cpp文件中添加对应的头文件;

  • 随机选择一个任务
  • 选择信道和进程
  • 发送任务----父进程完成write操作,子进程完成read操作

 

运行结果:

3、回收管道和子进程
  • 关闭所有w端
  • wait,回收子进程

完整代码:

#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
#include "test.hpp"
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;class channel
{
public:channel(int wfd, pid_t id,const string &name) : _wfd(wfd), childid(id), _name(name){}~channel(){}int getwfd() { return _wfd; }pid_t getid() { return childid; }string getname() { return _name; }void closechannel(){close(_wfd);}void wait(){pid_t rid =waitpid(childid,nullptr,0);if(rid>0){cout<<"wair sucess"<<endl;}}private:int _wfd;pid_t childid;string _name;
};void work(int rfd)
{while (true){int command = 0;int n = read(rfd, &command, sizeof(command));if (n == sizeof(int)){Excutetask(command);}}
}void create(vector<channel> &channels, int num)
{for (int i = 0; i < num; i++){int pipfd[2] = {0};int n = pipe(pipfd);pid_t id = fork();if (id == 0){// child --readclose(pipfd[1]);work(pipfd[0]);close(pipfd[0]);exit(0);}// father --writeclose(pipfd[0]);string name = "channel-";name += to_string(i);channels.push_back(channel(pipfd[1], id, name));}
}int selectchannel(int num)
{static int index = 0;int next = index;index++;index %=num;return next;
}
void send(int selectnum, int channel_index, vector<channel> &channels)
{write(channels[channel_index].getwfd(), &selectnum, sizeof(selectnum));
}void controlonce(vector<channel> &channels)
{// 2.1、选一个任务int selectnum = selecttask();// 2.2、选一个信道和进程int channel_index = selectchannel(channels.size());// 2.3、发送---父进程w,子进程rsend(selectnum, channel_index, channels);cout << "信息发送成功" << endl;
}
void control(vector<channel> &channels, int times = -1)
{if (times > 0){while(times--){controlonce(channels);}}else{while (true){controlonce(channels);}}
}void clean(vector<channel> &channels)
{for(auto channel:channels){channel.closechannel();}for(auto channel:channels){channel.wait();}
}int main(int argc, char *argv[])
{if (argc != 2){cerr << "processnum???" << endl;return 1;}int num = stoi(argv[1]);Loadtask();// 1、创建子进程和信道vector<channel> channels;create(channels, num);// for (auto channel : channels)// {//     cout << channel.getid() << " " << channel.getwfd() << " " << channel.getname() << endl;// }// 2、通过channel控制子进程control(channels, 10);//3、回收管道和子进程clean(channels);
}

以上就是进程池的知识点,希望有所帮助!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足&#xff0c;创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空)&#xff0c;其中每个节点都有一个值&#xff0c;并且满足以下特点&#xff1a; 定义&#xff1a; 左子树节点的值小于根节点的值&#xff1a;对于每个节点&#xff0c;左子树中所…

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…

Vscode的远程开发之VScode优势(一)

一、VSCode 优势 时代的弄潮儿 vscode是微软开源的基于electron的编辑器&#xff0c;通过各种各样的插件&#xff0c;它能够变成你最花里胡哨的IDE。 vscode 最大的特点与优势就是它将Server与Client解耦&#xff1a; 作为Client的vscode&#xff0c;他只负责作为文本编辑器…

kali的学习

一、Namp的使用 首次使用时&#xff0c;要确保Metasploitable已经启动并正在运行 nmap扫描原理&#xff1a; 首先判断nmap传输的命令行中是否包含域名&#xff0c;如果包含需要利用DNS服务器进行域名分析&#xff0c;然后发送ICMP Echo Request 来探测主机存活性。 nmap默认扫描…

判断在子集

今天晚上练习赛的A没写括号&#xff0c;搞了好久&#xff0c;真的是醉了。。。 #include<bits/stdc.h> using namespace std; typedef long long ll; int t; int main() {cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(xy)cout<<0…

构建现代化车辆管理系统:SpringBoot实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理车辆管理系统的相关信息成为必然。开发合适…

理解VSCODE基于配置的设置,避免臃肿

这节课我们讲两点&#xff1a; &#xff08;一&#xff09;下载、安装、汉化及美化 VSCODE&#xff1b; &#xff08;二&#xff09;理解VSCODE中基于配置&#xff08;Profiles&#xff09;的设置&#xff08;Settings&#xff09;&#xff0c;让 VSCODE 保持清爽。 &#xff0…

基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

CTFHUB技能树之SQL——Refer注入

开启靶场&#xff0c;打开链接&#xff1a; 直接挑明是Refer注入 用burp抓包发送到repeater&#xff1a; 发现缺少referer报文头&#xff0c;添加一下&#xff0c;判断是整数型注入还是字符型注入&#xff1a; Referer: 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说…

外星人木乃伊---我的收藏

我收藏了一个与我们星球上任何已知物种无关的非人类标本的明显例子&#xff0c;这具木乃伊遗骸作为地球上存在「非人类」外星人证据。测试证实这些遗骸含有「不来自任何已知物种」的DNA。7%的遗骸DNA“不来自任何已知物种”。这标本不属于我们的陆地进化。它们不是不明飞行物坠…

【android开发】android端部署yolov11-pose实现体测计数

android端部署yolov11-pose实现体测计数 系统概述一、自制关键点数据集预览二、Android Studio项目结构预览三、平板端运行效果预览 系统概述 自制引体、俯卧撑、仰卧起坐数据集&#xff0c;使用自制数据集训练yolo11-pose模型&#xff0c;通过ncnn进行模型转换&#xff0c;得…

【GAMES101笔记速查——Lecture 17 Materials and Appearances】

目录 1 材质和外观 1.1 自然界中&#xff0c;外观是光线和材质共同作用的结果 1.2 图形学中&#xff0c;什么是材质&#xff1f; 1.2.1 渲染方程严格正确&#xff0c;其中BRDF项决定了物体的材质 1.2.2 漫反射材质 &#xff08;1&#xff09;如何定义漫反射系数&#xff1…

数字图像处理:频率域滤波

数字图像处理&#xff1a;频率域滤波 笔者相关内容笔记&#xff1a; 1.傅里叶变换与图像处理 2.傅利叶变换在图像处理的应用 1.1 频率域滤波总体流程 1.2 DFT/IDFT DFT的例子 1.3 常见频率域滤波器 过滤高频信息&#xff0c;保留低频信息&#xff0c;则图像模糊 过滤…

特步引入IPD管理,钉钉项目 Teambition 助力高效产品研发管理

中国是全球第二大消费市场&#xff0c;运动鞋服行业拥有着巨大的发展潜力。在过去五年时间里&#xff0c;随着中国产品品牌和质量的提升&#xff0c;体育市场的占有率格局发生了显著变化&#xff0c;不同于部分国际品牌巨头营收持续减弱&#xff0c;国产领军体育运动品牌「特步…

RK平台 GPIO序号转换软件

RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link

大数据毕业设计选题推荐-电影数据分析系统-电影推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

VSCode中的TypeScript教程

TypeScript 是JavaScript的类型化超集&#xff0c;可编译为纯JavaScript。它提供了类、模块和接口来帮助您构建健壮的组件。 安装 TypeScript 编译器 Visual Studio Code 包括 TypeScript 语言支持&#xff0c;但不包括 TypeScript 编译器tsc。您需要在全局或工作区中安装Typ…

空间解析几何 4:空间中线段到圆的距离【附MATLAB代码】

目录 理论公式 matlab代码 理论公式 对于解一元4次方程&#xff0c;请详见我的博客 一元四次方程求解 -【附MATLAB代码】-CSDN博客文章浏览阅读1.4k次&#xff0c;点赞41次&#xff0c;收藏4次。最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一…

015_基于django旅游数据分析与推荐系统2024_cg8s735i

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…