Debian 64位。
制作一个仅限linux的用户空间网络堆栈,我可以发布开源。
一切准备就绪,但最后一件事。
我知道poll
/ select
/ epoll
已经大量使用它们但是它们太复杂了我的需要并且往往会增加延迟(几纳秒 - >太多)
从内核向应用程序通知要处理数据包的简单方法,以及作为多环缓冲区运行的共享mmap
文件的反向。显然不会导致上下文切换。
我为我的NIC编写了一个自定义驱动程序(并计划为大联盟创建其他驱动程序 - > 1-10Gb)。
我想要两个int
的共享数组和两个char
的共享数组。我已经有了多进程和非阻塞设计。
内核的peer(int和char) - > app方向;另一个应用程序 - >内核。
但是,mmap
时刻如何通知已发生变化。我读过一个msync
会这样做,但它也很慢。那是我的问题。
互斥量导致死代码变慢。自旋锁在过载时往往会浪费cpu周期。
不是在谈论忙碌的while(1)
循环总是在阅读 - > cpu循环废物。
你推荐什么?
这是我的最后一步。
由于
我认为无论如何我都要付出设置中断屏蔽的延迟。因此,理想情况下,它应该在所需的延迟期间通过传入数据包的数量进行分摊。突发之后的前几个数据包总是会慢一些,因为我显然没有无限循环。
最糟糕的情况是数据包很稀疏(因此为什么要在第一时间寻求饱和链路性能)。那个worts案件有时会得到满足。但谁在乎呢,它仍然比股票内核更快。权衡取舍:)
答案 0 :(得分:1)
您似乎正在采用基于RTOS的嵌入式系统中的网络通用方法。
在Linux中你不应该编写自己的网络堆栈 - Linux内核已经有了很好的网络堆栈。您只需要实现一个NIC设备驱动程序(在内核中),它将所有数据包移交给Linux网络堆栈进行处理。
任何与Linux网络相关的组件都在内核中 - 您描述的问题提供了一些解释,说明为什么这对于合理的性能至关重要。
唯一的例外是可能挂钩到iptables
机制的用户空间网络过滤器(例如,用于防火墙) - 以及那些通过它们路由的数据包的延迟更高。