linux -c - 尽可能快地从用户空间通知内核,反之亦然

时间:2015-01-28 18:50:50

标签: c linux linux-kernel mmap notify

上下文:

Debian 64位。

制作一个仅限linux的用户空间网络堆栈,我可以发布开源。

一切准备就绪,但最后一件事。

问题:

我知道poll / select / epoll已经大量使用它们但是它们太复杂了我的需要并且往往会增加延迟(几纳秒 - >太多)

需要:

从内核向应用程序通知要处理数据包的简单方法,以及作为多环缓冲区运行的共享mmap文件的反向。显然不会导致上下文切换。

我为我的NIC编写了一个自定义驱动程序(并计划为大联盟创建其他驱动程序 - > 1-10Gb)。

我想要两个int的共享数组和两个char的共享数组。我已经有了多进程和非阻塞设计。

内核的peer(int和char) - > app方向;另一个应用程序 - >内核。

但是,mmap时刻如何通知已发生变化。我读过一个msync会这样做,但它也很慢。那是我的问题。 互斥量导致死代码变慢。自旋锁在过载时往往会浪费cpu周期。

不是在谈论忙碌的while(1)循环总是在阅读 - > cpu循环废物。

你推荐什么?

这是我的最后一步。

由于

更新

我认为无论如何我都要付出设置中断屏蔽的延迟。因此,理想情况下,它应该在所需的延迟期间通过传入数据包的数量进行分摊。突发之后的前几个数据包总是会慢一些,因为我显然没有无限循环。

最糟糕的情况是数据包很稀疏(因此为什么要在第一时间寻求饱和链路性能)。那个worts案件有时会得到满足。但谁在乎呢,它仍然比股票内核更快。权衡取舍:)

1 个答案:

答案 0 :(得分:1)

您似乎正在采用基于RTOS的嵌入式系统中的网络通用方法。

在Linux中你不应该编写自己的网络堆栈 - Linux内核已经有了很好的网络堆栈。您只需要实现一个NIC设备驱动程序(在内核中),它将所有数据包移交给Linux网络堆栈进行处理。

任何与Linux网络相关的组件都在内核中 - 您描述的问题提供了一些解释,说明为什么这对于合理的性能至关重要。

唯一的例外是可能挂钩到iptables机制的用户空间网络过滤器(例如,用于防火墙) - 以及那些通过它们路由的数据包的延迟更高。