【发布时间】: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