文章目录
  1. 概述

通过动态创建子进程/线程实现并发服务器具有如下缺点:

  • 进程的创建与切换耗时;
  • 创建的进程/线程只能为一个客户服务,导致系统上产生大量的细微进程;
  • 由于动态创建的子进程是当前进程的完整映像,当前进程必须谨慎管理其分配的文件描述符与堆内存等系统资源;

为解决上述问题,网络程序采用进程/线程池。下面对其进行介绍,给出其通用实现并利用进程/线程池实现一个简单的并发服务器。

概述

进程池与线程池类似,以进程池为例进行介绍。

进程池是由服务器预先创建的一组子进程,这些子进程的数目在3-10个之间(如httpd守护进程就是使用包含7个子进程的进程池来实现并发);线程池中的线程数量应与CPU数量差不多。

有新任务到来时,主进程将通过某种方式选择进程池中的某一子进程为之服务。选择策略有两种。

  • 主进程使用某种算法来主动选择子进程;最简单常用的有随机算法、轮流选取算法;
  • 主进程与所有的子进程通过一个共享的工作队列来同步,子进程在没有任务时睡眠在该工作队列中。有新的任务到来后,主进程将任务添加到工作队列,所有睡眠的子进程被唤醒,但是只有一个子进程可以获得新任务的接管权,其他子进程返回继续睡眠;

选择好子进程后,主进程还需要某种通知机制来告诉目标子进程有新任务需要处理,以及传递一些必要的数据(如函数的参数);可在父进程与子进程间预先建立好一条管道,再使用管道进行进程间通信。

综上,进程池的一般模型如下图。