总结各种常见的池子-创新互联

池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点主要有两个:提前准备和重复利用。

成都创新互联公司长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为怀远企业提供专业的成都做网站、网站设计、外贸营销网站建设怀远网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

像池化技术一些典型的池子就比如线程池,内存池,对象池,数据库连接池等等,线程的创建销毁,对象的创建销毁,内存的分配释放,数据库连接释放等等,做池子里面伴随着的就是生产者消费者模型。所以这些都是要搞清楚的

数据库连接池:

创建数据库连接是⼀个很耗时的操作,客户端和数据库这个服务器去连接需要三次握手,身份连接认证,关闭连接回收资源和四次挥手太消耗资源了,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠

连接池的机制:

前提:为数据库连接建立一个缓冲池。
1:从连接池获取或创建可用连接
2:使用完毕之后,把连接返回给连接池
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值

数据库连接池的基本思想是在系统初始化的时候将数据库连接作为对象存储在内存中,当用户需要访问数据库的时候,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。在使用完毕后,用户也不是将连接关闭,而是将连接放回到连接池中,以供下一个请求访问使用,而这些连接的建立、断开都是由连接池自身来管理的。 同时,还可以设置连接池的参数来控制连接池中的初始连接数、连接的上下限数和每个连接的大使用次数、大空闲时间等。当然,也可以通过连接池自身的管理机制来监视连接的数量、使用情况等。

线程池:

线程池就是实现线程的复用,它将线程和任务的概念分离开,使用线程来执行任务,并提供统一的线程管理和任务管理的实现方法,避免了频繁创建和销毁线程所带来的性能开销。

线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率。

线程池的原理很简单,类似于操作系统中的缓冲区的概念。线程池中会先启动若干数量的线程,这些线程都处于睡眠状态。当客户端有一个新的请求时,就会唤醒线程池中的某一个睡眠的线程,让它来处理客户端的这个请求,当处理完这个请求之后,线程又处于睡眠的状态。

线程池相比于线程来说,它不需要频繁的创建和销毁线程,线程一旦创建之后,默认情况下就会一直保持在线程池中,等到有任务来了,再用这些已有的线程来执行任务,如下图所示:

关于线程池的实现一般分为三个部分

任务队列,存储需要处理的任务,由工作的线程来处理这些任务
通过线程池提供的 API 函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除
已处理的任务会被从任务队列中删除
线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程
工作的线程(任务队列任务的消费者)也就是池子里维护的线程,就是用来干事的,从队列里面拿任
管理者线程(不处理任务队列中的任务),用来生产工作的线程的,任务多了,池子里工作线程不够了去创建一点;任务少了,池子里空闲线程多了,销毁一点

用c写的线程池

源码:Xw-oorik/c-  

线程池和连接池就可以这么配套,线程池去拿任务,任务说要连数据库,拿到任务的这个工作线程就去数据库池子里拿连接,用完了再把连接还回去,任务干完了,任务就从消息队列出去,结束任务的线程回到池子里等着拿后面的任务

内存池:

为什么要用内存池:

  1. 在需要堆内存管理一些数据的时候直接malloc,容易造成内存碎片
  2. 在需要堆内存管理一些数据的时候直接malloc,容易忘记free,造成内存泄漏,利于内存管理

策略

  1. 小块内存(<4k):先分配一个整块,在整块里每次用一小块内存
  2. 大块内存(>4k):直接分配

内存池在创建的过程中,会预先分配足够大的内存,形成一个初步的内存池。然后每次用户请求内存的时候,就会返回内存池中的一块空闲的内存,并将这块内存的标志置为已使用。当内存使用完毕释放内存的时候,也不是真正地调用 free 或 delete 的过程,而是把内存放回内存池的过程,且放回的过程要把标志置为空闲。最后,应用程序结束就会将内存池销毁,将内存池中的每一块内存释放。

内存池的优点:

  • 减少内存碎片的产生,这个优点可以从创建内存池的过程中看出,当我们在创建内存池的时候,分配的都是一块块比较规整的内存块,减少内存碎片的产生。
  • 提高了内存的使用频率。这个可以从分配内存和释放内存的过程中看出。每次的分配和释放并不是去调用系统提供的函数或操作符去操作实际的内存,而是在复用内存池中的内存。

内存池的缺点: 会造成内存的浪费,因为要使用内存池需要在一开始分配一大块闲置的内存,而这些内存不一定全部被用到。

之前有写过stl的底层的空间配置器,二级的空间配置器就是用内存池+自由链表的形式避免了小块内存带来的碎片化

看到内存池这块就要不得不了解这个配置器了,之前有写过一篇博客 有关SGI STL的alloc_ 纯当复习了,再好好看看。

揭秘——STL空间配置器_ 这一篇是在看alloc的时候找到了,也写得很不错,贴在这日后复习用

简单说一说空间配置器

一级的话是大于128字节调用malloc申请

二级是小于128字节,调用。底层是一个自由链表和内存池实现的,底层维护了16条链表,0-15编号,每一条链表根据8字节递增,当我们申请内存的时候根据大小去转到对应编号的链表上。看链表上挂的内存空不空,不空的话看内存够不够,够的话分配出去,指针往后移动;如果链表空了,就看内存池空不空,内存池不空,就分配一些个结点大小的内存,把一个给用户去用,剩下的挂在那个链表上方便后面去取;如果内存池不够分配或者空的话,就会使用malloc()从堆上申请内存,一半拿去用,一半就给内存池;如果堆内存不够给内存池分配,那么二级配置器就会搜索链表调到下一个编号的链表上去给用户分配内存;如果有就分配,如果最后还没有找到能给分配的链表的话就调用一级配置器malloc

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:总结各种常见的池子-创新互联
文章分享:http://hbruida.cn/article/dcdgep.html