基础组件
文章平均质量分 84
菊头蝙蝠
这个作者很懒,什么都没留下…
展开
-
池式组件-Mysql连接池的原理与实现
mysql连接池一、为什么要使用连接池?二、连接池与线程池的关系三、连接池的涉及要点四、连接池代码实现1、连接池构造函数2、连接池初始化3、请求获取连接4、归还连接5、析构连接池五、为什么要有连接池名六、重连机制七、对于连接池来说,选择多少线程/连接合适呢?一、为什么要使用连接池?在一般情况下,客户端向Mysql服务器的连接,要经过以下几个步骤1.TCP三次握手连接2.Mysql认证的三次握手3.真正的SQL执行4.Mysql的关闭5.TCP的四次握手关闭这种方式,网络IO较多,带宽利用率原创 2022-04-16 19:15:01 · 1476 阅读 · 0 评论 -
动手实现内存泄漏检测组件
c/c++没有垃圾回收机制,可能会出现内存泄漏出现原因:内存分配与内存释放,没有做到匹配1.如何预防内存泄漏?2.内存泄漏如何解决?1.如何知道内存泄漏2.如何定位代码哪一行引起的内存泄漏如何知道内存泄漏:每次malloc/calloc/realloc 就 +1每次free 就 -1如果正常退出,不为0,说明存在内存泄漏如何定位哪一行引起内存泄漏?1.c自带的宏,__FILE__、_ FUNCTION _和、__LINE__,可以定位到具体文件,函数,哪一行2.builtin_re原创 2022-04-14 17:35:01 · 2059 阅读 · 1 评论 -
动手实现死锁检测组件(通过hook与有向图实现)
动手实现死锁检测组件(hook与有向图实现)一、如何理解死锁二、模拟实现一个死锁1、如何去模拟实现一个死锁?2、创建4个线程模拟实现死锁三、死锁检测1、实现hook2、构建有向图4、数据组织方式5、代码逻辑四、完整代码一、如何理解死锁比如线程A需要 线程B的资源才能解锁,线程B需要线程C的资源才能解锁,线程C需要线程A的资源才能解锁。现在A、B、C都不能获得想要的资源,于是都没法解锁,陷入了死锁。如何进行死锁检测?可以把死锁检测的问题转化为有向图的环路检测。为了能够实现死锁检测,首先要模拟一个原创 2022-04-12 22:21:23 · 1098 阅读 · 0 评论 -
定时器方案:红黑树、最小堆和时间轮的原理
网络事件和时间事件对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;在不同框架中,这两种事件有不同的实现⽅式;第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、redis;第⼆种,⽹络事件和时间事件在不同线程当中处理;例如skynet;第一种// 第⼀种while (!quit) { int now = get_now_time();// 单位:ms int timeout = get_nearest_timer() - now;原创 2022-04-10 00:30:47 · 1172 阅读 · 0 评论 -
nginx中的定时器源码分析与测试
nginx中的定时器源码分析与测试一、nignx中的定时器二、nignx中定时器测试三、附件在nginx中,定时器是由红黑树来实现的。有以下几个定时器的接口init_timer 初始化定时器(初始化红黑树)add_timer 添加定时器(红黑树左侧时间小,右侧时间大。当时间出现重复的时候,插入右侧)del_timer 删除定时器find_nearest_expire_timer 查找时间最近的定时器(红黑树中最左侧的节点)expire_timer 到期的定时器(执行定时事件,并删除红黑树中对原创 2022-04-08 21:29:39 · 2355 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发一、多线程计数二、发现问题三、互斥锁四、自旋锁五、互斥锁和自旋锁的对比六、原子操作七、其他:CAS一、多线程计数背景:火车抢票,总共10个窗口,每个窗口都同时进行10w张抢票可以采用多线程的方式,火车票计数是公共的任务#include<pthread.h>//posix线程 #include<stdio.h>#include<unistd.h>#define THREAD_COUNT 10 //定原创 2022-03-07 20:05:04 · 963 阅读 · 0 评论 -
线程私有存储空间的全局变量pthread_key_t
线程私有存储空间的全局变量pthread_key_t一、api的使用二、案例一、api的使用1.pthread_key_t key;定义一个该类型的变量,作为key,用来对应线程的私有存储空间的value2.pthread_key_create(&key, NULL);创建(初始化)变量key,使它能够区别不同线程中,这个key所对应的value3.pthread_setspecific(key, &i);在线程中,通过全局变量key,将值传入线程的私有空间中4.int *p原创 2022-04-07 21:32:25 · 1224 阅读 · 0 评论 -
池式组件-异步请求池的原理与实现
请求池一、同步dns请求一、有哪些第三方请求1.http2.ntp/dns3.mysql4.redis发出请求的时候,需要等待第三方回应,这个过程是比较费时的,因此可以通过异步请求的方式,发送完请求后,不等待结果的返回,可以先做其他的事,结果用另外的线程去接受1.inita.epoll_createb.pthread_create2.commita.socket创建b.connect serverc.encode —>redis/mysql/dns 编码成请求格式d.s原创 2022-04-07 15:02:49 · 458 阅读 · 0 评论 -
池式组件-内存池的原理及其实现
为什么要使用内存池?在客户端进行连接(如果有分配内存的需求)的时候,内存会频繁分配和使用(内存池就是为了避免频繁分配和释放)。如果有大量客户端连接,并且每次只占用一点内存,会出现很多的内存碎片内存池1.这个轮子要用,但不要自己造,原理一定要懂jemalloc (c实现)tcmalloc(c++实现)如果要使用内存池,不需要修改原来的代码,只需要进行宏定义和使用hook,就可以通过malloc来自动调用tcmalloc如何去实现一个内存池?通过一个链表节点,一个是指向的内存块地址,另一个是原创 2022-04-06 20:34:30 · 631 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记五):线程池
Linux C/C++ 开发(学习笔记五):线程池一、线程池的由来和组成二、一、线程池的由来和组成如果涉及到十万个we线程,根本没办法开这么多如果一个poxis线程占8M内存,那么16G内存也只能有2048个线程,根本没法满足十万线程的需求。线程池1.避免线程太多,使得内存耗尽2.避免创建与销毁线程的代价3.任务与执行分离所以需要 任务与执行 分离。一个例子,对于营业厅来说,办理业务的人是任务队列,柜员 是执行队列因此需要一个组件(也就是线程池),使得任务队列和执行队列,正常有序原创 2022-03-07 22:46:06 · 833 阅读 · 0 评论