• Mysql数据连接池:
  • 就是数据库和服务端的连接,与客户端无关,因此服务端可初始化所有Mysql连接
  • 结构体:
  • 连接池名
  • 服务端ip和,用户名密码,db名
  • 最大连接数,最小连接数
  • 设置数连接:
  • 设置太多:资源浪费,启动慢
  • 设置太少:后续处理慢
  • 初始化后的连接放到vector或stack里,非空连接放队列(链表)里,这样获取非空连接时很快                           
  • 链表中的连接如果很久没有返回,就认为超时,进行释放
  • 一般用定时器(定时线程),如:红黑数,时间轮
  • 获取,释放链表中的链表时要加锁
  • Socket连接池:
  • 装载客户端与服务端的socket连接结构体 (原目ip,原目端口)
  • socket连接池的目的是实现通过socket连接复用,实现TCP长连接(TCP连接开销太大)
  • 空闲连接:一个连接暂时没有数据处理,就处于空闲状态,放到空闲链表中去
  • KeepAlive机制(心跳机制):如果很久这个连接没有数据到来,就释放。链路默认时间为5分钟
  • 线程池:
  • 假设采用master-worker线程模型:
  • 主线程新建多个子线程,子线程创建后就会开始执行线程入口函数。
  • 线程初始化状态应该让每个线程都处于休眠状态,因此,线程入口函数有一段代码while(消息队列是否为空,且线程池需处于开启状态m_shut=false){等待休眠(条件变量,互斥量)},初始化时消息队列肯定为空,所以每创建一个线程都会进入这个循环进行休眠。直到被唤醒,去读取消息队列。
  • 线程池也是为了资源复用,不用频繁地建立销毁线程
  • 内存池:
  • 目的是为了利用地址空间碎片
  • 一般大于128K的内存直接在堆里申请,小于128K的内存组织成链表进行分配。可参考TCMalloc