vpp process类型节点调度过程

news2025/1/19 23:18:19

vpp节点类型

VLIB_NODE_TYPE_PROCESS:process类型节点可以被挂起也可以被恢复,main线程上调度

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂 

process节点注册

process类型节点调度流程

每个process结点是由jump机制构成的一个协程,协程主要用于等待、处理事件。

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

协程中运行的函数类似于线程函数,区别在于协程函数can be suspended, wait for events, be resumed......(based on setjump/longjump)

以x86_64 cpu来说,clib_longjmp_t存放rbx, rbp, r12, r13, r14, r15, eip, rsp寄存器,利用这些寄存器实现跳转功能

clib_setjmp

作用:保存上下文,即上述的寄存器。 返回值:首次调用(跳转功能还未执行过),返回传入的第二个参数,即return_value_not_taken,否则返回clib_longjmp的返回值(如果long jump已执行)

clib_longjmp

作用:恢复clib_setjmp时调用栈环境的存储数据,跳转回去继续执行 返回值:传入的第二个参数

clib_calljmp

作用:在给定的栈空间上执行function

process节点初始化 (以ip4_full_reass_expire_node节点为例)

vlib_main_or_worker_loop` -> `dispatch_process` -> `vlib_process_startup

通过执行dispatch_process完成最初对各process节点的一次调度,即初始化操作

  1. vlib_process_startup中,clib_setjmp设置return_longjmp,此时返回值r为VLIB_PROCESS_RETURN_LONGJMP_RETURN

  2. 然后clib_calljmp在给定的栈空间上(给每个process节点在注册时分配的p->stack)调用vlib_process_bootstrap

\3. 真正执行各process节点的function

\4. 每个process节点都会在开头处调用vlib_process_wait_for_event_or_clockvlib_process_wait_for_event

\5. vlib_process_wait_for_event_or_clock先去检查non_empty_event_type_bitmap是否有置位,如有说明有事件需要去处理,则直接返回。否则将suspend状态标记置位,标识当前是suspend状态,等待event或clock。

\6. 设置resume_longjmp,此时返回值r为VLIB_PROCESS_RESUME_LONGJMP_SUSPEND

\7. 调用clib_longjmp跳转到vlib_process_startup -> clib_setjmp 设置return_longjmp处,此时返回值r应为clib_longjmp的第二个参数,即VLIB_PROCESS_RETURN_LONGJMP_SUSPEND

\8. 上述步骤完成了一个process节点的初始调度,各process node暂时处于suspend状态,等待某个条件(时钟或事件)的到来进入resume状态并执行业务逻辑

resume

需要恢复的process有两种情况,一种是等待的时钟已经到期,一种是等待的事件发生

data_from_advancing_timing_wheel数组存放所有超时的process index。不仅等待时钟的,等待事件的process,也会向数组加入自己的index

dispatch_suspended_process` -> `vlib_process_resume

\1. 设置return_longjmp,此时返回值r为VLIB_PROCESS_RETURN_LONGJMP_RETURN

\2. 调用clib_longjmp,跳转到第一次调度时设置resume_longjmp处,即vlib_process_wait_for_event_or_clock->clib_setjmp处,此时clib_setjmp返回值应为VLIB_PROCESS_RESUME_LONGJMP_RESUME

\3. 返回到ip4_full_reass_walk_expired节点,执行业务逻辑,即重组buffer的老化流程,各节点的业务逻辑执行均为死循环,下一次调用到vlib_process_wait_for_event_or_clock时,设置resume_longjmp,此时返回值r为VLIB_PROCESS_RESUME_LONGJMP_SUSPEND

\4. 调用clib_longjmp跳转到vlib_process_resume -> clib_setjmp 设置return_longjmp处,此时返回值r应为clib_longjmp的第二个参数,即VLIB_PROCESS_RETURN_LONGJMP_SUSPEND

\5. 进入到下一轮的suspend状态,在vpp main线程的循环中,一直持续着suspend resume的状态切换过程,每次resuem时,执行节点的业务逻辑

原文链接:vpp process类型节点调度过程 - 知乎 原文作者:Wendy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MC】新加载器 Quilt 好用吗?和 Fabric 相比好在哪?

在今年四月 (2022/4/20) ,一个船新加载器 Quilt 发布了第一个测试版。 Quilt officially entered its first beta today, attracting an influx of new users and an amazing amount of support and positive feedback. By the end of the day, Quilt was happily l…

Go语言设计与实现 -- 字符串

Go语言的字符串与Java和python是一样的。具有不可变性。是一个只读的字节数组,如图所示。 因为Go的字符串具有不可变性,所以我们只能通过string和[]byte类型之间反复转换实现修改。 将这一段内存复制到栈上将变量的类型转换成[]byte后并修改字节数据将修…

功能上新|使用 Excel 低门槛进行指标分析!

Kyligence Zen 功能上新啦!用户不仅可以在 Kyligence Zen 中定义、分析和管理指标,还可直接使用 Excel 插件来分析 Kyligence Zen 中已经定义好的指标,学习无门槛,上手更轻松!欢迎访问 http://zen.kyligence.io 申请免…

实验二A 图像的空域(源代码一站式复制粘贴)

实验二A 图像的空域一、实验目的二、实验原理三、实验内容与要求四、实验的具体实现一、实验目的 1.掌握图像滤波的基本定义及目的。 2.理解空间域滤波的基本原理及方法。 3.掌握进行图像的空域滤波的方法。 二、实验原理 1.空域增强 空域滤波是在图像空间中借助模板对图像进…

阳哥JUC并发编程之AQS后篇全网最详细源码笔记

文章目录AQS后序课程笔记AQS源码ReentryLock锁的原理分析公平锁以及非公平锁源码详解Aquire方法调用原码流程分析第一步、tryAquire第二步、addwrite第三步:aquireQueuedAQS释放锁的过程第一步、释放锁第二步进入aquireQueueAQS异常情况下走Cancel流程分析第一种队尾…

ECharts项目实战:全球GDP数据可视化

【课程简介】 可视化是前端里一个几乎可以不用写网页,但又发展得非常好的方向。在互联网产品里,无论是C端中常见的双十一购物节可视化大屏,还是B端的企业中后台管理系统都离不开可视化。国家大力推动的智慧城市、智慧社区中也有很多可视化的…

对于DDoS攻击防御有哪些误区?

​  DDoS攻击是属于常见网络攻击之一,也是一种较难防御的网络攻击。它的特点就是易于启动、难防御、有害、难跟踪等。因此DDoS攻击也是众多站长最怕遇见的网络攻击。那么大家在使用海外服务器时,会有哪些DDoS攻击防御的误区呢? 1、防御全部DDoS攻击 防…

CSS -- 09. 移动WEB开发之flex布局

文章目录移动WEB开发之flex布局1 flex布局原理2 常见的父项属性2.1 设置主轴方向 flex-direction2.2 设置主轴上的子元素排列方式 justify-content2.3 设置元素是否换行 flex-wrap2.4 设置侧轴上的子元素的排列方式(单行) align-items2.5 设置侧轴上的子…

【矩阵论】6.范数理论——基本概念——矩阵范数生成向量范数谱范不等式

6.1.3 矩阵范数产生向量范数 CnnC^{n\times n}Cnn 上任一矩阵范数 ∥∙∥\Vert \bullet\Vert∥∙∥ 都产生一个向量范数 φ(X)∥X∥V\varphi(X)\Vert X\Vert_Vφ(X)∥X∥V​ 矩阵范数与向量范数的相容性:φ(Ax)≤∥A∥φ(x)\varphi(Ax)\le \Vert A\Vert\varphi(x)φ…

MySQL SSL安全解读

安全一直是不可不重视的问题。目前MySQL这方面应大方向上技术手段都具备。如:网络链接,权限控制,key秘钥认证,数据加密脱敏 等方式。综合考虑,虽然很多环境无法所有这些安全策略全部应用上,但在可控范围内尽…

【C语言数据结构(基础版)】第五站:树和二叉树

目录 一、树的概念及结构 1.树的概念 2.树的表示 3.树在实际中的应用 二、二叉树概念及结构 1.概念 2.特殊的二叉树 3.二叉树的性质 4.二叉树的存储结构 (1)顺序存储 (2)链式存储 三、二叉树链式结构的实现 1.二叉树的…

Mysql的MVCC知多少(隐藏字段,undolog版本链和ReadView)

文章目录前言一、什么是MVCC二、快照读与当前读三、4种隔离级别与MVCC四、MVCC实现4.1 隐藏字段和undolog版本链4.2 ReadView五、说明前言 其实自己之前对MVCC知之甚少,总觉得是一块很难啃的骨头,有点内惧,但当你真的掌握之后,就…

Fastadmin ThinkPHP5 宝塔环境 下Redis的使用教程

本篇为学习参考,不喜勿喷 此为宝塔windows环境下 1.首先在宝塔的安装面板,找到redis,点击安装。 2.安装完redis后,点击设置, 设置个密码(ps:留空代表没有设置密码) 3.php环境安装redis扩展(ps:安装redis扩…

Linux学习笔记——Linux用户和权限管控

03、Linux用户和权限管控 3.1、认知root 用户 3.1.1、root用户(超级管理员) 1、无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员&#x…

赛狐ERP运营篇 | 店铺管理数智化 ,风险规避更有效!

亚马逊卖家在运营的当中会遇到以下这些问题: 1、工作重复度高,每天浪费大量的时间整理数据报表。 2、数据分析指标单一,无法掌握全局数据指标,综合分析Listing。 3、熬夜调广告,无法精准调整广告预算、竞价。 4、运…

2023年入职/转行网络安全,该如何规划?

前言 前段时间,知名机构麦可思研究院发布了 《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,其中,信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景,想必无需我多言,作为…

c盘扩展卷选项是灰的怎么办?win10系统c盘扩展卷灰色

在Windows自带的磁盘管理工具中,用户想要对C盘进行扩容,c盘扩展卷选项是灰的怎么办? 那么,在本文中,易我小编将为您解答c盘分区扩展灰色的相关知识,帮你用户高效快捷地拓展C盘。 一、c盘分区扩展灰色的原因…

Android入门第52天-在SharedPreference中使用加密

简介 在上一篇中,我们讲了SharedPreference的使用。但是那不是一个生产场景。特别是我们举了一个例子,存放登录信息的例子。这个例子里用户的密码没有加密,比如说在真实的实际生产环境里用户的一些敏感信息或者说是像:用户四要素…

磁矢位的引入 工程电磁场 P19

首先我们有恒定磁场的两个方程 为了更方便解决问题,我们引入磁矢位 由此我们可以得到 我们可以得到 我们要确定A,则既需要知道旋度,我们还需要知道散度 如果是均匀媒质,是常数 我们可以得到 我们进行展开可以得到 我们要知道…

索引的底层实现及应用和失效场景

简介 合适的索引能让查询语句性能得到极大的优化,它只是优化业务的一种方式,不能为了建立索引而建立索引。 索引是什么? 索引是一种为了快速查找数据的数据结构,是帮助数据库快速获取数据的 排好序的数据结构 (BTree)。 索引的好…