星期日, 9月 23, 2012

socket zero-copy

一直好奇socket能不能在user-mode和kernel-mode之間達成zero-copy[1,2],看起來是可以的。

一開始是看到Linux PACKET_MMAP[3],但,PACKET_MMAP是用來做packet capture的,如果拿來做實作像RTSP的串流協定,得先花很多工夫在實作TCP這類底層的協定,光想就覺得很累。

再試著搜尋一下,也許可以透過splice[4]達成,只是較不直覺。

方法是先建一個檔案﹙也許用fallocate﹚,然後開啟檔案並用mmap對映至行程空間,接下來就是用splice把資料搬至檔案,然後用透過mmap取得的指標操作資料。簡單的表示就是︰
socket fd -> write end pipe -> read end pipe -> file fd


[1] Linux 中的零拷贝技术,第 1 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html

[2] Linux 中的零拷贝技术,第 2 部分, http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html

[3] Raw socket, Packet socket and Zero copy networking in Linux, http://yusufonlinux.blogspot.tw/2010/11/data-link-access-and-zero-copy.html

[4] splice(2) - Linux man page, http://linux.die.net/man/2/splice

09/30更新

文章[5]講的更貼近實務,而文章[6]說明如何調整pipe大小

[5] splice(), http://ogris.de/howtos/splice.html

[6] 深入理解PIPE, http://blog.ddup.us/?p=285