2010-05-03 88 views
3

我正在開發用於替代TCP/IP的並行計算的主動消息協議。我的目標是減少數據包的延遲。由於環境是一個局域網,我可以用更簡單的協議替換TCP/IP來減少數據包延遲。我不寫任何設備驅動程序,我只是試圖用簡單的東西替換TCP/IP堆棧。現在我想避免將數據包的數據從用戶空間複製到內核空間,反之亦然。我聽說過mmap()。這是做這件事的最好方法嗎?如果是的話,如果你可以給出一些例子的鏈接,那將是很好的。我是一個Linux新手,我真的很感謝您的幫助。謝謝...避免在用戶和內核空間之間複製數據,反之亦然

感謝, 巴拉

+2

如果你是「linux新手」,在嘗試用「更簡單」的東西替換TCP/IP之前,我會考慮三次。即使在局域網上,也不要以爲你可以不用校驗和重傳等功能。 – 2010-05-03 21:23:45

+0

你..但我正在學習Linux,並希望做這個項目。歡迎您的建議... – bala1486 2010-05-03 22:40:25

回答

3

您應該使用UDP,這已經是相當快的。至少W32/SQLSlammer足夠快速地傳遍整個互聯網。

關於您的第一個問題,請參閱(vm)splicetee Linux系統調用。

從手冊頁:

三個系統調用剪接(2), vmsplice(2),和T(2)),提供具有完全控制 用戶空間程序在任意內核緩衝區, 在內核中使用 對管道使用的相同類型的緩衝區使用 。在概述中,這些系統調用 執行以下任務:

剪接(2)

moves data from the buffer to an arbitrary file descriptor, or vice 

反之亦然,或從一個緩衝到另一個。

三通(2)

"copies" the data from one buffer to another. 

vmsplice(2)

"copies" data from user space into the buffer. 

雖然我們談論抄襲,實際 副本一般都是可以避免的。 內核通過將 管道緩衝區作爲一組 引用計數指針指向 內核內存頁來實現此目的。內核通過 創造新的指針(用於輸出 緩存)指的是網頁,並 增加引用計數爲 頁面創建 的一個緩衝區頁「拷貝」:只有指針被複制, 不是網頁緩衝區。

+0

謝謝您的建議。實際上,我需要繞過TCP/IP堆棧來絕對減少網絡延遲。這是我的論文實驗。基本上我需要一個在內核和用戶空間之間共享的緩衝區。你有什麼想法做這個?謝謝.... – bala1486 2010-05-04 01:46:01

+0

-1使用UDP ...今天沒有理由了 – Artyom 2010-05-04 04:30:39

+0

你在開玩笑嗎?也許你應該運行一些基準。你是否理解基於數據包和基於流的區別?你知道,速度是妥協,UDP的速度/延遲好處是很好理解。 – ypnos 2010-05-04 10:44:55

0

因爲環境是一個局域網,我可以用更簡單的協議取代TCP/IP來降低數據包延遲

一般情況下,即使是在LAN UDP數據包往往會被丟失,還他們會如果客戶端 沒有足夠的時間消耗它,則會丟失...

不,不要用別的東西(UDP)替換TCP。因爲如果你確實需要可靠的傳輸,TCP將是最快的(因爲連接到確認和重傳的所有東西都是在內核空間中完成的)。

一般來說,在正常情況下有使用TCP無延遲的缺點(當然不要忘了TCP_NODELAY選項)

關於共享內存。實際上,您分配的所有內存都是使用mmap創建的。所以當內核從驅動程序創建數據包時,內核需要以任何方式複製它。

如果你正在談論減少複製它通常是爲文件/套接字和 sendfile()使用,確實可以防止複製內核和用戶之間的數據。但我認爲 你不需要發送文件。

+0

UDP數據包根本不會在LAN中丟失。而OS的接收緩衝區實際上非常大。在對其他人進行投票前,你應該檢查你的事實。 – ypnos 2010-05-04 10:44:14

+0

@ynpos - 是的,他們是(經驗)。此外,緩衝區很大的事實並不妨礙任何形式的服務器由於某種原因而使CPU失去活性,並且緩衝區可能會變滿。所以,是的,UDP數據包不會頻繁丟失,但會發生這種情況。你不能繼續這個。 – Artyom 2010-05-04 11:53:04