Linux进程池、线程池

Linux进程池、线程池

一个子进程是通过进程动态内存分配的方式创建的,这种创建子进程的方式虽然能够获得资源,但是是有很多缺点的

1、动态创建进程是比较耗时间的,这将导致较慢的客户响应。 
2、动态创建的子进程(或子线程)通常只用来为一个客户服务。这将导致系统上产生大量的进程(线程),这将使进程间(线程)间切换消耗大量的CPU资源。 
3、动态创建出来的子进程(线程)是父进程(线程)的完整映射。当前进程(线程)必须谨慎的管理其分配的文件描述符和堆内存等系统资源,从而使系统的可用资源急剧下降,进而影响服务器性能。 
4、由于系统的资源有限,这将是动态创建的进程(线程)数量有限,从而会使响应客户端请求的数量有上线。

为了有效的解决在大量连接下的客户请求,就要采用一种方式来避开动态创建带来的缺点。进程(线程)池是通过事先划分一块系统资源区,这块区域在系统启动时 就已经创建并初始化了。用户可以直接取得资源,从而避免动态分配资源。

进程池线程池的概念

进程池和线程池很相似,所以只介绍进程池。

1、进程池是有服务器预先创建的一组进程,这些子进程的数目在3-10个之间.http守护进程就是使用了包含7个子进程的进程池来实现并发的。线程池中的线程数量和CPU的数量差不多。 
2、进程池中的所有子进程都运行着相同的代码,并具有相同的属性,比如优先级,PGID等。因为进程池在服务器启动之初就创建好了,所以他们不用打开不必要的文件描述符(从父进程继承下来的),也不会错误的使用大块的堆内存(复制父进程的) 
3、当有新的任务到来时,主进程将通过某种方式选择进程池中的某一个进程来为之服务。相对于动态创建子进程,选择一个已经存在的子进程的代价明显要小的多。

子进程选择算法

1、主进程通过某种算法主动选择子进程。最简单、最常用的算法是轮流选取算法。 
2、主进程和所有的子进程都在同一个共享的队列中,刚开始都处于睡眠状态,当有新的任务到来时,主进程将任务添加到消息队列中。将会通过算法来使其中一个子进程唤醒,这个子进程将任务取出并执行,而其他进程还处于睡眠状态。 
3、当选择了一个子进程之后,主进程还要告诉子进程执行任务所需要的数据,而传递这些数据就要在子进程和主进程之间创建一个管道。可以将这些数据全都定义为全局变量,而这些数据将会被所有的线程共享。

猜你喜欢

转载自blog.csdn.net/prokgtfy9n18/article/details/76801939