• 资源池介绍
  • 可以通过唯一标识来访问和操作的资源
  • 1. 网络连接池
  • 2. 数据库连接池
  • 不能通过唯一标识来访问和操作的资源
  • 1. 线程池
  • 1.1 生产者与消费者模式
  • 1.2 领导者与跟随者模式
  • 2. 内存池
  • 参考文献


资源池介绍

资源池,就是在系统初始的时候创建一组资源,放到一个池子里。需要的时候从资源池里面选一个出来工作,用完了放回去。资源池避免了频繁的创建和销毁系统资源的过程,而系统资源的申请和销毁一般都是比较耗时的。这是一种以“空间”换时间的方式。设计好的资源池能提高程序并发程序的性能。常见的资源池有线程池、内存池、网络socket连接池、数据库连接池等。

资源池的创建和销毁简单,关键是如何在资源池间进行通信和调度。这里先看看如何在各种资源池间进行通信。可以分为两种,一种是网络socket连接池、数据库连接池这样可以通过唯一标识来访问和操作的资源,对这种可以直接定义一个数组,需要的时候直接从数组里面取出一个来使用即可;另一种是线程池、内存池这样较复杂的资源池,需要用特殊的方法来通信和调度。

可以通过唯一标识来访问和操作的资源

1. 网络连接池

每一个网络连接可以通过一个socket返回的一个fd来访问(file descriptor),可以声明一个数据,数组里面放上各个fd,需要的时候取一个来使用即可。这个数组就是网络连接池。

2. 数据库连接池

c/c++里面每个数据库连接都可以使用一个MYSQL * 类型的mysql对象来标识,数组里面放上MYSQL *对象,即可组成数据库连接池。

不能通过唯一标识来访问和操作的资源

1. 线程池

线程虽然有唯一的线程threadid,但是不能通过一个thread id就让某线程做某事,一般需要通过全局变量来是各个线程之间同步。线程池同步方式介绍两种:生产者消费者模式、领导者与跟随者模式。

1.1 生产者与消费者模式

声明一个全局变量做缓冲区,生产者线程不断往缓冲区里面任务,线程池里面空闲消费者线程不断从缓冲区里面获取任务来执行,执行完后又回到空闲状态。对于消费者来说,任何一个消费者都可能竞争到某个job,生产者线程无法直接控制哪个消费者来执行某个job。

1.2 领导者与跟随者模式

线程池中的线程可处在3种状态之一:领导者leader、追随者follower或工作者processor。任何时刻线程池只有一个领导者线程。事件到达时,领导者线程负责消息分离,并从处于追随者线程中选出一个来当继任领导者,然后将自身设置为工作者状态去处置该事件。处理完毕后工作者线程将自身的状态置为追随者。

这一模式实现复杂,但避免了线程间交换任务数据,提高了CPU cache相似性。

2. 内存池

内存池即在系统开始的时候申请一大块内存作为自己的内存池,程序结束后才free这块内存,程序执行过程中自己对这块内存进行管理的内存使用方式。内存池可以避免频繁申请和释放内存造成的内存碎片,并免去了寻找归还空闲内存的时间开销。

参考文献

  1. 线程池
  2. Linux–线程池与进程池及线程池的简单实现