一. 缘由

排序,不要与tcp流重组排序混淆,而且下文踢桃序列号和tcp序列号不是同一个。此库为非线程安全的。

二. 介绍

1.引言

Reorder Library 提供一种机制依据序列号对mbuf进行排序。

2.操作

Reorder Library实质上是一个mbuf有序buffer。使用者将乱序的mbuf插入到有序的buffer中,然后从中有序的取出。

在给定时间内,这个重排buffer包含序列号在序列窗口内的mbufs。序列窗口由最小序列数和重排序buffer配置的持有条目数决定。例如,给一个有200条目的重排序buffer和350的最小序列,这个序列窗口最小值和最大值分别为350,550。

当插入mbufs时,Reorder Library依赖插入在mbuf中序列号来区分先后的有效性:

vaild: 序列号在窗口内。

late: 序列号在窗口外,小于最小序列号。

early:序列号在窗口外,大于最大序列号。

重排buffer直接返回late mbufs,然后尝试容纳early mbufs。

3.实现细节

Reorder Library 实现一对缓冲区,称为Oder buffer 和Ready buffer。

调用一个插入方法,vaild mbufs是直接插入到Oder buffer,而late mbufs是直接返回一个错误信息。

对于early mbufs这种情况下,重新排序buffer将尝试移动窗口(递增最小序列号),以使mbuf变为有效的。为此,在Oder buffer中mbufs被移到Ready buffer中。任何mbufs没有及时到达的将被忽略,因此将变为late mbufs。这意味着只要Ready buffer中有多余的空间,窗口就会移动来容纳early mbufs,否则就会在重排窗口之外。

例如,假设有一个200条目和最小序列为350的重排buffer,然后我们需要差异个序号为565的early mbuf。这说明我们至少需要移动窗口15个位置去容纳这个mbuf。这个重排buffer尝试移动mbufs在Order buffer中15个槽到Ready buffer中,只要Ready buffer中有足够的空间。在这个点的Order buffer的任何空隙将调过,当后面到来的包将被当做late包。将数据包移动Ready buffer过程持续到最小值知道一个空隙,如在Order buffer 遇到丢包。

当处理mbufs过程时,这个重排buffer将先把Ready buffer中的mbuf返回,然后Order buffer中的直到遇到丢包。

三. 应用

案例:包分发器

使用DPDK实现一个包分发器的应用,利用到Reorder Library库按包接收的顺序去转发数据包。

一个基本的包分发器由一个分发器和多个worker线程组成。这个worker线程无法保证包有序的,因此一个重排序缓存能够尽可能的讲包排序处理。

在这种场景下,在将mbufs派送到works前,包分发器分配一个序列号到mbuf。当works完成包处理时,这个包分发器插入这个mbufs到重排序buffer,然后最后转发到处理mbufs。

四. DPDK example

[root@dev packet_ordering]# ls
build  main.c  Makefile
[root@dev packet_ordering]# make clean
[root@dev packet_ordering]# makeCC main.oLD packet_orderingINSTALL-APP packet_orderingINSTALL-MAP packet_ordering.map
       /* Create rings for inter core communication */rx_to_workers = rte_ring_create("rx_to_workers", RING_SIZE, rte_socket_id(),RING_F_SP_ENQ);if (rx_to_workers == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));workers_to_tx = rte_ring_create("workers_to_tx", RING_SIZE, rte_socket_id(),RING_F_SC_DEQ);if (workers_to_tx == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));if (!disable_reorder) {send_args.buffer = rte_reorder_create("PKT_RO", rte_socket_id(),REORDER_BUFFER_SIZE);if (send_args.buffer == NULL)rte_exit(EXIT_FAILURE, "%s\n", rte_strerror(rte_errno));}last_lcore_id   = get_last_lcore_id();master_lcore_id = rte_get_master_lcore();worker_args.ring_in  = rx_to_workers;worker_args.ring_out = workers_to_tx;/* Start worker_thread() on all the available slave cores but the last 1 */for (lcore_id = 0; lcore_id <= get_previous_lcore_id(last_lcore_id); lcore_id++)if (rte_lcore_is_enabled(lcore_id) && lcore_id != master_lcore_id)rte_eal_remote_launch(worker_thread, (void *)&worker_args,lcore_id);if (disable_reorder) {/* Start tx_thread() on the last slave core */rte_eal_remote_launch((lcore_function_t *)tx_thread, workers_to_tx,last_lcore_id);} else {send_args.ring_in = workers_to_tx;/* Start send_thread() on the last slave core */rte_eal_remote_launch((lcore_function_t *)send_thread,(void *)&send_args, last_lcore_id);}/* Start rx_thread() on the master core */rx_thread(rx_to_workers);

原文链接:http://t.csdn.cn/jJQZw

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

DPDK——REORDER LIBRARY 排序库相关推荐

  1. DPDK reorder库

    前言:对于有些任务比较重的工作,我们通常都会采用负载均衡的方法用以提高任务效率.然而有些应用报文对于报文顺序要求比较严格,这就要求在报文在经过负载均衡处理后,进一步处理前,重新调整报文的顺序,保证和进 ...

  2. C++library Sort库排序的实现算法(附完整源码)

    C++library Sort库排序的实现算法 C++library Sort库排序的实现算法完整源码(定义,实现,main函数测试) C++library Sort库排序的实现算法完整源码(定义,实 ...

  3. vue.js 拖拽排序_快速轻巧的Vue.js拖放可排序库

    vue.js 拖拽排序 vue-smooth-dnd (vue-smooth-dnd) A fast and lightweight drag&drop, sortable library f ...

  4. DPDK — 扩展私有函数库

    目录 文章目录 目录 DPDK 扩展第三方函数库 扩展一个新的 libfoo 库 添加扩展库的启用配置 实现扩展库 添加扩展库的 Makefile 重新编译安装 DPDK 的目标环境 在自己的 DPD ...

  5. library Interpositioning 库(内插)干预技术

    library Interpositioning 库(内插)干预技术: linux 链接器支持库内插干预技术,它允许使用者截获对共享库函数的调用取而代之执行自己的代码,使用库干预机制,可以追踪感兴趣库 ...

  6. C++函数库的理解:写一个C++程序库(排序库)然后调用自己写的库(附带程序)

    1.自己写一个库:和建工程是一样的,但是建的项目是DLL文件,然后再其工程下添加源文件和头文件,源文件正常写,头文件是有要求的,__declspec(dllexport)的加入,程序在下面是给出的,所 ...

  7. Enterprise Library 企业库 V4.1

    Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...

  8. 最新版 Enterprise Library 企业库 V4.1 中文学习手册

    Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework ...

  9. Xcode9之后打开Object Library组件库

    Xcode9之前 在Xcode9及之前的版本,打开storyboard后,Object library会出现在inspectors底部. Xcode9之后 从Xcode10开始,Object Libr ...

最新文章

  1. rstudio怎么安装ggplot2_如何基于ggplot2构建相关系数矩阵热图
  2. Zabbix如何实现Server和Agent的通信加密
  3. set,存放不重复数据的集合类型
  4. NUnit.Framework在VS2015中如何进行单元测试
  5. linux ftp 查找文件,Linux shell ftp命令根据文件日期下载文件的方法
  6. 机器学习-吴恩达-笔记-5-神经网络学习
  7. Java 工程师成神之路!
  8. 使用Python Seaborn和Pandas进行数据可视化
  9. 如何检查Mac的电池健康状况
  10. 拓端tecdat|R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模拟可视化
  11. oppok3如何刷机_OPPO K3刷机教程?
  12. 丁磊推荐《你的灯亮着吗》为三大管理必读书
  13. ActiveMQ 反序列化漏洞 (CVE-2015-5254)
  14. Windows7电脑自动断网的解决方法
  15. WORD无法复制文件:无法读源文件或磁盘
  16. 自然语言处理NLP中的N-gram模型
  17. compare的数组升序和降序
  18. 云服务器搭建个人站点-之-站点搭建
  19. android 微软桌面,Mirosoft Launcher微软桌面
  20. app开发对于企业及商家来说为什么越来越重要?

热门文章

  1. 测试需要掌握的数据库sql知识(一):基本语句操作
  2. Linux server quick cheat sheet
  3. 《文献管理与信息分析》慕课学习心得
  4. 【阿里云镜像】OpenSUSE全新安装并更改阿里OpenSUSE镜像源
  5. 应届生考编上岸选岗、备考经验
  6. 2021-08-08ctf中的上传upload题目.user.ini绕过后缀黑名单过滤(同文件夹下有php文件突破口)
  7. Seata实战-分布式事务简介及demo上手
  8. 关于android中PendingIntent.getBroadcase的注册广播VSAlarmManager .cancle(PendingIntent)如何区分PendingIntent
  9. Win10《芒果TV》商店版更新v3.2.2:新增对Win10产品专用会员兑换码支持,全新的最具价值用户纪念奖励...
  10. 【论文阅读】Causal Imitative Model for Autonomous Driving