前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >思科VPP系列专题十:协程模型

思科VPP系列专题十:协程模型

作者头像
通信行业搬砖工
发布2023-11-29 13:59:52
3230
发布2023-11-29 13:59:52
举报
文章被收录于专栏:网络虚拟化网络虚拟化

目录

  1. 向量图的绘制
  2. 协程模型
  3. 节点调度模型

协程的概念

维基百科是这样定义的

协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。

协程有多种语言的实现方式,对于C语言来说,C标准库里有“非局部跳转”函数setjmp和longjmp,它们分别保存和恢复:栈指针、程序计数器、被调用者保存的寄存器和ABI要求的任何其他内部状态。

VPP协程模型

VPP的协程便是由setjmp/longjmp实现。使用longjmp/setjmp的轻量级多任务协程,由应用进程自行进行调度,不受操作系统调度机制的影响,上下文切换只损耗调用longjmp/setjmp的时间。

代码使用汇编编写,只关注一下对应的API接口,

clib_longjmp_t 保存CPU寄存器状态 stack 保存堆栈信息

代码语言:javascript
复制
/* Return given value to saved context. */
跳转到setjmp设置点,reurn_value 就是跳转到clib—setjmp返回数值
void clib_longjmp (clib_longjmp_t * save, uword return_value);

/* Save context.  Returns given value if jump is not taken;
   otherwise returns value from clib_longjmp if long jump is taken. */
   设置跳转返回点,默认返回
uword clib_setjmp (clib_longjmp_t * save, uword return_value_not_taken);

/* Call function on given stack. */
在设置的stack区中跳转,运行fuc函数,函数返回值就是func的返回值
uword clib_calljmp (uword (*func) (uword func_arg),
		    uword func_arg, void *stack);

VPP是一个多线程程序,包括main线程,worker线程,协程。协程只能由main线程调度。

协程初始化流程:

在 vlib_main_or_worker_loop 函数中 main线程 遍历process数组,调用 dispatch_process 完成对process类型node的初始化调度。

在 vlib_process_startup 函数中,设置跳转返回点,在process的栈空间调用 vlib_process_bootstrap

vlib_process_bootstrap 函数中,执行 process类型node的function, 执行完之后跳转到返回点。此时的跳转返回点见process调度状态图。

每个 VLIB_NODE_TYPE_PROCESS 类型 node的function都遵循相同的模式:

  1. 在while循环中等待事件、或者事件超时;
  2. 获取事件类型,执行不同的事件;

以上便是协程初始化调度流程。此时每个process处于挂起状态。

process调度状态图如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 通信行业搬砖工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 协程的概念
      • VPP协程模型
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档