C 在数据包到达时立即通知用户模式

C 在数据包到达时立即通知用户模式,c,linux,performance,memory,latency,C,Linux,Performance,Memory,Latency,(这适用于低延迟系统) 假设我有一些将接收到的UDP数据包传输到共享内存区域的代码,那么我如何通知应用程序(在用户模式下)现在是读取共享内存的时候了?我不希望应用程序不断轮询,耗尽cpu周期 是否可以在网络堆栈中插入一些代码,这些代码可以在写入共享内存后立即调用我的应用程序代码 EDIT我添加了一个C标记,但是应用程序将使用C++从一个Unix进程向另一个进程发送事件信号的一种方法是使用POSIX信号量。您将使用初始化并打开一个可以跨进程使用的命名信号量 看 在同一主机上的进程之间发送事件信号的

(这适用于低延迟系统)

假设我有一些将接收到的UDP数据包传输到共享内存区域的代码,那么我如何通知应用程序(在用户模式下)现在是读取共享内存的时候了?我不希望应用程序不断轮询,耗尽cpu周期

是否可以在网络堆栈中插入一些代码,这些代码可以在写入共享内存后立即调用我的应用程序代码


EDIT我添加了一个C标记,但是应用程序将使用C++

从一个Unix进程向另一个进程发送事件信号的一种方法是使用POSIX信号量。您将使用初始化并打开一个可以跨进程使用的命名信号量


在同一主机上的进程之间发送事件信号的最低延迟方法是查找要更改的(共享)内存位置。。。这避免了系统调用。您明确表示不希望应用程序轮询,但是在多核系统上运行的多线程应用程序中,如果您真正关心延迟,这可能不是一个坏的权衡。

除非您计划使用实时操作系统,否则没有“立即”协议。CPU资源以几毫秒为单位可用,通常用户线程需要一些时间才能理解它是否可以继续

综上所述,任何形式的IPC都可以:本地套接字、信号、管道、事件描述符等。性能上的实际差异将是悲惨的


此外,使用共享内存可能会导致维护/调试过程中出现不必要的复杂情况,但这是设计者的选择。

您是以用户模式(例如,通过网络驱动程序)还是以内核模式接收数据包?如果是前者,您应该能够简单地使用普通(阻塞)套接字。多一点体系结构上下文会有帮助。@JohnJ我想如果我选择内核模式,我必须编写自己的网络驱动程序吗?什么是最低延迟?我想写我自己的驱动程序可以做到这一点?数据包的大小是固定的,所以编写驱动程序可能不像听起来那么困难-尤其是我没有TCP连接到setup?这两个进程之间的关系是什么?他们是父母/孩子,还是别的什么?@ValeriAtamaniouk没有特别的关系。我收到了UDP数据包,我想尽快将它们发送到我的应用程序(通过共享内存),所以我想问,通知我的应用程序共享内存现在已填充了新的数据包数据的最快方式是什么。@user997112如果您有一些标准的网络硬件,通常很难打败它,内核IP堆栈,为了表现。它们已经进行了大量优化。一般来说,在用户空间中做事情和使用常用习惯用法(信号、信号量、pthreads等)更容易。就像你写的那样,一定要避免投票。