簡體   English   中英

linux -c-盡快從用戶空間通知內核,反之亦然

[英]linux -c - notify the kernel from userspace as fast as possible and vice versa

內容:

Debian 64位。

制作一個我可以發布開源代碼的僅Linux用戶空間網絡堆棧。

一切都准備就緒,但最后一件事。

問題 :

我了解poll / select / epoll並已經大量使用它們,但它們對於我的需求來說太復雜了,往往會增加延遲(幾納秒->太多)。

需要 :

一種簡單的方法,可以從內核通知應用程序要處理的數據包,並通過一個共享的mmap文件作為多環緩沖區來反向處理。 顯然,它不會引起上下文切換。

我為NIC寫了一個自定義驅動程序(並計划為大型聯盟創建其他驅動程序-> 1-10Gb)。

我想要兩個int共享數組和兩個char共享數組。 我已經有多進程和非阻塞設計。

內核的同位體(int和char)->應用程序方向; 另一個適用於應用程序->內核。

但如何在非常時刻通知mmap發生了變化。 我讀過msync可以做到,但是它也很慢。 那是我的問題。 互斥體導致致命的緩慢代碼。 自旋鎖往往會在過載時浪費CPU周期。

不談論繁忙的while(1)循環總是讀取-> cpu周期浪費。

您有什么推薦的嗎 ?

這是我的最后一步。

謝謝

更新:

我想無論如何我將不得不支付設置中斷屏蔽的延遲。 因此,理想情況下,應在所需的等待時間期間按傳入數據包的數量進行攤銷。 我猜突發后的前幾個數據包總是比較慢,因為我顯然不是無限循環的。

最壞的情況是數據包稀疏到來(因此為什么首先要尋求飽和的鏈路性能)。 麥芽汁的情況有時會得到解決。 但不管怎么說,它仍然比股票內核要快。 權衡權衡:)

看來您正在采用在基於RTOS的嵌入式系統中聯網常用的方法。

在Linux中,您不應該編寫自己的網絡堆棧-Linux內核已經具有良好的網絡堆棧。 您只需要實現一個NIC設備驅動程序(在內核中),就可以將所有數據包移交給Linux網絡堆棧進行處理。

任何與Linux網絡相關的組件始終在內核中-您所描述的問題提供了一些解釋,說明為什么這對於合理的性能至關重要。

唯一的例外是可能掛接到iptables機制的用戶空間網絡過濾器(例如,用於防火牆的過濾器),並且這些過濾器在路由通過它們的數據包上會產生更高的延遲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM