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 ...
随机推荐
- SVN diff
http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.diff.html Name svn diff (di) — This displays the di ...
- Deep Snake : 基于轮廓调整的SOTA实例分割方法,速度32.3fps | CVPR 2020
论文提出基于轮廓的实例分割方法Deep snake,轮廓调整是个很不错的方向,引入循环卷积,不仅提升了性能还减少了计算量,保持了实时性,但是Deep snake的大体结构不够优雅,应该还有一些工作可以 ...
- 从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择
背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...
- js数组排序和打乱
js数组根据不同的业务需求,会要求数组有序或者无序,记录一下流传较广,通用性较强的排序和乱序方法. 数组排序: arr.sort(function(a,b){//从小到大 return a-b;[re ...
- #Lab0 Environment Building
清华提供了实验环境的很多选项,具体可以参考README 我选择用虚拟机完成. 一.安装VirtualBox 下载链接 一路next,我的版本是6.0.4. 二.下载虚拟硬盘文件 实验所需的软件都在虚拟 ...
- muduo网络库源码学习————线程安全
线程安全使用单例模式,保证了每次只创建单个对象,代码如下: Singleton.h // Use of this source code is governed by a BSD-style lice ...
- [转载] IE8+兼容小结
本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...
- 使用Redis构建电商网站
涉及到的key: 1. login,hash结构,存储用户token与用户ID之间的映射. 2. recent_tokens,存储最近登陆用户token,zset结构 member: token,sc ...
- HDU1214圆桌会议
一个环,从1编号到n. 每次可以交换相邻的两个人, 问最少交换几次,使得每个数字的左右数字交换. 转载自:https://blog.csdn.net/yin_zongming/article/deta ...
- E. A Simple Task
E. A Simple Task 这个题目的意思是 给你一个由小写字母组成的字符串,有两种操作 i j k 如果k==1 那么就是就把i 到 j 的这个区间非递减排序. i j k如果k==2 那么就 ...