零復制(英語:Zero-copy;也譯零拷貝)技術是指計算機執行操作時,CPU不需要先將數據從某處內存複製到另一個特定區域。這種技術通常用於通過網絡傳輸文件時節省CPU周期和內存帶寬[1]

原理

操作系統某些組件(例如驅動程序文件系統網絡協議棧)若採用零複製技術,則能極大地增強了特定應用程序的性能,並更有效地利用系統資源。通過使CPU得以完成其他而非將機器中的數據複製到另一處的任務,性能也得到了增強。另外,零複製操作減少了在用戶空間與內核空間之間切換模式的次數。

舉例來說,如果要讀取一個文件並通過網絡發送它,傳統方式下每個讀/寫周期都需要複製兩次數據和切換兩次上下文,而數據的複製都需要依靠CPU。通過零複製技術完成相同的操作,上下文切換減少到兩次,並且不需要CPU複製數據。

零複製協議對於網絡鏈路容量接近或超過CPU處理能力的高速網絡尤為重要。在這種網絡下,CPU幾乎將所有時間都花在複製要傳送的數據上,因此將成為使通信速率低於鏈路容量的瓶頸。

硬件實現

最早的實現為IBM OS/360英語OS/360,其中一個程序可以指示通道子系統英語Channel I/O從一個文件或設備複製數據塊到另一處,無需先轉移數據。

實現零複製的軟件通常依靠基於直接記憶體存取(DMA)的複製,以及通過內存管理單元(MMU)的內存映射。這些功能需要特定硬件的支持,並通常涉及到特定存儲器的對齊。

一種較新的方式為使用異構系統架構英語Heterogeneous System Architecture(HSA),便於CPUGPU以及其他處理器傳遞指針。這需要CPU和GPU使用統一地址空間[2][3]

程序訪問

數種操作系統都通過特定API支持文件的零複製。

Linux內核通過各個系統調用支持零複製,例如sys/socket.h的sendfile、sendfile64以及splice英語Splice (system call)。它們部分在POSIX中指定,因此也存在於BSD內核或IBM AIX中,部分則是Linux內核API英語Linux kernel API中獨有。

Microsoft Windows通過TransmitFile API支持零複製。

Java輸入流可以通過java.nio.channels支持零複製。FileChannel的transferTo()方法也可以支持零複製(如果底層操作系統支持)。[4]

遠程直接內存訪問(RDMA)協議深度依賴零複製技術。

參見

參考資料

  1. ^ Zero Copy I: User-Mode Perspective in Linux Journal - January 1, 2003. [2017-01-10]. (原始內容存檔於2021-02-25). 
  2. ^ The programmer's guide to the APU galaxy (PDF). [2017-01-10]. (原始內容存檔 (PDF)於2013-07-22). 
  3. ^ AMD Outlines HSA Roadmap: Unified Memory for CPU/GPU. 2012-02-02 [2017-01-10]. (原始內容存檔於2013-07-22). 
  4. ^ Efficient data transfer through zero copy by Sathish K. Palaniappan and Pramod B. Nagaraja.. [2017-01-10]. (原始內容存檔於2018-08-23).