(这适用于低延迟系统)
假设我有一些代码将收到的UDP数据包传输到共享内存区域,那么如何通知应用程序(在用户模式下)现在是时候读取共享内存了?我不希望应用程序不断轮询吃掉cpu周期。
是否可以在网络堆栈中插入一些代码,这些代码可以在写入共享内存后立即调用我的应用程序代码?
编辑我添加了一个C标签,但该应用程序将使用C ++
答案 0 :(得分:0)
将事件从一个Unix进程发送到另一个进程的一种方法是使用POSIX信号量。您可以使用sem_open初始化并打开一个可以跨进程使用的命名信号量。
请参阅How can I get multiple calls to sem_open working in C?。
在同一主机上的进程之间发出事件信号的最低延迟方法是spin-wait寻找(共享)内存位置以进行更改...这可以避免系统调用。您明确表示您不希望应用程序轮询,但是在多核系统上运行的多线程应用程序中,如果您真的关心延迟,那么这可能不是一个糟糕的权衡。
答案 1 :(得分:0)
除非您打算使用实时操作系统,否则没有“即时”协议。 CPU资源的可用量为几毫秒,通常需要一些时间让您的用户线程了解它可以继续。
考虑到上述所有情况,任何形式的IPC都可以:本地套接字,信号,管道,事件描述符等。实际的性能差异将是悲惨的。
此外,使用共享内存可能会导致维护/调试时出现无法解决的问题,但这是设计人员的选择。