资源池与线程池

1. 资源池

1.1. 简介

  • 是一种配置机制,用于对主机资源进行分区。当某一个资源使用完后,资源池把相关的资源的忙标示清除掉,以示该资源可以再被下一个请求使用
  • 每个主机均具有一个默认的资源池,所有的进程最初均与该资源池绑定。新创建的资源池会从默认池中获取处理器

1.2. 目的

提高性能

1.3. 运作机制

由资源池管理器提供一定数目的目标资源,当有请求该资源时,资源池分配给一个,然后给该资源标识为忙,标示为忙的资源不能再被分配使用

1.4. 参数

  • 初始资源的数目。资源池启动时,一次建立的资源数目,资源池最少要保证在这个数目上
  • 最大资源的数目。当请求的资源超出这个数目,就等待

1.5. 常见的资源池

  • 连接池。数据库连接池
  • 对象池。web 容器中的 request, response 对象池
  • 线程池(thread pool)

2. 线程池

2.1. 背景

  • 线程过多会带来调度开销(线程切换开销),进而影响缓存局部性和整体性能
  • 在处理短时间任务时创建与销毁线程的代价过大

2.2. 简介

  • 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
  • 线程池线程都是后台线程
  • 每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中
  • 如果某个线程在托管代码中空闲(如正在等待某个事件), 则线程池将插入另一个辅助线程来使所有处理器保持繁忙
  • 如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程,但线程的数目永远不会超过最大值
  • 超过最大值的线程可以排队,但他们要等到其他线程完成后才启动

2.3. 优点

  • 避免在处理短时间任务时创建与销毁线程的代价
  • 不仅能够保证内核的充分利用,还能防止过分调度

2.4. 线程池结构

  • 线程池管理器。创建并管理线程池
  • 工作线程。线程池中的线程
  • 任务接口 taskHandle。每个任务必须实现接口以供工作线程调度执行任务
  • 任务队列。用于暂存未处理任务(缓冲机制)

2.5. 应用场景

  • 需要大量的线程来完成任务,且完成任务的时间比较短。 eg. WEB 服务器完成网页请求这样的任务
  • 对性能要求苛刻的应用。eg。 要求服务器迅速响应客户请求
  • 可能出现突发性的大量请求(创建大量线程)。eg. 双 11,0:00 网页请求。利用线程池技术有效地调度线程资源,缓冲作用不至于使服务器突然产生大量线程的应用。短时间内产生大量线程可能使内存到达极限,并出现”OutOfMemory”的错误