【问题标题】:Linux - c - ipc notification without context switch and low overhead?Linux - c - ipc 通知没有上下文切换和低开销?
【发布时间】:2015-02-25 21:28:29
【问题描述】:

上下文:

Linux 64 位。

我非常精通共享内存、不同的 IPC 机制。

目前,我正在寻找可以在用户空间中使用的东西来通知两个轮询进程之间的变化,以节省 CPU 周期。

我已经知道futexes、eventfd、慢速signals 甚至char devices。

但我担心所涉及的延迟。

问题:

我想要一种非常轻量级的方式在用户空间中的两个进程之间进行通知,尽可能不进行上下文切换,并且延迟非常低(最大或大约 µs 数量级)。

没有主要限制:没有竞争条件预防,不需要锁定,但是没有请忙等待(我已经管理了高峰期和慢节奏期,并且忙着等待从长远来看会严重欺骗任何优化)。

如果 mmap 可以在没有 msync() 的情况下通知更改...我不会问。

你的工具箱里有什么想法吗?

谢谢

想法:

刚问完,可能会有一个想法:将文件放入 tmpfs 并对其进行轮询...我预计延迟会非常低,但我不太确定..

【问题讨论】:

  • 轮询会不会与您想要的相反(即忙于等待)?你不会比select 更有效吗?考虑到 shm 功能的手册页明确告诉您 tmpfs 是 shmfs 的东西,这不是类似于获得 shmget 和您已经提到的东西吗?
  • 我想念它。当然,进程间通信的任何机制都涉及上下文切换。一个进程(关联的上下文)发送的消息必须在另一个进程(关联的上下文)中接收才能完全影响 IPC。
  • @JohnBollinger:我认为 OP 指的是模式切换:userland-kernel-userland,他想避免这种情况。
  • 不忙于等待是不可能的。您无法告诉位于内核中的调度程序在不与内核通信并引发上下文切换的情况下使另一个进程可运行。因此,您只能找到一种具有最低延迟的机制 - 如果您在其中一个实时调度程序下运行您的进程,您可能会获得更低的延迟。
  • > 非常低的延迟(最大或大约 µs 数量级) @。不要期望像 Linux 这样的通用操作系统会出现这种情况。

标签: c linux ipc notify low-latency


【解决方案1】:

解决办法是彻底改变逻辑;忘记民意调查和所有这些大惊小怪。

繁忙的轮询将是没有 ops 组装操作的方式。

【讨论】:

    【解决方案2】:

    我终于走 eventfd 路线了;

    我希望在未修改的 gnu/linux 中无法完成。

    为了满足名义动物的胃口:上下文切换在我提出的问题中很重要。由于没有它就无法完成,因此没有其他方法可以按照我想要的方式完成工作。

    所以我会继续使用 eventfd 和其他传统工具。

    【讨论】:

    • 你的意思是,你决定不能这样做。只是为了咯咯笑,我写了一个命名管道测试程序对。在使用单字符消息在 Intel Core i5-4200U 处理器(廉价的 HP 笔记本电脑)上运行的 Ubuntu 3.13.0-46-generic x86_64 内核上,这会产生大约 3.6µs 的更改通知延迟,中值。 (测量了几十万次往返,即通知对,其中一半在 7.2 µs 以下)。 这已经在您指定的微秒数量级内。因此,您的主张因此被证明是错误的。或者,你只是在拖钓?
    • @NominalAnimal:“拖钓”?严重地 ?哪种说法?
    • 您的问题陈述是 “我想要一种非常轻量级的方式来在用户空间中的两个进程之间进行通知,如果可能的话无需上下文切换,并且延迟非常低(最大微秒数量级或关于)”。即使是微不足道的测试代码似乎也能满足延迟要求,正如原始问题的其他评论者所提到的,上下文切换是不可避免的。相反,你放弃了,用一个笼统的概括,仿佛这是一个事实:“我希望在未修改的 gnu/linux 中无法完成”。这种谎言让我很恼火。如果不是拖钓,那是什么?只是撒谎?
    • 不。你很鄙视那些试图搞事情的人,那是不为你服务的。上下文是不可避免的。正如我提到的所有我尝试过的事情,你应该知道我知道上下文切换的事情。我想要的对于 linux 内核是不可能的,除非我编写了一个我不想要的内核模块,因为我想要用户空间。所以,请不要再讽刺了。我的要求无法满足。顺便说一句,你应该尝试放松。刺激不会让任何人去任何地方。
    • 你误会了。因为您不想轮询,所以您必须有一个阻塞系统调用来等待更改通知。当更改到达时,内核必须唤醒阻塞的系统调用。换句话说,你自己的规则,而不是内核设计或其他任何东西,至少需要一个上下文切换——不管你使用哪个操作系统或内核或内核模块;这不是特定于 Linux 的。上下文切换无关紧要。让我恼火的是你声称这是不可能的,而实际上并非如此。即使是普通内核上的一个简单的命名管道测试程序也会产生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2010-09-23
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2016-06-18
    相关资源
    最近更新 更多