当前位置: 首页 > news >正文

C++ 池式组件 线程池 内存池 异步请求池 MySQL连接池

池式组件

  • 线程池
    • 线程池的作用
    • 工作原理
    • 线程池
    • Nginx线程池
  • 内存池
    • 背景
    • 链表法
      • 方法
      • 遇到的问题
    • 固定内存块大小法
      • 方法
      • 遇到的问题
    • 大块开小块
      • 方法
  • 异步请求池
    • 请求组件
    • 请求原理
    • 请求池设计
  • MySQL连接池
    • 池化技术
    • 连接池和线程池的关系
    • 使用数据库连接池

线程池

线程池的作用

减少线程的创建和销毁 pthread_create()
异步解耦的作用 loginfo(“log”); 提高效率

工作原理

组件
create/init 线程池的初始化
push_task
destroy/deinit 线程池销毁
task_count 计算任务数量
free_thread 空闲线程数量

线程池

线程
任务
管理

Nginx线程池

计算密集型:
任务密集型:CPU的两倍或者更多
30%~70%:创建或者销毁线程

内存池

背景

避免频繁的分配内存
内存使用方式不对

不要自己造轮子,理解原理
jemalloc/tcmalloc

链表法

方法

  1. 链表链接内存块

遇到的问题

  1. 内存块越分越小

固定内存块大小法

方法

  1. 分配固定大小的块
  2. 16个字节 – 32 – 64 – 128 – …

遇到的问题

  1. 小块查找速度慢
  2. 内存块之间出现间隙 – 影响内存块的回收出现问题

大块开小块

方法

  1. 申请一个大块,从大块中申请小块
  2. 大块用完之后在申请一个大块
  • 申请内存时加锁解决线程安全问题
  • Invalid conversion from ‘void*’ to ‘unsigned char*’

异步请求池

请求组件

  1. 线程池
  2. 协程
  3. 异步请求池

请求原理

  • 发送请求 多个IO
  • 接受结果的线程,如何拿到fd:fd通过epoll_ctl添加到epoll

请求池设计

  1. commit

socket
connect server
encode --> redis/mysql/dns
send
fd 加入epoll_ctl

  1. thread_callback

while(1) {
epoll_wait();
recv();
parser();
fd --> epoll delete;
}

  1. init

epoll_create 初始化
pthread_create 线程初始化

  1. destroy

close(epfd);
pthread cancel;

遇到的问题

  • 同步到异步
  • warning: ISO C++ forbids converting a string constant to ‘char*‘ [-Wwrite-strings]

MySQL连接池

池化技术

  1. 对象创建时间长
  2. 对象创建消耗大量资源
  3. 对象创建之后可以重复利用

连接池和线程池的关系

  • 线程池主动执行任务,连接池对象被人误获取,执行任务后归还。

使用数据库连接池

  1. 资源复用
  2. 更快的系统响应速度
  3. 统一的连接管理

使用连接池的优点

  1. 降低网络开销,提升性能
  2. 连接复用,有效减少连接数
  3. 没有TIME_WAIT状态的问题

相关文章:

  • SwiftUI 动态岛开发教程之 05 Dynamic Island 和 Live Activity 无需太多代码即可为用户提供大量信息
  • XDU2019级保研数据统计分析
  • 网课查题使用方法
  • 在 Ubuntu 新装系统中安装 ruby 的几点注意
  • 按行分块和按列分块
  • 【Vue3】穿梭框 -- 思路与实现分析
  • SpringBoot读取yml配置文件
  • 制胜充电桩下半场,特来电、星星充电们要靠运营?
  • 使用Keras Tuner进行自动超参数调优的实用教程
  • Vue2.0到3.0的过渡,setup,ref函数,reactive函数,计算属性computed、监听属性watch
  • Springboot毕设项目基于Springboot的手机电商网站lmo47(java+VUE+Mybatis+Maven+Mysql)
  • springboot-rabbitmq-reply 消息直接回复模式
  • “查找”学习提纲(二)——树型查找和散列查找
  • 5-8 uni-app 全端离线本地存储方案
  • 三维感知/三维生成与重建讲座笔记( GAMES Webinar 246期)
  • 【347天】每日项目总结系列085(2018.01.18)
  • Apache的基本使用
  • CSS居中完全指南——构建CSS居中决策树
  • ECMAScript6(0):ES6简明参考手册
  • js操作时间(持续更新)
  • storm drpc实例
  • Wamp集成环境 添加PHP的新版本
  • 百度地图API标注+时间轴组件
  • 测试开发系类之接口自动化测试
  • 番外篇1:在Windows环境下安装JDK
  • 老板让我十分钟上手nx-admin
  • 理解在java “”i=i++;”所发生的事情
  • 手机端车牌号码键盘的vue组件
  • 提醒我喝水chrome插件开发指南
  • 新书推荐|Windows黑客编程技术详解
  • 云大使推广中的常见热门问题
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • #HarmonyOS:Web组件的使用
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (python)数据结构---字典
  • (zt)最盛行的警世狂言(爆笑)
  • (二)WCF的Binding模型
  • (附源码)php新闻发布平台 毕业设计 141646
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (五)MySQL的备份及恢复
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Linux下编译安装log4cxx
  • (转)ORM
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .gitignore文件_Git:.gitignore
  • .Net core 6.0 升8.0
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net下简单快捷的数值高低位切换
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中 MVC 工厂模式浅析
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken