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 ...
随机推荐
- 2019-2020-1 20199326《Linux内核原理与分析》第一周作业
开篇概述 我利用假期的时间自学了实验楼上的Linux基础入门前八个实验的课程,学习过程中遇到了一些小问题.但经过查资料等方式最终还是解决了问题.现将学到的一些知识点总结下来.方便日后复习查看. 1.零 ...
- python学习11函数
'''''''''函数:1.定义:指通过专门的代码组织,用来实现特定的功能的代码段,具有相对独立性,可供其他代码重复调用2.语法:def 函数名([参数]): 函数体[return 返回值]3.函数名 ...
- (三)PL/SQL数据类型
PL/SQL注释 程序注释是解释性说明,可以包括自己编写的,并帮助任何人阅读源代码的PL/SQL代码.所有的编程语言允许某种形式的注释. 在PL/SQL支持单行和多行注释.任何注释里面所有字符都会被P ...
- Spring Boot filter
在Spring Boot中自定义filter 本文我们将会讲解如何在Spring Boot中自定义filter并指定执行顺序. 定义Filter很简单,我们只需要实现Filter接口即可,同时我们可指 ...
- 日日算法:Kruskal算法
介绍 克鲁斯卡尔(Kruskal)算法是用来求出连通图中最小生成树的算法. 连通图:指无向图中任意两点都能相通的图. 最小生成树:指联通图的所有生成树中边权重的总和最小的树(即,找出一个树,让其联通所 ...
- 用两张图告诉你,为什么你的App会卡顿?
有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...
- 几个加速Swift开发的小tip
又是周五了,周末不要浪,一起学点Swift!本周再次为大家带来了一些Swift的小技巧,都是些奇淫巧计,不知道也无妨,但Swift最吸引我的一点就是它的简洁易用.主要内容有: private(set) ...
- angularJS中$http.get( ).success( )报错原因及解决方案
一.问题描述: 电脑安装的angular1.6.7版本,项目中使用了$http.get( ).success( ),控制台报错: $http.get(...).success is not a fun ...
- Codeforce-Ozon Tech Challenge 2020-D. Kuroni and the Celebration(交互题+DFS)
After getting AC after 13 Time Limit Exceeded verdicts on a geometry problem, Kuroni went to an Ital ...
- <学习笔记之 JQuery>
1. mouseenter 当鼠标指针进入(穿过)元素时,触发事件 var is_enter_help = false; $("#help-div").mouseenter(f ...