一千萬個為什麽

搜索

避免在用戶和內核空間之間復制數據,反之亦然


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

謝謝, 巴拉

最佳答案

你應該使用UDP,這已經非常快了。至少它足夠快,W32/SQLSlammer可以在整個互聯網上傳播。

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

從聯機幫助頁:

三個系統調用splice(2),   vmsplice(2)和tee(2)),提供   完全控制的用戶空間程序   在任意內核緩沖區上,   在內核中使用實現   使用的緩沖區類型相同   換管子概述,這些系統   調用執行以下任務:

     

剪接(2)

 將數據從緩沖區移動到任意文件描述符,或者反之
</代碼> 
     

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

     

三通(2)

 將數據從一個緩沖區“復制”到另一個緩沖區。
</代碼> 
     

vmsplice(2)

 將用戶空間中的數據“復制”到緩沖區中。
</代碼> 
     

雖然我們談論復制,實際   通常避免復制。該   內核通過實現一個來完成   管道緩沖區作為一組   引用計數指向頁面的指針   內核內存。內核創建   “復制”緩沖區中的頁面   創建新指針(用於輸出   緩沖區)指的是頁面,和   增加參考計數   頁面:只復制指針,   不是緩沖區的頁面。

轉載註明原文: 避免在用戶和內核空間之間復制數據,反之亦然

猜你喜歡