协程
李兆龙的博客
Distributed Systems & NoSQL & Linux Kernel / eBPF & Chaos Engineering
展开
-
有栈协程与无栈协程
引言关于协程是什么这类基本概念我们不再多提,有兴趣的朋友可以看看我写的这篇文章《聊聊协程》。写这篇文章的原因是当我对这个问题感到疑惑的时候发现CSDN上并没有相关的文章,遂在有了一点理解以后想写下一点对这个问题的看法,以帮助后来学习的朋友。正文如今虽不敢说协程已经是红的发紫,但确实是越来越受到了大家的重视。Golang中的已经是只有goroutine,以至于很多go程序员是只知有协程,不知有线程了。就连C++这样的“老顽固”也在最新的C++20中原生支持协程。更不用说很多活跃的语言如python,ja原创 2020-06-23 17:47:36 · 9811 阅读 · 6 评论 -
libco源码解析(0) 概述与总结
引言libco是一个微信后台大规模使用的c/c++协程库,在2013年开源,据说2013至今仍运行在微信的后台中。正文对libco的学习过程实际上是对于去年十一月份的一个问题的解答的过程,记得当时在学长提起这个东西以后对于其充满疑惑,但又对其功能感动十分震惊,在完成了对libco的学习以后算是解决了一个困扰我半年多的问题,也算是可喜可贺啦。对于后来学习libco的朋友我的建议是先去温习一下操作系统中链接方面的知识,然后再去看看汇编语言程序设计,这两者都OK以后可以撸起袖子干活了,不要像我学到一般屁颠原创 2020-06-22 19:54:45 · 1298 阅读 · 0 评论 -
对libco的一点看法
我经常会思考一个问题,即什么才算是一个好的代码?我们来看看这一段描述:‘Good code’ is code that works, is bug free, and is readable and maintainable. Some organizations have coding ‘standards’ that all developers are supposed to adhere to, but everyone has different ideas about what’s best原创 2020-06-22 19:46:50 · 587 阅读 · 0 评论 -
libco源码解析(9) closure实现
文章目录引言基类1.1 comac_argc1.2 repeat2. implement2.1 reference2.2 function总结引言libco中提供了一份闭包的实现,根据这份实现,我们不但可以把这个闭包用于线程,也可以用于协程。因为libco中的函数表示通常使用函数指针,而不是std::function,所以没办法使用C++自带的闭包机制,所以实现了这么一个简易的闭包。不过说是简易,只有区区100行代码,不过这些个宏函数确实是看的人头皮发麻,写出这些代码的人估计也是那种传说中的C程序员了。原创 2020-06-22 19:45:29 · 986 阅读 · 2 评论 -
libco源码解析(8) hook机制探究
引言在探究这个机制之前我们先来看看libco为什么被腾讯的工程师们创造出来。如今微信已经是一个月活近12亿的现象级软件,不可否认其背后的技术架构一定是首屈一指的。但是罗马不是一日建成的。实际在微信运行之初其并发能力并不是像现在一样。事实上当时大部分模块都采用了半同步半异步模型。接入层为异步模型,业务逻辑层则是同步的多进程或多线程模型,业务逻辑的并发能力只有几十到几百。显然微信需要一次技术上的革命。有两种方案被提出来:A 线程异步化:把所有服务改造成异步模型,相当于把整个微信的框架重新实现一遍,从技原创 2020-06-22 19:45:18 · 2231 阅读 · 5 评论 -
libco源码解析(7) read,write与条件变量
引言我挑选了几个比较有代表性的hook后的函数来说明hook后的函数具体干了什么,其他的函数也基本是大同小异。当然至此还是没有讨论hook机制,就放在下一篇文章中吧。再看这些函数之前我们要知道为什么需要hook,当用户创建阻塞套接字的时候,如果操作了这些套接字会导致线程切换,这不是我们希望看到的,我们希望能够在用户无感的情况下把把同步的操作替换为异步。这需要我们在调用系统调用的时候加一些代码,这也是使用hook的原因。readtypedef ssize_t (*read_pfn_t)(int fil原创 2020-06-22 19:45:07 · 1034 阅读 · 0 评论 -
libco源码解析(6) co_eventloop
引言我们总能在运行libco协程代码的最后看到对于函数co_eventloop的调用,它可以理解为主协程执行的函数。我们举一个简单的例子来说明它的作用:void* routinefun(void* args){ co_enable_hook_sys(); while(true){ poll(NULL, 0, 1000); } return 0;}int main(int argc,char *argv[]){ vector<task_t> v; for(int i=原创 2020-06-22 19:44:48 · 1532 阅读 · 2 评论 -
libco源码解析(5) poll
引言poll是libco中所有hook后的函数中可以说是最重要的一个,因为我们不但可以这个函数来隐式的转移CPU执行权,而且其他hook后的函数还可以使用这个hook后的poll在不切换线程的情况下去监听套接字,并在超时或者套接字有事件到来的时候唤醒这个调用poll的协程。在example_cond.cpp中我们也可以看到使用poll去切换执行权的操作,也正因为此,我们才得以完成使用一个线程去完成一个完整的生产者消费者模型。正文关于libco的hook技术原理,我们会在后续文章中去讲解,现在知道它的原创 2020-06-22 19:44:35 · 2001 阅读 · 2 评论 -
libco源码解析(4) 协程切换,coctx_make与coctx_swap
文章目录引言基础知识正文coctx_make16L的哲学引言题目说的很清楚,这篇文章旨在把协程最为神秘的部分,也即是协程的切换讲的清楚明白,这部分也是令很多人望而生畏的地方,因为在切换协程时用到了一部分汇编代码。所以想要真正理解这部分,还是得先花一点时间把丢掉的汇编先拿回来。基础知识首先我们来看下栈帧的定义:In C and modern CPU design conventions, the stack frame is a chunk of memory, allocated from th原创 2020-06-22 19:44:23 · 2388 阅读 · 4 评论 -
libco源码解析(3) 协程执行,co_resume
文章目录引言正文stStackMem_t && stShareStack_tco_swap引言我们知道协程在由co_create创建以后其实是没有运行的,需要我们显式的执行co_resume才可以,这里显然是一个比较麻烦的过程,因为这里涉及到了协程的切换,也就意味着我们需要操作寄存器,这里就需要使用到一些汇编代码。正文我们先来看看co_resume的函数逻辑吧!void co_resume( stCoRoutine_t *co ){ // stCoRoutine_t结构需要我们原创 2020-06-22 19:44:11 · 1583 阅读 · 1 评论 -
libco源码解析(2) 创建协程,co_create
文章目录引言正文co_get_curr_thread_envco_init_curr_thread_envco_create_env引言这篇文章我们来看一看如何创建一个协程的实例,即co_create函数的具体实现。正文我们在上一篇文章中说过libco创建协程的接口为了程序员可以更快的接收,采取了类似于线程的创建方法,我们看看co_create的函数定义int co_create( stCoRoutine_t **ppco,const stCoRoutineAttr_t *attr,pfn_co原创 2020-06-22 19:43:54 · 1824 阅读 · 2 评论 -
libco源码解析(1) 协程运行与基本结构
引言这是计划的一系列文章的第一篇, 作为第一篇,我们要先来看看libco的协程如何使用,我们直接拿libco中的example_cond.cpp来对协程的运行过程做一个简单的解释。#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <queue>#include "co_routine.h"using namespace std;struct stTask_t{原创 2020-06-22 19:43:43 · 3347 阅读 · 4 评论 -
协程入门,这可能是全网最简单易懂的扫盲贴了
文章目录引言协程是什么哪里提升了效率?适用的场景协程的实现原理总结引言还记得大概是去年十一月份的时候,心中萌发了用协程去优化下写的http服务器这一想法,但是协程是什么?为什么可以优化?一概不清楚,不明白。还记得当时大概花了一晚上的时间,去搜相关的知识点,得到的结果甚至是比搜之前更为迷惑,究其原因还是基础薄弱是一点,其次且就是相关资料的欠缺,大多都是你拷我,我拷你,千人一面。现在经过一段时间对于协程的学习,算是入了个门,对于这么个东西也是有了一些自己的想法,遂希望记录下来,能给需要的人一点帮助。协程原创 2020-06-19 18:23:38 · 2669 阅读 · 3 评论