![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
协程
文章平均质量分 73
wenfh2020
个人博客 - wenfh2020.com
展开
-
[libco] libco mysql 连接池
基于 libco 的 mysql 连接池,支持基本的 mysql 读写访问,支持多个连接,多个节点,支持空闲连接回收。文章来源: [libco] libco mysql 连接池1. 设计mysql 连接池,每个链接被分配到一个协程里运行。主要有几部分组成,详见下图:当用户协程访问 mysql 时,这个请求以任务形式,添加 manager 的任务队列,然后用户协程切出去等待唤醒。manager 协程主要负责链接调度,还有任务分派,它将一定数量的任务分配给比较空闲的连接处理。任务处理协程,被原创 2021-11-10 17:59:36 · 816 阅读 · 0 评论 -
[libco] co_kimserver 简介
co_kimserver 是基于 libco 的高性能 TCP 网络通信框架。详细请查看:github 。文章来源:[libco] co_kimserver 简介1. 简述co_kimserver 是高性能 TCP 网络通信框架。多进程工作模式(manager/workers)。基于腾讯开源的轻量级协程库 libco。主要使用 C/C++11 语言开发。支持 tcp 协议。使用 protobuf 封装通信协议。支持访问 mysql, redis (client: hiredi原创 2021-11-10 17:58:11 · 2832 阅读 · 8 评论 -
[libco] 删除协程的正确姿势
如果你认为只需要简单调用 co_release 就能将 libco 的协程删除,那等待你的可能就是定时炸弹 ????。文章来源:* [libco] 删除协程的正确姿势1. 正确姿势如何才能安全删除一个协程?禁止删除一个正在工作的协程,删除已经停止工作(stCoRoutine_t.cEnd == 1)的协程是比较安全的。/* 协程数据结构。 */struct stCoRoutine_t { ... char cEnd; /* 协程是否结束。 */ ...};原创 2021-11-10 17:46:14 · 379 阅读 · 0 评论 -
[libco] libco 定时器(时间轮)
libco 定时器核心数据结构:数组 + 链表,有点像哈希表,通过空间换时间。libco 定时器也被称为时间轮,我们看看这个 “轮” 是怎么转的。文章来源: [libco] libco 定时器(时间轮)1. 概述libco 定时器核心数据结构:数组 + 双向链表(左图)。数组以毫秒为单位,默认大小 60 * 1000,主要保存一分钟以内到期的事件数据。相同到期时间的事件,会保存在双向链表里,当时间到期时,到期事件链表会一起取出来。当然超过一分钟的到期事件也支持保存,通过取模路由,有原创 2021-11-10 17:45:32 · 497 阅读 · 0 评论 -
[libco] 协程栈空间
协程“栈”空间,有独立栈和共享栈,重点理解一下协程共享栈。文章来源:* [libco] 协程栈空间1. 概述libco 虽然支持海量协程,但是单线程,同一时刻只支持一个协程在工作。在一个时间段内,它通过调度,使多个协程不停切换,从而实现协程“并发”功能。协程“栈”空间,有独立栈,也有共享栈。这个“栈”添加了引号,其实它是在堆上分配的,因为它的协程函数工作原理与普通函数工作原理差不多,所以才叫“栈”。普通函数运行原理:《x86_64 函数运行时栈帧内存布局》2. 独立栈协程独立栈原创 2021-11-10 17:44:54 · 502 阅读 · 0 评论 -
[libco] libco 不干活也费 CPU
在 Linux 系统,libco 调用 epoll_wait 有点用力过猛,虽然 libco 针对高并发,但是小问题的处理,略显粗糙。文章来源: [libco] libco 不干活也费 CPU1. 问题co_epoll_wait 的 timeout 这里默认为 1,在循环里,每毫秒执行事件处理。void co_eventloop(stCoEpoll_t *ctx, pfn_co_eventloop_t pfn, void *arg) { ... for (;;) {原创 2021-11-10 17:44:16 · 241 阅读 · 0 评论 -
[libco] libco 工作流程
libco 设计初衷:为了方便编写 C++ 高性能网络服务。高性能网络服务主要有两个点:IO 非阻塞 + 多路复用技术。libco 使用 hook 技术解决阻塞问题。libco 事件驱动使用 (epoll/kevent)。但是 非阻塞 + 多路复用技术 这个是异步回调实现方式,对用户开发非常不友好,所以协程的引入就是为了解决这个问题:用同步写代码方式实现异步功能,既保证了系统性能,又避免了复杂的异步回调逻辑。libco 有三大模块:协程管理模块,hook 模块,多路复用事件驱动模块,我们看看原创 2021-11-10 17:43:39 · 782 阅读 · 0 评论 -
[libco] 协程调度
libco 通过 co_resume 和 co_yield 交替调度协程。文章来源:[libco] 协程调度1. 协程调度设计图来源:libco 协程调度1.1. 协程数组pCallStack 协程数组,保存当前正在执行协程(注意:并不是所有协程)。pCallStack[0] 是主协程,env->pCallStack[env->iCallStackSize - 1] 是当前协程。一般情况下数组大小为 2,子协程在主协程里创建。除非在子协程里嵌套创建唤醒新的协程,这个协原创 2021-11-10 17:42:56 · 256 阅读 · 0 评论 -
[libco] 协程切换理解思路
程切换,可以理解为函数运行时上下文切换。文章来源:[libco] 协程切换理解思路1. 协程切换正常情况下,函数代码从头到尾串行执行,直到函数生命期结束。而协程切换却能将当前运行的函数,切换到另外一个函数运行,这是协程的神奇之处。2. 划重点理解协程切换原理,首先需要理解函数的运行原理。(《x86-64 下函数调用及栈帧原理》)协程是啥?它本质上就是一个函数体,与普通函数相比,它只是特殊一点而已。协程函数上下文:寄存器数据 + 内存数据。协程切换(yield/resume)本质是原创 2021-11-10 17:42:15 · 275 阅读 · 0 评论 -
[libco] 协程库学习,测试连接 mysql
历史原因,一直使用 libev 作为服务底层;异步框架虽然性能比较高,但新人使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率。用同步方式实现异步功能,既保证了异步性能优势,又使得同步方式实现源码思路清晰,容易维护,这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库:libco 。文章来源: [libco] 协程库学习,测试连接 mysql1. 概述libco 是轻量级的协程库,看完下面几个帖子,应该能大致搞懂它的工作原理。微信开源C++协程库Libco—原原创 2021-11-10 17:41:07 · 564 阅读 · 0 评论