我想在兩個進程本地/網絡之間共享/傳輸數據。通用IPC機制 共享內存和消息隊列可用於傳輸數據。但是這些機制 涉及多個副本。如何在POSIX中實現零拷貝機制?
我遇到了零複製機制,這減少了CPU上的複製開銷 。 Linux支持使用sendfile
和splice
。這些API不在POSIX中。 如何僅使用POSIX API實現零拷貝?
我想在兩個進程本地/網絡之間共享/傳輸數據。通用IPC機制 共享內存和消息隊列可用於傳輸數據。但是這些機制 涉及多個副本。如何在POSIX中實現零拷貝機制?
我遇到了零複製機制,這減少了CPU上的複製開銷 。 Linux支持使用sendfile
和splice
。這些API不在POSIX中。 如何僅使用POSIX API實現零拷貝?
如果將共享數據保存在共享內存中,兩個進程之間的共享內存爲零拷貝。否則,必須在某處存在一個副本(例如進出共享內存)。如果其中一個進程將共享數據保存在共享內存中,並且另一個進程只從其中讀取共享內存,則可以將其減少爲一個副本。
sendfile(2)
和vmsplice(2)
的Linux手冊頁沒有提及POSIX的替代方案,所以我懷疑是否有一個。要在只有一個副本的進程之間發送數據,請在它們之間建立一個管道,並使用vmsplice
將頁面放入零管道的管道中。在接收端,我認爲只需使用read(2)
即可將頁面從管道中取出。
在網絡上,零拷貝更難。 Why no zero-copy networking in linux kernel?有一些意見和解答。接收端很難在通常的套接字API之上實現,除非它僅在套接字上的read(2)
上的線程被阻塞時才起作用。否則,它會如何知道進程的虛擬內存中放置數據包的位置?
我一直認爲共享內存不涉及任何複製。你確定嗎? – vlp
相關的東西,可能很有趣:http://yarchive.net/comp/linux/zero-copy.html – gavv