零複製
零復制(英語:Zero-copy;也譯零拷貝)技術是指電腦執行操作時,CPU不需要先將數據從某處主記憶體複製到另一個特定區域。這種技術通常用於通過網絡傳輸檔案時節省CPU周期和主記憶體頻寬。[1]
原理
編輯作業系統某些組件(例如驅動程式、檔案系統和網絡協定棧)若採用零複製技術,則能極大地增強了特定應用程式的效能,並更有效地利用系統資源。通過使CPU得以完成其他而非將機器中的數據複製到另一處的任務,效能也得到了增強。另外,零複製操作減少了在用戶空間與內核空間之間切換模式的次數。
舉例來說,如果要讀取一個檔案並通過網絡傳送它,傳統方式下每個讀/寫呼叫周期都需要2次額外的複製數據(1次從內核複製到用戶空間、1次從用戶複製到內核空間)和4次上下文交換,而數據的複製都需要依靠CPU。而使用零複製技術通過使用主記憶體對映檔案mmap和一個寫呼叫周期傳送該檔案,可將上下文交換減少到每個寫呼叫2次,並避免之前2次額外的複製。sendfile呼叫完成同樣的操作可將上下文交換減少到每個sendfile呼叫2次,並且同樣不需要CPU複製數據(在用戶空間和內核空間之間)。
零複製協定對於網絡鏈路容量接近或超過CPU處理能力的高速網絡尤為重要。在這種網絡下,CPU幾乎將所有時間都花在複製要傳送的數據上,因此將成為使通訊速率低於鏈路容量的瓶頸。
硬件實現
編輯最早的實現為IBM OS/360,其中一個程式可以指示通道子系統從一個檔案或裝置複製數據塊到另一處,無需先轉移數據。
實現零複製的軟件通常依靠基於直接記憶體存取(DMA)的複製,以及通過主記憶體管理單元(MMU)的主記憶體對映。這些功能需要特定硬件的支援,並通常涉及到特定記憶體的對齊。
一種較新的方式為使用異構系統架構(HSA),便於CPU和GPU以及其他處理器傳遞指標。這需要CPU和GPU使用統一地址空間。[2][3]
程式訪問
編輯數種作業系統都通過特定API支援檔案的零複製。
Linux內核通過各個系統呼叫支援零複製,例如sys/socket.h的sendfile、sendfile64以及splice。它們部分在POSIX中指定,因此也存在於BSD內核或IBM AIX中,部分則是Linux內核API中獨有。
Microsoft Windows通過TransmitFile API支援零複製。
Java輸入流可以通過java.nio.channels支援零複製。FileChannel的transferTo()方法也可以支援零複製(如果底層作業系統支援)。[4]
遠端直接主記憶體訪問(RDMA)協定深度依賴零複製技術。
參見
編輯參考資料
編輯- ^ Zero Copy I: User-Mode Perspective in Linux Journal - January 1, 2003. [2017-01-10]. (原始內容存檔於2021-02-25).
- ^ The programmer's guide to the APU galaxy (PDF). [2017-01-10]. (原始內容存檔 (PDF)於2013-07-22).
- ^ AMD Outlines HSA Roadmap: Unified Memory for CPU/GPU. 2012-02-02 [2017-01-10]. (原始內容存檔於2013-07-22).
- ^ Efficient data transfer through zero copy by Sathish K. Palaniappan and Pramod B. Nagaraja.. [2017-01-10]. (原始內容存檔於2018-08-23).