為什麼要用Zero Copy機制

2022-03-15 15:57:33 字數 837 閱讀 2066

考慮這樣一種常用的情形:你需要將靜態內容(類似、檔案)展示給使用者。那麼這個情形就意味著你需要先將靜態內容從磁碟中拷貝出來放到乙個記憶體buf中,然後將這個buf通過socket傳輸給使用者,進而使用者或者靜態內容的展示。這看起來再正常不過了,但是實際上這是很低效的流程,我們把上面的這種情形抽象成下面的過程:

1)  read(file, tmp_buf, len);

2)  write(socket, tmp_buf, len);

首先呼叫read將靜態內容,這裡假設為檔案a,讀取到tmp_buf, 然後呼叫write將tmp_buf寫入到socket中,

在這個過程中檔案a的經歷了4次copy的過程:

1)  首先,呼叫read時,檔案a拷貝到了kernel模式;

2)  之後,cpu控制將kernel模式資料copy到user模式下;

3)  呼叫write時,先將user模式下的內容copy到kernel模式下的socket的buffer中;

4)  最後將kernel模式下的socket buffer的資料copy到網絡卡裝置中傳送;

從上面的過程可以看出,資料白白從kernel模式到user模式走了一圈,浪費了2次copy(第一次,從kernel模式拷貝到user模式;第二次從user模式再拷貝回kernel模式,即上面4次過程的第2和3步驟。)。而且上面的過程中kernel和user模式的上下文的切換也是4次。

幸運的是,你可以用一種叫做zero-copy的技術來去掉這些無謂的copy。應用程式用zero-copy來請求kernel直接把disk的data傳輸給socket,而不是通過應用程式傳輸。zero-copy大大提高了應用程式的效能,並且減少了kernel和user模式上下文的切換。

為什麼要用 enable shared from

樓主 hma if you think you can,you can.panrainbow 憂鬱淡藍 於 tue nov 9 11 48 38 2010 提到 引入enable shared from this的原因是可以實現返回值為指向該類本身的 shared ptr,為什麼以this為拷貝構造...

為什麼要用補碼

在探求為何機器要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念.對於乙個數,計算機要使用一定的編碼方式進行儲存.原碼,反碼,補碼是機器儲存乙個具體數字的編碼方式.原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 原 1000 ...

為什麼要用AndroidStudio

原因一 android studio是基於intellij idea開發的,所以android studio繼承了intellij idea的所有功能.原因二 android studio是谷歌開發的,專門用於android開發的編輯器,換句話說是親兒子,谷歌會把所有好吃的好用的先給親兒子.原因三 ...