DPDK Timer Library原理(学习笔记)
0 前置知识学习跳表(SkipList)
跳表应具有以下特征:
1)一个跳表应该有多个层(level)组成,通常是10-20层。
2)跳表的第0层包含所有的元素。
3)每一层都是一个有序的链表。层数越高应越稀疏,这样在高层次中能跳过许多不符合条件的数据。
4)如果元素x出现在第i层,则所有比i小的层都包含x;
5)每个节点包含key及其对应的value和一个指向下一层相同内容的节点位置。
skiplist的查询过程示例:
以已有数据13、22、75、80、99为例,查找80。从最高层(此例为2)开始:
1)level2找到结点Node75小于80,且level2.Node75->next 大于80,则进入level1查找(此处已经跳过了13~75中间的结点(22)。
2)level1.Node75 < 80 < level1.Node75->next,进入level0。
3)level0.Node75->next 等于80,找到结点。

1 定时器库
定时器库为DPDK执行单元提供定时器服务,以异步执行回调函数。该库的功能有:
- 定时器可以是周期性执行或单次执行。
- 定时器可以从一个内核加载并在另一个内核上执行。但必须在对rte_timer_reset()的调用中指定它。
- 定时器提供精度高计数(取决于对rte_timer_manage()的调用频率,该调用频率检查本地内核的定时器到期情况)。
- 如果应用程序中不需要,可以通过不调用rte_timer_manage()来提高性能,从而在编译时禁用定时器。
定时器库使用rte_get_timer_cycles()函数,该函数使用高精度事件定时器(HPET)或CPU时间戳计数器(TSC)提供可靠的时间参考。
该库提供添加,删除和重新启动定时器的接口。该API基于BSD callout(),但有一些区别。请参阅标注手册。
2 实施细节
定时器以每个逻辑核为基础进行跟踪,并在跳表(skiplist)数据结构中按定时器到期的顺序维护核内的所有待处理定时器。使用的跳表有十个级别,并且表中的每个条目以(¼^级)的概率出现在每个级别中。这意味着所有条目都存在于级别0中,每4个条目中就有1个存在于级别1中,每16个条目中就有1个存在于级别2中,依此类推,直到第9级为止。这意味着从一个定时器列表中添加和删除条目的时间复杂度为log(n),每个逻辑核最多能容纳4^10个条目,即约1,000,000个定时器。
定时器结构包含一个称为状态的特殊字段,该字段是定时器状态(已停止,挂起,正在运行,配置)和所有者(lcore id)的联合体。
union rte_timer_status {
RTE_STD_C11
struct {
uint16_t state; /**< Stop, pending, running, config. */
int16_t owner; /**< The lcore that owns the timer. */
};
uint32_t u32; /**< To atomic-set status + owner. */
};
根据定时器的状态,我们知道列表中是否存在定时器:
- STOPPED停止:没有所有者,不在列表中
- CONFIG配置:由一个核拥有,不能被另一个核修改,在不在列表中未知,取决于先前的状态。
- PENDING待处理:由一个核拥有,在列表中
- RUNNING运行:由一个核拥有,不能被另一个核修改。在列表中。
不允许在CONFIG或RUNNING状态下重置或停止定时器。修改定时器的状态时,应使用CAS(比较并交换)指令来保证状态及所有者被原子地修改。
在rte_timer_manage()函数内部,跳表将作为一个常规链表来遍历级别0的列表(包含所有定时器条目)直到遇到尚未到期的条目。当列表中有条目,但是没有任何定时器到期时,为了提高性能,第一个定时器条目的到期时间保存在每个逻辑核的定时器列表结构中。在64位平台上,可以直接检查该值,而无需对整个结构进行锁定。(由于将到期时间是一个64位值,32位平台上如果不使用比较交换(CAS)指令或使用锁,将无法直接对该值进行检查。因此将跳过此附加检查,而在某次获得锁后再进行检查)。在64位和32位平台上,调用核的定时器列表为空的情况下对rte_timer_manage()的调用将不带锁返回。
3 用例
在垃圾收集器或某些状态机(ARP,桥接等)下,定时器库被用于定期调用。
4 参考文献
- DPDK官方编程指南 - http://doc.dpdk.org/guides-20.02/prog_guide/timer_lib.html
- callout manual - The callout facility that provides timers with a mechanism to execute a function at a given time.
- HPET - Information about the High Precision Event Timer (HPET).
DPDK Timer Library原理(学习笔记)的更多相关文章
- DPDK Mbuf Library(学习笔记)
1 Mbuf库 Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲. 消息缓冲存储在内存池中,使用Mempool库. 数据结构rte_mbuf通 ...
- Unity3D 骨骼动画原理学习笔记
最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...
- DPDK Hash Library原理(学习笔记)
0 前言 本文主要翻译至DPDK的官方编程指南,在谷歌翻译的基础上根据自己的理解做了一些修改.网上搜索的很多中文翻译大多是翻译后直接黏贴上来,有时候连语句都读不通.希望本文能够对你有所帮助. 1 介绍 ...
- Java并发之底层实现原理学习笔记
本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...
- TCP/IP协议原理学习笔记
昨天学习了杨宁老师的TCP/IP协议原理第一讲和第二讲,主要介绍了OSI模型,整理如下: OSI是open system innerconnection的简称,即开放式系统互联参考模型,它把网络协议从 ...
- Enterprise Library 6 学习笔记
今天是2014年上班第一天,想着今年要做点与往年不同的事情,就从写博客开始吧. 公司的项目一般都用微软的企业库,一直没时间好好研究,第一天上班还不忙,就抽空研究了下.搜索一下,发现这个企业库已经到了6 ...
- elasticsearch原理学习笔记
https://mp.weixin.qq.com/s/dn1n2FGwG9BNQuJUMVmo7w 感谢,透彻的讲解 整理笔记 请说出 唐诗中 包含 前 的诗句 ...... 其实你都会,只是想不起 ...
- 个人MySQL的事务特性原理学习笔记总结
目录 个人MySQL的事务特性原理笔记总结 一.基础概念 2. 事务控制语句 3. 事务特性 二.原子性 1. 原子性定义 2. 实现 三.持久性 1. 定义 2. 实现 3. redo log存在的 ...
- 【GISER && Painter】Chapter00:OpenGL原理学习笔记
说明:简单了解一下OpenGL的工作原理,初步认识计算机对于图形渲染的底层设计与实现,第一次接触,也没学过C艹,欢迎各位批评指正. 一 什么是OpenGL? OpenGL是一个开放标准(specif ...
随机推荐
- 异常:NoSuchFieldError: BEST_MATCHING_HANDLER_ATTRIBUTE
出现的原因 pom 依赖之间不匹配导致 当前的 pom 调整后访问资源成功后面的 pom
- 标准库os
os模块 提供对操作系统进行调用的接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 os ...
- JS的String()、toString()、valueOf()的一些隐秘特性
toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...
- Swift-Realm数据库的使用详解
Swift-Realm数据库的使用详解 概述 Realm 是一个跨平台的移动数据库引擎,其性能要优于 Core Data 和 FMDB - 移动端数据库性能比较, 我们可以在 Android 端 re ...
- Codeforces 1291 Round #616 (Div. 2) B
B. Array Sharpening time limit per test1 second memory limit per test256 megabytes inputstandard inp ...
- Python编程求解第1天1分钱之后每天两倍持续一个月的等比数列问题
一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...
- muduo网络库源码学习————日志滚动
muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天.滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc #in ...
- undef用法
#undef的语法 定义:#undef 标识符,用来将前面定义的宏标识符取消定义. 整理了如下几种#undef的常见用法. 1. 防止宏定义冲突在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消 ...
- 题目分享Y
题意:给出一个n个点n条边的图且不一定连通(原题面为每个节点出度为1),相邻节点不能同时被选,每个节点有其对应价值,求最多能获得多少价值?n<=1e6,val[i]<=1e6 分析:很容易 ...
- 自动化API之一 生成开源ERP Odoo App 的RestFul API
1.在服务器上安装开源ERP Odoo 安装步骤请自行百度,本文重点不在于指导安装,以下是安装后PC端效果. Odoo: 2.在Uniconnector平台上注册Odoo App 移动端应用 3.配置 ...