码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • dpdk中QSBR具体实现


    目录

    • 概述
    • 初始化
    • 注册与注销
    • 上线与下线
    • 等待静默
    • 附录
    • 微信公共号
    • 参考

    概述

    dpdk19.01提供了qsbr模式的rcu库,其具体实现在lib/librte_rcu目录中。
    librte_rcu是无锁线程安全的,这个库提供了读者报告静默状态的能力,让写者知道读者是否进入过静默状态。

    dpdk中QSBR具体实现是通过一个struct rte_rcu_qsbr_cnt变量qs,将多个线程共享的内存管理起来。总体思路是通过比较线程的静默期版本号与qs全局版本号的大小,判断是否所有线程进入过本次静默期。

    使用librte_rcu进行内存释放的线程的基本步骤如下:

    • 解除内存的引用
    • 调用rte_rcu_qsbr_start()函数将全局版本号加1,触发所有读线程报告静默状态
    • 调用rte_rcu_qsbr_check()遍历检查所有读者线程,确保都进入过本次静默期
    • 释放内存

    初始化

    初始化时,会用到一些通过的工具宏,定义在在dpdk-master/lib/librte_eal/common/include/rte_common.h中。如下:

    1. #define RTE_CACHE_LINE_SIZE 64
    2. #define RTE_ALIGN_MUL_CEIL(v, mul) \
    3. ((v + 64 - 1)/64) * 64 // (64地板除 + 1)*64
    4. #define RTE_ALIGN_FLOOR(val, 64) \
    5. val & (~(64 - 1)) // 64的地板除
    6. #define RTE_ALIGN_CEIL(val, 64) \
    7. RTE_ALIGN_FLOOR(val + 64 - 1, 64) // 64的地板除 + 1
    8. #define RTE_ALIGN(val, align) RTE_ALIGN_CEIL(val, align) // 64的地板除 + 1

    在dpdk-master\lib\librte_rcu\rte_rcu_qsbr.h中,定义了初始化时用到的一些函数与宏。

    1. /* 工作线程计数器 */
    2. struct rte_rcu_qsbr_cnt {
    3. uint64_t cnt; // 静默态计数器,0表示下线。使用64bits,防止计数溢出
    4. uint32_t lock_cnt; // counter锁, 用于CONFIG_RTE_LIBRTE_RCU_DEBUG
    5. } __rte_cache_aligned;
    6. #define __RTE_QSBR_THRID_ARRAY_ELM_SIZE (sizeof(uint64_t) * 8) // 数组元素大小为64 B
    7. #define __RTE_QSBR_THRID_ARRAY_SIZE(max_threads)\
    8. RTE_ALIGN(RTE_ALIGN_MUL_CEIL(max_threads, 64) >> 3, RTE_CACHE_LINE_SIZE) // 计算得到线程数组的大小
    9. /*
    10. * (struct rte_rcu_qsbr_cnt *)(v + 1): 获得 v中 rte_rcu_qsbr_cnt 的地址偏移,此时指针p变为 struct rte_rcu_qsbr_cnt *类型
    11. * + v->max_threads: 得到 v中thread id_array的偏移,
    12. * + i
    13. */
    14. #define __RTE_QSBR_THRID_ARRAY_ELM(v, i) // 获得线程数组的第 i 个
    15. ((uint6
  • 相关阅读:
    以太网 以太网地址(MAC地址)
    【JUC】一文弄懂@Async的使用与原理
    Arduino开发实例-旋转编码器RGB-LED调光
    天鹰340亿(AquilaChat2-34B-16K)本地部署的解决方案
    linux之mail命令发邮件
    MATLAB算法实战应用案例精讲-【数模应用】数据中台模型建设
    Windows 无法访问wsl ubuntu 中 docker 的端口
    【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信
    Unity之C#脚本学习笔记
    解决vue-servlet数据传输时出现的跨域问题
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/127869362
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号