在文章《Linux C语言在用户态实现一个低时延通知(eventfd)+轮询(无锁队列ring)机制的消息队列》中介绍了用户态低时延消息队列的实现,下面我们简单介绍优化步骤。

源码链接:https://github.com/Rtoax/test/tree/master/ipc/fastq


消息队列对软件系统来说至关重要,其是解决线程间异步通信的基石,通常操作系统为我们提供两种消息队列:POSIX和SystemV,这两种消息队列均通过系统调用申请系统资源、进行入队和出队操作,相较于内核态消息队列,实现用户态的消息队列可以减小或消除系统调用、用户态到内核态的数据拷贝等开销,可提高消息队列性能降低时延。

POSIX消息队列基本架构

单纯的从用户态消息队列的角度看,除了能够消除频发收发的系统调用中断,对与buffer与队列之间的数据拷贝以及队列的同步锁问题好像不能得到解决,如下图:

用户态消息队列假想方案

从上图看,单纯的将消息队列从内核态提升至用户态,不会对消息队列本身有太大的优化,那么如何解决上述问题呢?首先是数据拷贝问题。

数据拷贝问题以及解决包括以下几点:

  1. 数据量(包大小),也就是发送的每个数据包的大小,显然逃不出memcpy操作,之类可以通过使用Intel提供的SIMD指令集对数据拷贝进行并行化加速,但是也只能从单条指令拷贝一字节最多转化为256bit(视SIMD指令宽度而定),而不能满足对消息队列的需求(注:协议组现在的实现已经是发送消息内存地址);如何解决呢?一种方法时增加拷贝本身的速率,这在本自然段中已经进行讨论,第二种方法时,可以尽量减小需要拷贝的数据大小,比如说传递内存地址(64位系统8字节)大小的消息体;

在解决了数据拷贝问题后,整体架构如下:

传递指针地址减小拷贝开销

解决了入队出队数据拷贝的问题后,接下来比较关键的地方在于队列如何选取以及如何解决临界区互斥问题。在附录无锁化一节和环形队列一节给出了解决方案(详情原理请参见附录),那么上图的结构可以进一步优化成下图架构:

无锁化环形队列架构

综上,为了解决现存消息队列的问题,分别对队列节点内容、无锁化、队列形式进行了综合优化。对于VOS内部的V1版本消息队列,是建立在POSIX消息队列基础上维护模块化数据结构进行消息的发送和接收,如下图:

对比VOS V1消息队列

VOS V2虽然对V1进行了改进,将队列上浮到用户态实现,但是通过测试结果的对比,性能并没有得到提升,可能的原因有很多,例如队列的选取,基于睡眠的信号量使用等。

对POSIX和SystemV消息队列优化:用户态消息队列相关推荐

  1. 贝尔曼算法队列优化(SPFA)

    最短路问题 想必大家接触图论的时候,结束了DFS和BFS,接下来就是求最短路了吧!在学SPFA之前,你也许已经接触过弗洛伊德算法和迪杰斯特拉算法,甚至还学过贝尔曼算法,然而,不管你以前学过什么,今天的 ...

  2. 135 最大子序和(单调队列优化)

    1. 问题描述: 输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大.注意: 子序列的长度至少是 1. 输入格式 第一行输入两个整数 n,m.第二行输 ...

  3. Linux用户态与内核态通信的几种方式(待完善)

    文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...

  4. linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...

    序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)­--用户态接收数据包 ...

  5. Linux C语言在用户态实现一个低时延通知(eventfd)+轮询(无锁队列ring)机制的消息队列

    目录 fastq.c fastq.h test-0.c test-1.c https://github.com/Rtoax/test/tree/master/ipc/github/fastq fast ...

  6. 用户请求队列化_分布式消息队列选型分析

    高并发架构是成为架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石.本文将从队列本质.技术选型两个方面,给大家整理下个人心得,希望能对大家有所 ...

  7. android推送如何推送不在线设备,推送系统从0到1(四):消息如何到达用户设备...

    本篇主要为大家揭秘推送消息是如何传输的,如何到达用户设备上的,在不同的设备上会如何展示. 在上一篇文章中,我们可以知道在建立推送任务的过程中,需要考虑带有自滤功能的用户池构建.筛选有效用户.设置推送内 ...

  8. 何为消息队列,为何使用消息队列,有什么消息队列插件

    一.什么叫消息队列 MQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步 ...

  9. 消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点?

    消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点? 面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区 ...

最新文章

  1. java byte xml_Java XMLInputSource.setByteStream方法代码示例
  2. 40 万年薪招应届生?OPPO 狂揽芯片人才,应届生招聘行情究竟如何?
  3. SQL字符串处理--按分割符拆分字符串T-SQL to Split a varchar into Words
  4. SQL Error: 957, SQLState: 42000 ORA-00957: duplicate column name
  5. [学习笔记]标记永久化
  6. “小罐茶大师作”20亿元销售额难掩虚假宣传本质
  7. Makefile之嵌套执行(9)
  8. JS实现表单多文件上传样式美化支持选中文件后删除相关项
  9. 谷歌浏览器chrome设置特定网页使用Https(ssl)访问
  10. Python---列表与元组
  11. 使用R语言中的spgwr包进行GWR模型的相关运算
  12. SQL Server 2008 R2 卸载教程
  13. 电线行业中UL单支电子线成本计算
  14. java集合比较大小_arraylist 怎么比较元素大小?
  15. 2016年11月30日 angularJS input=file 绑定change事件
  16. 太棒了!CSS颜色基本样式
  17. 超详细快速入门JavaScript详解(一)
  18. 机器学习领域定会顶刊
  19. cad画图要求计算机最低配置,AutoCAD电脑配置要求:AutoCAD LT 2022 系统要求
  20. 易助手工具箱iapp源码

热门文章

  1. 12bit的图像如何向8bit转化_干货分享 | 如何鉴别Western Blot图像的真实性?
  2. 【node内存泄漏耗尽之解决方法】
  3. Java 监测某个方法的执行时间
  4. koa2-cors应答跨域请求实现
  5. 车牌识别算法介绍与实践(转)
  6. thinkphp框架的优缺点
  7. C#中的for,while和do-while循环语句
  8. Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
  9. windows server 2008 r2 jar包后台启动_Sharing-Proxy部署amp;启动(4.0.0-RC3)
  10. efcore 批量_【EF Core】Entity Framework Core 批处理语句