什么是零拷貝?
- 快速理解
快速理解
要想理解零拷貝,首先要了解操作系統的IO流程,因為有內核態和用戶態的區別,為了保證安全性和緩存,普通的讀寫流程如下:
(對于Java程序而言,還會多了一個堆外內存和堆內存之間的copy)
如圖:
整體的流程我們分析一下:
1.用戶read發起系統調用,由用戶態進入內核態,通過DMA技術將磁盤中的數據copy到內核緩沖區中;
2.當DMA完成工作后,會發起一個中斷,通知CPU數據拷貝完成,然后CPU再將內核態中的數據copy到用戶態中;
3.由內核喚醒對應線程,同時將用戶態的數據返回給該線程空間;
4.用戶態線程進行業務處理;
5.當服務器對請求進行響應的時候,會發起系統調用,由內核將用戶態的數據copy到內核態中;
6.復制完畢以后,再由網絡適配器通過DMA技術將內核態緩沖區中的數據copy到網卡中,完成以后,內核態會返回到用戶態;
7.最后由網卡將數據發送出去。
在這個整個過程中,如果不考慮用戶態的內存拷貝和物理設備到驅動的數據拷貝,我們會發現,這其中會涉及4次數據拷貝。同時也會涉及到4次進程上下文的切換。所謂的零拷貝,作用就是通過各種方式,在特殊情況下,減少數據拷貝的次數 / 減少CPU參與數據拷貝的次數。
常見的零拷貝方式有mmap、sendfile、dma、directl/O等等。