当前课程知识点:基于Linux的C++ >  第十三讲 进程编程 >  13.11 进程池 >  LinuxCPP1311

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP1311在线视频

LinuxCPP1311

下一节:LinuxCPP1312

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP1311课程教案、知识点、字幕

这一讲最后一个技术细节

就是进程池

那么首先要明确一个动机

为什么要引入进程池

我们前面讲了

我可以很简单地通过一个fork()

一个函数调用

就可以创建一个子进程

子进程将会是父进程的

完整的一个副本

你可以在子进程中启动其它的操作

在进行多进程编程的时候

我们需要频繁地创建子进程

有些特定的服务

它需要创建子进程

来替你完成客户的请求

那么当这个客户请求很多

很频繁地到达时候

我们就需要频繁地创建子进程

当它服务完这个请求以后

这个子进程又会被清除

它又会完毕 又会被清除

那么在这种情况下

就会涉及到频繁地创建或释放子进程

这个效率显然是低的

很多时候 这样创建出来的子进程

一般就是为单一的客户去服务的

那么如果你频繁地去创建它或释放它

这个系统的开销是非常非常高的

所以我们没有必要这么去处理

我们在服务器启动的时候

就可以创建好几个子进程

专门等待着来为客户服务

服务了你之后

这个子进程就可以在一边歇着

你不用把它销毁

当新的客户来了

就把这个子进程重新再把它叫出来

替你提供服务就完了嘛

干嘛每次一个客户请求来

都创建一个新的子进程呢

如果这些子进程能够

被很好地复用起来

那么我们整个程序的运行效率

那不肯定就有所提高吗

这个就叫进程池

所以说主进程预先创建一组子进程

然后统一对它进行管理

当客户请求到达的时候

它就从主进程所创建的

这个子进程池子里选一个子进程出来

响应你客户的请求

这样的话

我们程序执行起来效率又高

管理起来不又方便吗

这就是多快好省

所以子进程在一开始就创建好

它有一个很重要特点

就是它们可以使用同样的代码

具有同样的属性

在真实地创建这个进程池的时候

那么创建出来的子进程的个数

它有一个习惯性的约定

就是一般地是和我们

这个计算机系统里面的CPU那个数目

是一致的

有时呢也可以多一些

比如讲是CPU数目的两倍

为啥啊 因为我们现在有的CPU

它可以做超线程计算

一个核实际上可以同时跑两个线程

甚至我们可以当作跑两个进程

一样也没有关系

那么在这种情况下

可以跑两段代码

所以我们实际上可以用CPU数目的两倍

创建这个进程池 可以

一般是和CPU数目是一致的

很少超过CPU数目的两倍

那么进程池到底是怎么工作的呢

那这个问题就很讲究了

当一个主进程创建一个进程池的时候

事实上主进程充当的

是一个服务器的角色

子进程充当的就是服务员

子进程就会按照主进程的要求

提供服务

当任务到达的时候

主进程就会选择一个子进程

完成这个服务

相对于动态创建子进程

选择一个子进程这个过程 这个代价

显然是要小的

这些子进程被我们复用

如果它只用一遍

不管你一开始创建还是临时创建

效果其实都一样的

这个进程响应完这个客户请求之后

后来又有一个客户的请求

那么它又可以继续响应

它不就省略了

第二次创建一个子进程的动作吗

所以选择的代价肯定是小的

这个子进程被复用了嘛

在选择一个特定的子进程

提供服务的时候

它是有很多种选择策略的

你比如讲

随机选择一个子进程提供服务

可以不可以

采用轮值制度 可不可以 可以

一个接着一个来 也行

这叫轮值制度 你也可以

那么这些子进程

共享一个单一的一个任务队列

有任务了 它就去响应

没有任务 它就睡眠

行不行呢 也可以

这些子进程在提供服务的时候

有的子进程很忙 有的子进程很闲

那么你的程序中

还可以对这些子进程提供服务的时候

它的服务行为进行一些微调

比如讲 做一些负载平衡

这都是很高级的技术

这些策略

都可以在实现进程池的时候进行选择

父子进程之间

因为要进行信息通讯

父进程要通知子进程

你去提供一个服务

子进程提供完了服务以后

可能把这个结果要反馈给主进程

或者直接反馈给客户

但不管怎么样 父子进程之间

可能要有一个特别的通讯的管道

说管道不太合适

它是一个通讯的通道

因为可能是使用管道来实现的

共享内存难道就不能实现吗

消息队列难道就不能实现吗

也都是可以的 对吧

父子进程之间

是需要一个特定的同步机制的

这是设计进程池的时候

需要特别注意的一个地方

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP1311笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。