一開始是看到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
實驗用的code放在https://github.com/shuyufu/zero-copy
[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
09/30更新
文章[5]講的更貼近實務,而文章[6]說明如何調整pipe大小
[5] splice(), http://ogris.de/howtos/splice.html
[6] 深入理解PIPE, http://blog.ddup.us/?p=285
沒有留言:
張貼留言