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 Timer Library原理(学习笔记)的更多相关文章

  1. DPDK Mbuf Library(学习笔记)

    1 Mbuf库 Mbuf库提供了分配和释放缓冲区(mbufs)的功能,DPDK应用程序可以使用这些mbufs来存储消息缓冲. 消息缓冲存储在内存池中,使用Mempool库. 数据结构rte_mbuf通 ...

  2. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  3. DPDK Hash Library原理(学习笔记)

    0 前言 本文主要翻译至DPDK的官方编程指南,在谷歌翻译的基础上根据自己的理解做了一些修改.网上搜索的很多中文翻译大多是翻译后直接黏贴上来,有时候连语句都读不通.希望本文能够对你有所帮助. 1 介绍 ...

  4. Java并发之底层实现原理学习笔记

    本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...

  5. TCP/IP协议原理学习笔记

    昨天学习了杨宁老师的TCP/IP协议原理第一讲和第二讲,主要介绍了OSI模型,整理如下: OSI是open system innerconnection的简称,即开放式系统互联参考模型,它把网络协议从 ...

  6. Enterprise Library 6 学习笔记

    今天是2014年上班第一天,想着今年要做点与往年不同的事情,就从写博客开始吧. 公司的项目一般都用微软的企业库,一直没时间好好研究,第一天上班还不忙,就抽空研究了下.搜索一下,发现这个企业库已经到了6 ...

  7. elasticsearch原理学习笔记

    https://mp.weixin.qq.com/s/dn1n2FGwG9BNQuJUMVmo7w 感谢,透彻的讲解 整理笔记 请说出 唐诗中 包含 前  的诗句 ...... 其实你都会,只是想不起 ...

  8. 个人MySQL的事务特性原理学习笔记总结

    目录 个人MySQL的事务特性原理笔记总结 一.基础概念 2. 事务控制语句 3. 事务特性 二.原子性 1. 原子性定义 2. 实现 三.持久性 1. 定义 2. 实现 3. redo log存在的 ...

  9. 【GISER && Painter】Chapter00:OpenGL原理学习笔记

    说明:简单了解一下OpenGL的工作原理,初步认识计算机对于图形渲染的底层设计与实现,第一次接触,也没学过C艹,欢迎各位批评指正. 一  什么是OpenGL? OpenGL是一个开放标准(specif ...

随机推荐

  1. 2019-2020-1 20199303《Linux内核原理与分析》第八周作业

    Linux如何启动并装载程序 理解编译链接的过程和ELF可执行文件格式 第一步:先编辑一个hello.c 第二步:生成预处理文件hello.cpp gcc -E -o hello.cpp hello. ...

  2. 探索ORACLE之ASM概念(完整版)

    探索ORACLE之ASM概念(完整版) 本文出自https://www.jb51.net/article/43527.htm ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出 ...

  3. Python学习15之python内置六大标准类型

    1.六大标准类型:数值型,str,list,set,tuple,dic 2.数值型:int,float,bool,complex 3.区别: 1)数值型和str,tuple都是不可变类型 而list, ...

  4. VIM 批量缩进4个空格

    vim  /etc/vimrc  或  vim  ~/.vimrc set smartindent set shiftwidth= 按v选中多行,回车 然后shifit + >

  5. ELK6.3版本安装部署

    一.Elasticsearch 安装 1.部署系统以及环境准备 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) uname - ...

  6. Ubuntu 之 win10更新ubuntu启动项消失

    问题描述: 昨晚windows更新,今天启动的时候发现启动项没有了,直接进入windows. 解决方案一: 首先进入BIOS看一看是否开启启动项选择,然后再把安全模式(secure boot)关闭(重 ...

  7. Robot Framework -002 在Windows10上的安装

    机器人框架是使用Python实现的,并且还支持Jython(JVM),IronPython(.NET)和PyPy. 在安装框架之前,一个明显的前提条件是至少安装这些解释器之一. 下面列出了安装Robo ...

  8. Linux系统应用管理:增加普通用户(密码管理等)

    1. 查看当前Linux系统的版本.内核等信息 [root@oldboy ~]# cat /etc/redhat-release CentOS release 6.7 (Final) . # 系统版本 ...

  9. 理解CAS算法在JAVA中的作用

  10. Bomb Enemy 炸弹人

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...