
Libco
文章平均质量分 79
理解协程机制
蓬莱道人
半路出家的研究僧
展开
-
libco源码阅读(八):hook机制
1. hook机制是什么2. 动态连接和静态连接 2.1 编译过程 2.2静态链接 2.3 动态链接3. hook机制的实现 3.1 使用环境变量LD_PRELOAD 3.2 源码入侵 跟着某位大佬的博客一步步看完了libco源码,本以为看到co_eventloop算是把源码看完了,但是没想到接着往下看,竟然还有一个hook机制,编程这么多年,还从未这么使用过,hook着实是编程里面的一个奇淫技巧。总之,多看优秀源码,对提高自己的编程水平...原创 2021-03-21 17:01:37 · 922 阅读 · 0 评论 -
libco源码阅读(七):事件循环co_eventloop
1. 事件循环co_eventloop2、TakeAllTimeout函数1. 事件循环co_eventloop 将文件事件和时间事件注册到时间轮之后,接下来主协程会调用事件循环函数co_eventloop,对时间轮进行轮询访问,如果超时事件发生,则调用对应事件的回调函数执行。void co_eventloop( stCoEpoll_t *ctx,pfn_co_eventloop_t pfn,void *arg ){ if( !ctx->result ) { ctx-..原创 2021-03-21 12:09:36 · 430 阅读 · 0 评论 -
libco源码阅读(六):事件注册poll
libco的poll函数可以用于事件的注册,包括文件事件和时间事件。文件事件指的是网络套接字是否可读或者可写,而时间事件则相当于是一个定时器,在定时器指定的时间超时后继续执行。在hello word的例子中,生产者协程就调用poll注册了一个时间事件。void* Producer(void* args){ co_enable_hook_sys(); stEnv_t* env= (stEnv_t*)args; int id = 0; while (true) { stTask_...原创 2021-03-20 21:03:59 · 559 阅读 · 0 评论 -
libco源码阅读(五):协程调度——时间轮
1、epoll相关的数据结构2、epoll的创建3、时间轮介绍 在创建线程环境的时候,会为线程环境创建一个epoll的结构体,用于协程的调度,接下来我们来一探究竟。void co_init_curr_thread_env(){ ... ... stCoEpoll_t *ev = AllocEpoll(); // 为线程环境创建一个epoll的结构 SetEpoll(env, ev);}1、epoll相关的数据结构struct stCoEpoll_t{ ..原创 2021-03-20 18:05:30 · 569 阅读 · 0 评论 -
libco源码阅读(四):协程的上下文环境
在调用co_resume函数执行一个协程,需要调用两个函数,分别是:coctx_make:用于创建协程的上下文环境; co_swap:用于切换上下文环境 这两个函数是实现协程的关键。1 创建协程上下文环境:coctx_makeint coctx_make( coctx_t *ctx,coctx_pfn_t pfn,const void *s,const void *s1 ){ char *sp = ctx->ss_sp + ctx->ss_size; sp ...转载 2021-03-14 16:17:56 · 492 阅读 · 0 评论 -
libco源码阅读(三):协程的创建和运行
libco的协程创建和线程创建不同,线程创建后立刻可以运行,而对于协程而言,创建和运行是分开的,创建协程需要调用接口co_create,而运行协程则要调用接口co_resume。1、协程创建:co_create 1.1co_get_curr_thread_env 1.2co_init_curr_thread_env 1.3co_create_env2、协程运行:co_resume 2.1 coctx_make 2.2 co_swap...转载 2021-03-12 00:05:37 · 294 阅读 · 0 评论 -
libco源码阅读(二):协程关键数据结构
协程的创建和切换都是由用户控制的,那么协程切换时是如何保存上下文信息的呢,这一节我们介绍一下libco实现协程的关键数据结构。1、stCoRoutine_t2、coctx_t3、stack_mem和stShareStack_t4、stCoRoutineEnv_t1、stCoRoutine_t 这个结构实际上就是就是协程的主体结构,存储着一个协程相关的数据,每个协程对应一个stCoRoutine_t,它保存这协程的私有数据和协程切换时的上下文信息。每当调用co_creat...转载 2021-03-11 23:22:38 · 481 阅读 · 0 评论 -
libco源码阅读(一):Hello World
1、协程是什么 1.1 进程 1.2 线程 1.3 协程2、libco库跑hello world1、协程是什么 在了解协程之前,需要对比一下进程、线程和协程的区别: 1.1 进程 进程可以理解为资源分配的基本单位,操作系统以一个进程为基本单位,分配系统资源,包括内存资源和CPU的时间片资源。进程的切换者是操作系统,切换时机是根据操作系统自己的切换策略,用户是无感知的。进程的切换内容包括页全局目录、内核栈、硬件上下文,切换内容保存在内存...原创 2021-03-11 00:25:47 · 359 阅读 · 0 评论