傳統的 linux 作業系統的標準 i/o 介面是基於資料拷貝操作的,即 i/o 操作會導致資料在作業系統核心位址空間的緩衝區和應用程式位址空間定義的緩衝區之間進行傳輸。這樣做最大的好處是可以減少磁碟 i/o 的操作,因為如果所請求的資料已經存放在作業系統的高速緩衝儲存器中,那麼就不需要再進行實際的物理磁碟 i/o 操作。但是資料傳輸過程中的資料拷貝操作卻導致了極大的 cpu 開銷,限制了作業系統有效進行資料傳輸操作的能力。
零拷貝( zero-copy )技術可以有效地改善資料傳輸的效能,在核心驅動程式(比如網路堆疊或者磁碟儲存驅動程式)處理 i/o 資料的時候,零拷貝技術可以在某種程度上減少甚至完全避免不必要 cpu 資料拷貝操作。
零拷貝就是一種避免 cpu 將資料從一塊儲存拷貝到另外一塊儲存的技術。針對作業系統中的裝置驅動程式、檔案系統以及網路協議堆疊而出現的各種零拷貝技術極大地提公升了特定應用程式的效能,並且使得這些應用程式可以更加有效地利用系統資源。這種效能的提公升就是通過在資料拷貝進行的同時,允許 cpu 執行其他的任務來實現的。
零拷貝技術可以減少資料拷貝和共享匯流排操作的次數,消除傳輸資料在儲存器之間不必要的中間拷貝次數,從而有效地提高資料傳輸效率。而且,零拷貝技術減少了使用者應用程式位址空間和作業系統核心位址空間之間因為上下文切換而帶來的開銷。進行大量的資料拷貝操作其實是一件簡單的任務,從作業系統的角度來說,如果 cpu 一直被占用著去執行這項簡單的任務,那麼這將會是很浪費資源的;如果有其他比較簡單的系統部件可以代勞這件事情,從而使得 cpu 解脫出來可以做別的事情,那麼系統資源的利用則會更加有效。綜上所述,零拷貝技術的目標可以概括如下:
避免資料拷貝
①避免作業系統核心緩衝區之間進行資料拷貝操作。
②避免作業系統核心和使用者應用程式位址空間這兩者之間進行資料拷貝操作。
③使用者應用程式可以避開作業系統直接訪問硬體儲存。
④資料傳輸盡量讓 dma 來做。
將多種操作結合在一起
①避免不必要的系統呼叫和上下文切換。
②需要拷貝的資料可以先被快取起來。
③對資料進行處理盡量讓硬體來做。
1.1中斷
1.2dma
2.1中斷方式的流程圖如下:
①使用者程序發起資料讀取請求
②系統排程為該程序分配cpu
③cpu向io控制器(ide,scsi)傳送io請求
④使用者程序等待io完成,讓出cpu
⑤系統排程cpu執行其他任務
⑥資料寫入至io控制器的緩衝暫存器
⑦緩衝暫存器滿了向cpu發出中斷訊號
⑧cpu讀取資料至記憶體
2.2缺點:中斷次數取決於緩衝暫存器的大小3.1 dma方式的流程圖如下:
①使用者程序發起資料讀取請求
②系統排程為該程序分配cpu
③cpu向dma傳送io請求
④使用者程序等待io完成,讓出cpu
⑤系統排程cpu執行其他任務
⑥資料寫入至io控制器的緩衝暫存器
⑦dma不斷獲取緩衝暫存器中的資料(需要cpu時鐘)
⑧傳輸至記憶體(需要cpu時鐘)
⑨所需的全部資料獲取完畢後向cpu發出中斷訊號
3.2優點:減少cpu中斷次數,不用cpu拷貝資料4.1下面展示了 傳統方式讀取資料後並通過網路傳送 所發生的資料拷貝:
①乙個read系統呼叫後,dma執行了一次資料拷貝,從磁碟到核心空間
②read結束後,發生第二次資料拷貝,由cpu將資料從核心空間拷貝至使用者空間
③send系統呼叫,cpu發生第三次資料拷貝,由cpu將資料從使用者空間拷貝至核心空間(socket緩衝區)
④send系統呼叫結束後,dma執行第四次資料拷貝,將資料從核心拷貝至協議引擎
⑤另外,這四個過程中,每個過程都發生一次上下文切換
4.2記憶體緩衝資料,主要是為了提高效能,核心可以預讀部分資料,當所需資料小於記憶體緩衝區大小時,將極大的提高效能。
4.3零拷貝是為了消除這個過程中冗餘的拷貝filechannel.transferto(long position, long count, writablebytechannel target)//將資料從檔案通道傳輸到了給定的可寫位元組通道
①dma從拷貝至核心緩衝區
②cpu將資料從核心緩衝區拷貝至核心空間(socket緩衝區)
③dma將資料從核心拷貝至協議引擎
④這三個過程中共發生2次上下文切換,分別為發起讀取檔案和傳送資料
5.2以上過程發生了三次資料拷貝,其中有一次為cpu完成
5.3linux核心2.4以後,socket緩衝區做了調整,dma帶收集功能,如下圖:
①dma從拷貝至核心緩衝區
②將資料的位置和長度的資訊的描述符增加至核心空間(socket緩衝區)
③dma將資料從核心拷貝至協議引擎
6.1資料不會複製到使用者空間,只在核心空間,與sendfile類似,但是應用程式可以直接操作該記憶體。
**:
淺拷貝,深拷貝的理解
淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...
淺拷貝 深拷貝的再次理解
以前對淺拷貝的認識不夠,認為只是對指標的賦值,沒有真實的開闢空間。看了一篇部落格後感覺自己的認識還不夠,其實淺拷貝還會導致記憶體洩漏!對,你沒看錯,確實是 記憶體洩漏!最後會把部落格鏈結貼出來。我們以前對淺拷貝深拷貝的理解是這樣的 淺拷貝是對指標的拷貝,拷貝以後兩個指標指向的是同一塊記憶體空間,深拷...
深拷貝和淺拷貝的理解
為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...