什麼是零複製
零複製(Zero-Copy)就是一種避免 CPU 將資料從一塊儲存複製到另外一塊儲存的技術,是指將資料直接從磁碟檔案複製到網路卡裝置中,而不需要經由應用程式之手。
零複製的好處
避免作業系統核心緩衝區之間進行資料複製操作
避免作業系統核心和使用者應用程式地址空間這兩者之間進行資料複製操作
使用者應用程式可以避開作業系統直接訪問硬體儲存
避免不必要的系統呼叫和上下文切換
資料傳輸儘量讓 DMA 來做,需要複製的資料可以先被快取起來,對資料進行處理儘量讓硬體來做
Linux中零複製實現
Linux 中零複製技術實現方式通常有 2 種:
mmap() + write()
sendfile()
零複製的實現原理
mmap() + write():
mmap() 系統呼叫函式會直接把核心緩衝區裡的資料對映到使用者空間,這樣,作業系統核心與使用者空間就不需要再進行任何的資料複製操作。具體過程:
應用程序呼叫了 mmap() 後,DMA 會把磁碟的資料複製到核心的緩衝區裡,接著應用程序跟作業系統核心共享這個緩衝區
應用程序再呼叫 write(),作業系統直接將核心緩衝區的資料複製到 socket 緩衝區中,這一切都發生在核心態,由 CPU 來搬運資料
最後,把核心的 socket 緩衝區裡的資料,複製到網路卡的緩衝區裡,這個過程是由 DMA 搬運的
sendfile():
在 Linux 核心版本 2.1 中,提供了一個專門傳送檔案的系統呼叫 sendfile()。具體過程:
發起 sendfile() 系統呼叫,作業系統由使用者態空間切換到核心態空間
透過 DMA 引擎將資料從磁碟複製到核心態空間的輸入的 socket 緩衝區中
將資料從核心空間複製到與之關聯的 socket 緩衝區
將 socket 緩衝區的資料複製到協議引擎中
sendfile() 系統呼叫結束,作業系統由使用者態空間切換到核心態空間