
组件开发
文章平均质量分 83
响箭零零一
这个作者很懒,什么都没留下…
展开
-
nginx共享内存
1 共享内存数据结构typedef struct { u_char *addr; //共享内存地址 size_t size; //内存大小 ngx_str_t name; //共享内存名称 ngx_log_t *log; //log ngx_uint_t exists; /* unsigned exists:1; */} ngx_shm_t;struct ngx_shm_zone_s {原创 2022-03-20 21:25:55 · 4400 阅读 · 0 评论 -
读写缓冲区实现
evbuffer设计evbuffer设计核心就是这个链式块结构,每一个evbuffer包含多个evbuffer_chain,这些 chain组成一个链表结构,串成一个完成的evbuffer。evbuffer_chain参数解析:首先是next指向下一个节点;第二是buffer_len是evbuffer_chain中buffer的总长度,创建chain时候分配;第四是misalign这个比较巧妙指的是有效数据的起始位置,当buffer前面的数据被取出之后,不会移动后面buffer的位置而是直接修改misal原创 2022-01-09 22:05:23 · 1298 阅读 · 0 评论 -
事件驱动组件libevent实战
1 环境搭建1.1下载git clone https://github.com/libevent/libevent.git1.2编译(1)openssl安装依赖这里安装openssl库,也可以disable掉:EVENT__DISABLE_OPENSSL看实际需要。apt-get install libssl-dev(2)编译MBEDTLS默认是开的,关闭防止报错cd libeventmkdir bulidcmake .. \-DEVENT__DISABLE_MBEDTLS=ON原创 2022-01-04 19:33:56 · 1089 阅读 · 1 评论 -
企业级定时器实现
定时器应用定时器与其他组件关系(1)与网络io的组合利用timeout时间进行epoll_wait(epfd, ev, nev, timeout);update_timer();如何解决网络io耗时操作,造成定时器误差大?采用红黑树加上定时发送信号,解决误差很大的问题:参考Nginx(2)利用其他线程添加定时任务大量定时任务怎么处理定时器的本质:越近要触发的任务优先级越高。数据结构选型:(1)红黑树:Nginx中序遍历有序;增删改都能维护树的有序,黑高相等、时间复杂度lg2n(2原创 2021-12-20 20:30:20 · 1238 阅读 · 0 评论 -
地表最强队列-ZMQ无锁队列
前言使用场景:(1)处理数据非常多,一秒钟处理十几万元素。(2)性能测试,1写1读。(3)如果支持多写多读,容易崩溃不能使用。(4)内存分配是否需要锁?无锁队列原理ypipe:一写一读,不支持多读多写2. 链表分配实现,采用chunk机制,减少分配节点的时间3. chunk机制:(1)一次分配多个节点;利用局部性原理,(2)一小段时间队列元素是差不多的。(3)批量写(4)读端没有数据:采用mutex+condition(5)写端什么时候唤醒读端:无锁队列实现...原创 2021-12-19 23:03:54 · 2675 阅读 · 2 评论 -
企业级连接池实现
1 池化技术2 连接池与线程池连接池:(1)同步连接池(2)连接数量与线程数量有关(一般是相等)(3)连接池被动操作,池对象被任务获取,执行任务后归还。线程池:(1)线程池是主动执行任务3 mysql连接过程三次握手;账号密码认证;执行sql语句;关闭四次挥手;4 长连接和连接池的区别(1)长连接没办法进行连接管理;(2)连接池内部就是一个长连接5 连接池要点1 连接到数据库(ip、端口、用户名、密码、数据库)连接操作,每个连接对象相互独立配置最小连接数和最大连接数原创 2021-12-15 12:37:52 · 976 阅读 · 0 评论 -
实现死锁检测
根据百度百科对于死锁的定义:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。可能很多人看到这个定义有点懵,我用一个示意图简单的描述一下:从上图不难看出,线程1、线程2、线程3之间形成了一资源申请的环路,造成死锁。总结死锁本质特征就是:存在锁资源申请的环。接下来讨论如何实现整个死锁方案:第一步:实现一个简单死锁的例子,便于后续对于死锁的验证,同时原创 2021-08-21 18:00:03 · 312 阅读 · 0 评论 -
企业级请求池实现
前言异步架构原理请求和接收响应分开,单独的线程负责接收响应。1 commit2 thread_callback3 init4 destory异步架构实现3.1 init创建:epoll_createpthread_create3.2 commit创建socket-》connect server-》encode封装协议-》sendfd加入epoll–》epoll_ctrl3.3 callbackwhile(1){epoll_wait();recv();fd–>原创 2021-12-11 15:51:24 · 737 阅读 · 0 评论 -
内存管理-内存池的实现
1 为什么需要内存池(1)避免频繁分配内存;副作用:造成内存的碎片;长时间运行会内存分配失败。(2)解决频繁分配内存,采用内存池。(3)jemalloc,tcmalloc开源框架2 内存池的原理(1)用链表组织,每次分配之后加入链表不去释放。struct memnode {void *addr;int}3 内存池的实现4 内存池的升级与定制...原创 2021-12-10 18:42:55 · 1447 阅读 · 0 评论 -
企业级线程池实现
1 线程池作用(1)减少线程的创建和销毁(2)异步解耦作用(3)耗时操作,用线程池2 线程的工作原理线程API:(1)create(2)push_task(3)destroy可选API:(1)task_count(2)free_thread_count组成:线程:1 id;2 flag;//停止标识任务:1 task_func()2 参数管理:——》任务和线程有序进行1 cond条件等待2 mutex防止重复...原创 2021-12-08 20:15:36 · 357 阅读 · 0 评论