高性能服务器编程——进程池或线程池

23 篇文章 0 订阅

前言

  一般来说,服务器的硬件资源相对充裕,很多时候都用空间换时间的方法来提高服务器的性能,不惜浪费大量的空间资源来换取服务器的运行效率。

池的概念

  具体做法:提前申请大量的资源,以备不时之需以及重复使用这就是池的概念

 池其实就是一组资源的集合。
静态资源分配:这组资源在服务器启动之初,就已经被创建并初始化
动态资源分配:即由系统实时分配资源。

  由系统调用分配资源非常耗时的,所以直接从池中取得资源的效率比动态分配资源的效率更高,避免了服务器对内核的频繁访问,从而提高了服务器的性能。

背景

  在实际当中,分配内存,创建进程,创建线程都会涉及到一些系统调用。系统调用需要从用户态切换到内核态,是非常耗时的操作。

因此当程序中频繁的进行内存申请释放,进程,线程频繁创建和释放的操作时,通常会通过使用内存池,进程池,线程池等技术来提升程序的性能。

内存池:

  在C/C++中,动态向系统申请资源都是通过mallock和new(底层也是通过malloc)。如果对频繁的申请使用会导致大量的内存碎片,不仅耗时,而且大量的内存碎片出现的结果是出现系统明明有大量的资源但是确无法使用(主要是外部碎片化)。

内存内部碎片化:在采用分区式储存管理的系统(比如:分页)时,假如进程所需要的空间小于分区块(最后的一个页),则该分区块剩余的空间称为内部碎片化
内存外部碎片化:来自任何已分配区域或页面外部的空闲储存块(还未分配,不属于任何一个进程),这些储存块的总和可以满足当前申请的长度要求但是他们的地址不连续或其他原因,使得系统无法满足当前的申请。这样的空间被称为外部碎片化

  为了解决外部碎片化以及申请效率(服务器效率)问题我们提出了内存池的使用。

但是这里还有一点要注意的问题:

当频繁申请系统资源的时间,对于每次申请都会有指定大小的维护信息,若是频繁的申请,那大部分的资源都会用来记录这些维护信息,导致内存的效率极其低下。内存池便解决了这个问题。

线程池AND进程池

一:为什么要提出线程池?或者说他有哪些作用或者可以解决那些问题?

1.针对服务器而言,动态创建线程(或进程)比较耗费时间,这将导致较慢的客户响应。

2.动态创建线程(或进程)将导致系统产生大量的细微进程(或线程),他们之间的切换将导致消耗大量的CPU时间。

3.动态创建的子进程是当前进程的完整映像。当前进程必须谨慎处理其分配的文件描述符和堆内存等系统资源,否则子进程会克隆这些资源,导致系统可用   资源急剧下降,进而影响服务器性能。

分析:

  进程池或线程池解决了上述问题。在服务器启动之初,便创建并初始化了3~10个(一般情况)之间的数量。

  同时呢线程池中的数量应该和CPU中的差不多。

  进程池中的所有子进程都运行着相同的代码,并具有相同的属性:优先级,PGID等。因为进程池是在服务器启动之初就创建好了,所以每个进程都相对“干净”,没有打开不必要的文件描述符以及堆区的资源(父进程中克隆)。 

线程池的设计思路:

在服务器程序启动时,创建出多个进程或多个线程,将其维护在池中,当有客户连接时,就从池中分配进程或线程为客户服务。

主线程(父进程):负责和客户端进行连接。

函数线程(子进程):用来和客户端进行连接。

查看系统维护的进程池和线程池:

 

线程池的实现难点

1.主线程需要将文件描述符传递给函数线程。(线程间的通信,全局变量/static)

2.函数线程启动起来后必须阻塞到获取文件描述符之前(只有当全局数组中有文件描述符时才不阻塞。PV操作)

3.信号量来控制主线程向函数线程通知获取文件描述符事件(PV操作)。

4.主线程在数组中插入数据,以及函数线程获取数组中的数据都必须时互斥的。(防止获取,或者插入时出现不安全的问题)

线程池主要用于:

1.单个任务小且任务数量巨大。比如:WEB服务器完成网页请求这样的任务;对于长时间的任务,比如一个Telnet连接请求,因为Telnet的会话时间比线程创建时间大多了。

2.对性能要求苛刻的应用,比如服务器迅速响应客户请求。

3.短时间内,必须处理大量的连接请求(线程创建的时间小于进程创建时间)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值