我正在使用udp套接字在實時環境中。我目前使用的標準套接字函數sendto()需要相當多的時間。我讀過可以使用零拷貝,如果我理解的很好,可以避免通過從用戶/內核環境複製文件來增加額外的時間。但是,我看到sendfile()只允許從一個文件描述符複製到另一個文件描述符。我看不到如何使用它發送UDP數據包,在我的情況下這是一個緩衝區。所以我的問題是:使用sendfile代替發送到零拷貝udp套接字
- 它甚至可以使用sendfile()發送UDP數據包?
- 如果是這樣,這樣做的正確方法是什麼?
編輯
我工作的實時平臺,在這裏我有幾個操作加上在插座上的發送。所有這些不應該超過1ms。我嘗試過三款機器,第一款擁有3.4GHz的4核心,2.3GHz的8核心和1.4GHz的4核心。第一個發送一個720字節的數據包需要不到1μs。而另外兩個則在6到9μs之間。我正在使用Linux低延遲內核,並取消了所有CPU電源管理功能,因此所有CPU都處於最高頻率。
我注意到,如果sendto()所花的時間大於6μs,平臺根本無法工作。另一個精度,我有幾個線程並行運行。所以也許只是在sendto()尚未完成時CPU正在處理其他線程。我想知道這是可能的,在進程中停止sendto()做其他事情。
這就是爲什麼我試圖找到其他解決方案來做優化的地方,我認爲使用sendfile()會避免額外的時間來保存。
在Linux(以及Unixy世界的其餘部分)中,什麼是*「套接字」?它是一個*描述符*。僅僅因爲一些文檔說「文件」描述符並不意味着它必須是一個實際的「文件」。否則整個'sendfile'調用幾乎是無用的,如果它可以做的只是複製文件。 –
@Someprogrammerdude。謝謝。我不太熟悉描述符/指針/之間的區別......在我的情況下,我有一個包含我想要發送的數據包的緩衝區。如果我明白了,它不會被視爲與描述符相同,所以它不可能直接傳遞給sendfile();對 ? – Spider
不,'sendfile'只在描述符之間複製。如果源是內存緩衝區,則不能使用它。然後你必須使用'sendto'。 –