佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > linux下零拷貝技術(shù)介紹

linux下零拷貝技術(shù)介紹

熱門標簽:解決方案 服務器配置 硅谷的囚徒呼叫中心 電話機器人搭建 家政服務網(wǎng)絡 百度競價點擊價格的計算公式 外呼系統(tǒng) 美團

傳統(tǒng)的數(shù)據(jù)傳輸方式

很長一段時間內(nèi),數(shù)據(jù)拷貝的認識僅僅停留在應用程序?qū)?,實際上隱藏在背后的數(shù)據(jù)拷貝行為比想象的要多的多。在傳輸數(shù)據(jù)的時候,用戶應用程序需要分配一塊合適大小的緩沖區(qū)來存放需要傳輸?shù)臄?shù)據(jù)。用戶從應用程序中讀取數(shù)據(jù),然后發(fā)送出去,只需要兩個系統(tǒng)調(diào)用read,write即可完成數(shù)據(jù)傳輸工作,應用程序并不知道這個數(shù)據(jù)傳輸過程中操作系統(tǒng)進行了多少次拷貝操作。某些情況下,這些數(shù)據(jù)拷貝操作會極大的降低數(shù)據(jù)傳輸?shù)男阅堋?NIC,Network Interface Card )

傳統(tǒng)的數(shù)據(jù)拷貝方式,如下圖:

上線文切換,如圖:

涉及的步驟:

(1)read()調(diào)用引發(fā)從用戶模式到內(nèi)核模式的上下文切換(第一次切換),在內(nèi)部,發(fā)出sys_read(或者同等內(nèi)容)從設備中讀取數(shù)據(jù),直接內(nèi)存讀取(direct memory access,DMA)執(zhí)行了拷貝(第一次拷貝),它從磁盤中讀取內(nèi)容,然后將他們存儲到一個內(nèi)核地址空間緩沖區(qū)中;

(2)數(shù)據(jù)從讀緩沖區(qū)拷貝到用戶緩沖區(qū)(第二次拷貝),read()調(diào)用返回。該調(diào)用返回引發(fā)內(nèi)核模式到用戶模式的切換(第二次切換)?,F(xiàn)在數(shù)據(jù)被存儲在用戶空間緩沖區(qū)中;

(3) send()套接字調(diào)用引發(fā)用戶模式到內(nèi)核模式的上下文切換(第三次切換),數(shù)據(jù)再次被放置到內(nèi)核地址空間緩沖區(qū)中(第三次拷貝)。這次放置的緩沖區(qū)與目標套接字關(guān)聯(lián);

(4) send()系統(tǒng)調(diào)用返回,從內(nèi)核模式切換到用戶模式(第四次切換),DMA引擎將數(shù)據(jù)從內(nèi)核緩沖區(qū)傳輸?shù)絽f(xié)議引擎(第四次拷貝)。

DMA允許外圍設備和貯存之間直接傳輸IO數(shù)據(jù),DMA依賴于系統(tǒng)。每一種體系結(jié)構(gòu)DMA傳輸不同,編程接口也不同。數(shù)據(jù)傳輸可以以兩種方式觸發(fā):一種所軟件請求數(shù)據(jù),另一種所硬件異步傳輸。以read為例,它即采用第一種方式,其步驟如下:

(1) 進程調(diào)用read時,驅(qū)動程序分配一個DMA緩沖區(qū),隨后指示硬件傳送它的數(shù)據(jù),進程進入睡眠;

(2) 硬件將數(shù)據(jù)寫入DMA緩沖區(qū)并在完成時產(chǎn)生一個中斷;

(3) 中斷處理程序獲取輸入數(shù)據(jù),應答中斷,最后喚醒進程,可以讀取數(shù)據(jù)了。

由此可見,在傳統(tǒng)的數(shù)據(jù)傳輸中,系統(tǒng)方面總共進行了4次數(shù)據(jù)拷貝,4次上線文切換,這些都會對服務器性能造成很大影響。

零拷貝概述

簡單的說,零拷貝是一種避免CPU將數(shù)據(jù)從一快存儲拷貝到另外一塊存儲的技術(shù)。零拷貝技術(shù)的目標:

避免數(shù)據(jù)拷貝

#避免操作系統(tǒng)內(nèi)核緩沖區(qū)之間進行數(shù)據(jù)拷貝操作;

#避免操作系統(tǒng)內(nèi)核和用戶應用程序地址空間之間進行數(shù)據(jù)拷貝操作;

#用戶應用程序可以避免操作系統(tǒng)直接訪問硬件存儲;

#數(shù)據(jù)傳輸盡量讓DMA來處理。

多種操作結(jié)合在一起

#避免不必要的系統(tǒng)調(diào)用和上下文切換;

#需要拷貝的數(shù)據(jù)可以先緩存起來;

#對數(shù)據(jù)進行的處理盡量讓硬件來做。

零拷貝的實現(xiàn)方式分類

直接IO

主要是通過減少操作系統(tǒng)內(nèi)核緩沖區(qū)和應用程序地址空間數(shù)據(jù)拷貝次數(shù),降低對文件讀取和寫入時帶來的CPU使用和帶寬的開銷。對于某些頁數(shù)的應用程序,比如說自緩沖應用程序來說,會是一個比較好的選擇。如果要傳輸?shù)臄?shù)據(jù)量大,使用直接IO的方式進行數(shù)據(jù)傳輸,而不需要操作系統(tǒng)內(nèi)核地址空間拷貝數(shù)據(jù)的參與,這將會提高性能。

直接IO并不是所有的情況下都有效。設置直接IO的開銷非常大,而且不能利用緩存IO的優(yōu)勢。直接IO的讀操作會造成磁盤的同步讀,執(zhí)行進程需要在很長的時間才能執(zhí)行完;而寫操作會導致應用程序關(guān)閉緩慢。應用程序使用直接IO進行數(shù)據(jù)傳輸通常和異步IO結(jié)合使用。

linux內(nèi)核已經(jīng)為快設備執(zhí)行直接IO提供了支持,應用程序直接訪問文件而不經(jīng)過操作系統(tǒng)頁高速緩沖存儲器的時候,打開文件(open() syscall)指定O_DIRECT標示符。

總之,這種數(shù)據(jù)傳輸方式,應用程序直接訪問硬件存儲,操作系統(tǒng)內(nèi)核只是輔助數(shù)據(jù)傳輸;它一般用于操作系統(tǒng)不需要對數(shù)據(jù)進行處理的情況,數(shù)據(jù)可以再應用程序地址空間的緩沖區(qū)和磁盤之間進行傳輸,而不需要linux操作系統(tǒng)內(nèi)核提供頁緩存支持。

針對數(shù)據(jù)傳輸不需要經(jīng)過應用程序地址空間的零拷貝技術(shù)

數(shù)據(jù)傳輸過程中,避免數(shù)據(jù)在系統(tǒng)內(nèi)核地址空間的緩沖區(qū)和用戶應用程序地址空間的緩沖區(qū)進行拷貝。有時候,應用程序在數(shù)據(jù)傳輸?shù)倪^程中不需要對數(shù)據(jù)進行訪問,將數(shù)據(jù)從linux的頁緩存拷貝到用戶進程的緩沖區(qū)就可以完全避免,傳輸?shù)臄?shù)據(jù)在頁緩沖中就可以處理。在某些情況下,這種零拷貝技術(shù)能獲得很好的性能。linux下提供類似的系統(tǒng)調(diào)用主要有mmap(),sendfile(),splice().

使用mmap替代read,可以減少CPU拷貝次數(shù)。當應用程序調(diào)用mmap()之后,數(shù)據(jù)通過DMA拷貝拷貝到內(nèi)核緩沖區(qū),應用程序和操作系統(tǒng)共享這個緩沖區(qū)。這樣,操作系統(tǒng)內(nèi)核和應用程序存儲空間不再需要進行任何的數(shù)據(jù)拷貝操作。當進行write()系統(tǒng)調(diào)用時,數(shù)據(jù)由內(nèi)核緩沖區(qū)拷貝到socket緩沖區(qū),再拷貝到協(xié)議引擎中。

這種也比較適用于傳送的數(shù)據(jù)不需要經(jīng)過操作系統(tǒng)內(nèi)核的處理或者不需要經(jīng)過程序的處理直接傳輸?shù)那闆r。結(jié)合socket也能使用mmap,不過只能在RAW的情況下使用。對于傳統(tǒng)的C/S網(wǎng)絡游戲結(jié)構(gòu)來說,使用的意義不大。

對應用程序地址空間和內(nèi)核空間的數(shù)據(jù)傳輸進行優(yōu)化的零拷貝技術(shù)

對數(shù)據(jù)在linux頁緩存和用戶進程緩沖區(qū)之間的傳輸進行優(yōu)化。該零拷貝技術(shù)側(cè)重于靈活的處理數(shù)據(jù)在用戶進程中的緩沖區(qū)和操作系統(tǒng)的頁緩沖區(qū)之間的拷貝操作。這種方式延續(xù)了傳統(tǒng)的通信方式,但是更加靈活。linux中該方法主要利用寫時復制技術(shù)。

寫時復制是計算機編程中常見的一種優(yōu)化策略,基本思想是這樣的:如果多個應用程序需要同時訪問一塊數(shù)據(jù),那么可以為這些應用程序分配指向這塊數(shù)據(jù)的指針,在每個應用程序看來,他們都擁有這塊數(shù)據(jù)的一份拷貝,當其中一個應用程序需要對自己的這份數(shù)據(jù)進行修改時,就需要將數(shù)據(jù)真正的拷貝到應用程序的地址空間去。如果應用程序永遠不會對這塊數(shù)據(jù)進行修改,那么就永遠不需要將數(shù)據(jù)拷貝到應用程序的地址空間去。在stl中string的實現(xiàn)類似這種策略。



參考

linux 中的零拷貝技術(shù) 第1部分

http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html

linux 中的零拷貝技術(shù) 第2部分

http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html

linux系統(tǒng)內(nèi)核空間與用戶空間通信的實現(xiàn)與分析

http://www.ibm.com/developerworks/cn/linux/l-netlink/

從linux內(nèi)核訪問用戶空間內(nèi)存

http://www.ibm.com/developerworks/cn/linux/l-kernel-memory-access/

linux中直接IO機制的介紹

http://www.ibm.com/developerworks/cn/linux/l-cn-directio/

通過零拷貝實現(xiàn)有效的數(shù)據(jù)傳輸

http://www.ibm.com/developerworks/cn/java/j-zerocopy/

標簽:臨沂 韶關(guān) 邢臺 烏蘭察布 防城港 北海 撫州 南昌

巨人網(wǎng)絡通訊聲明:本文標題《linux下零拷貝技術(shù)介紹》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    靖远县| 融水| 云梦县| 夏邑县| 金寨县| 靖州| 平定县| 临湘市| 玛纳斯县| 石城县| 大同县| 搜索| 锡林浩特市| 榕江县| 康马县| 栾城县| 辉南县| 临泉县| 赞皇县| 定远县| 双鸭山市| 玉门市| 滕州市| 育儿| 剑河县| 边坝县| 尤溪县| 汝州市| 田阳县| 苗栗市| 永丰县| 广丰县| 九台市| 江阴市| 开封县| 沾益县| 泸西县| 武定县| 漠河县| 渭南市| 呼玛县|