一个 cpp 协程库的前世今生(三)cocpp 的核心框架结构
接下来,我们结合项目代码目录来说一下协程的核心框架结构。项目地址:
GitHub - skyfireitdiy/cocpp at cocpp-0.1.0
协程调度的主体框架在include/core
(声明)和source/core
(实现)中。本节中我们只是了解 cocpp 的整体框架,不需要了解实现,因此不需要关注 source 目录。
在include/core
目录中有很多头文件,本节我们只关注co_ctx.h
,co_env.h
和co_manager.h
,这三个文件是协程调度的核心,分别对应三个重要概念:上下文、运行环境、管理器。
上下文
co_ctx.h
中定义了co_ctx
类,每个co_ctx
对应一个协程,co_ctx
中保存了与其关联协程的一些状态信息,与调度相关的主要有:
栈内存(
stack__
)运行环境(下文介绍)(
env__
)入口函数(
entry__
)寄存器信息(
regs__
)
运行环境
co_env.h
中定义了co_env
类,每个co_env
对应一个系统线程,是ctx
的实际运行环境。与调度相关的主要函数与成员主要有:
关联的线程(
worker__
)当前协程(
curr_ctx__
)新增协程(
add_ctx
)开始调度(
start_schedule
)切换协程(
schedule_switch
)
管理器
co_manager.h
中定义了co_manager
类,co_manager
负责协程环境和协程上下文的统一管理,包括协程环境与上下文的创建、删除,协程环境的动态伸缩、监控等。与调度相关的主要函数与成员有:
环境集(
env_set__
)创建环境(
create_env
)创建并开始调度协程上下文(
create_and_schedule_ctx
)
上面仅罗列了与调度相关的核心成员,实际在这三个类的定义中还有其他不少成员,比如控制协程休眠的睡眠控制器、管理状态的状态管理器、用于多协程共享的共享栈内存等,但是他们与核心调度的联系并不是特别紧密,这些成员到以后专门的章节再进行介绍。
整体结构
ctx
、env
与manager
的整体结构如下图:
ctx
在env
下调度,每个env
与一个内核线程关联,env
由manager
统一管理。
总结
本文介绍了 cocpp 的核心架构,主要是协程上下文 ctx,协程运行环境 env,管理器 manager,这三个结构是一切的基础,后面介绍的各种功能、组件都是在这三个核心数据结构之上搭建起来的。
版权声明: 本文为 InfoQ 作者【SkyFire】的原创文章。
原文链接:【http://xie.infoq.cn/article/7748bf243070e832d2b10d64f】。文章转载请联系作者。
评论