一、概念
池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。
在系统开发过程中,我们经常会用到池化技术。通俗的讲,池化技术就是:把一些资源预先分配好,组织到对象池中,之后的业务使用资源从对象池中获取,使用完后放回到对象池中。这样做带来几个明显的好处:
-
资源重复使用, 减少了资源分配和释放过程中的系统消耗。比如,在IO密集型的服务器上,并发处理过程中的子线程或子进程的创建和销毁过程,带来的系统开销将是难以接受的。所以在业务实现上,通常把一些资源预先分配好,如线程池,数据库连接池,Redis连接池,HTTP连接池等,来减少系统消耗,提升系统性能。 -
可以对资源的整体使用做限制。这个好理解,相关资源预分配且只在预分配是生成,后续不再动态添加,从而限制了整个系统对资源的使用上限。类似一个令牌桶的功能。 -
池化技术分配对象池,通常会集中分配,这样有效避免了碎片化的问题。
池化技术简单点来说,就是提前保存大量的资源,以备不时之需。池化技术有两个特点,提前创建和重复利用。
二、应用
1. 线程池
线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。
为什么要预先创建若干线程,而不是在需要的时候再创建?
因为在数据量很大的条件下,某一时刻可能有大量的(上百个)并发请求,而线程创建的过程是比较耗时的,若此时对每个请求都新创建一个线程,那么会耗费大量的时间,造成拥塞。
2. 连接池
常见的数据库oracle、SQL server都有连接池技术,数据库连接池是在数据库启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池数据库连接数的并发请求,则在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数,这个增加减少由数据库连接池管理线程进行操作。
为什么要创建连接池?
因为需要连接数据库时再创建连接,然后用完就释放的方式会造成很多重复的数据库连接释放操作,且容易因为忘记释放而长期占用链接资源的缺陷。而用数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
3.内存池
内存池是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。
一个解决方法是内存池:在启动的时候,一个内存池(Memory Pool)分配一块很大的内存,并将会将这个大块分成较小的块。每次你从内存池申请内存空间时,它会从先前已经分配的块中得到,而不是从操作系统。最大的优势在于:
-
非常少(几没有) 堆碎片; -
比通常的内存申请/释放(比如通过malloc, new等)的方式快。
三、实例
下面是内存池详解:【池化技术】内存池技术原理和C语言实现
下面是线程池详解:【池化技术】线程池技术原理和C语言实现
|