<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-86  評論-33  文章-0  trackbacks-0

    我們平時通過網絡發送文件時會用到的兩個系統調用:
    read(file, tmp_buf, len);
    write(socket, tmp_buf, len);

    調用過程示意圖如下:

    在用戶空間調用 read() 讀取文件時發生兩次內存拷貝:

    1. DMA引擎將文件讀取到內核的文件緩沖區
    2. 調用返回用戶空間時將內核的文件緩沖區的數據復制到用戶空間的緩沖區

    接著調用 write() 把數據寫入 socket 時,又發生了兩次內存拷貝:

    1. 將用戶空間的緩沖區的數據復制到內核的 socket 緩沖區
    2. 將內核 socket 緩沖區的數據復制到網絡協議引擎

    也就是說,在整個文件發送的過程中,發生了四次內存拷貝。
    然后,數據讀取到用戶空間后并沒有做過任何加工處理,因此通過網絡發送文件時,根本沒有必要把文件內容復制到用戶空間。

    于是引入了 mmap():
    tmp_buf = mmap(file, len);
    write(socket, tmp_buf, len);

    調用過程示意圖:

    1. 調用 mmap() 時會將文件直接讀取到內核緩沖區,并把內核緩沖區直接共享到用戶空間
    2. 調用 write() 時,直接將內核緩沖區的數據復制到網絡協議引擎

    這樣一來,就少了用戶空間和內核空間之間的內存復制了。
    這種方式會有個問題,當前進程在調用 write() 時,另一個進程把文件清空了,程序就會報出 SIGBUS 類型錯誤。

    Linux Kernel 2.1 引進了 sendfile(),只需要一個系統調用來實現文件發送。
    sendfile(socket, file, len);

    調用過程示意圖:

    1. 調用 sendfile() 時會直接在內核空間把文件讀取到內核的文件緩沖區
    2. 將內核的文件緩沖區的數據復制到內核的 socket 緩沖區中
    3. 將內核的 socket 緩沖區的數據復制到網絡協議引擎

    從性能上看,這種方式只是少了一個系統調用而已,還是做了3次拷貝操作。

    Linux Kernel 2.4 改進了 sendfile(),調用接口沒有變化:
    sendfile(socket, file, len);

    調用過程示意圖:

    1. 調用 sendfile() 時會直接在內核空間把文件讀取到內核的文件緩沖區
    2. 內核的 socket 緩沖區中保存的是當前要發送的數據在內核的文件緩沖區中的位置和偏移量
    3. DMA gather copy 將內核的文件緩沖區的數據復制到網絡協議引擎

    這樣就只剩下2次拷貝啦。

    在許多 http server 中,都引入了 sendfile 的機制,如 nginx、lighttpd 等,它們正是利用 sendfile() 這個特性來實現高性能的文件發送的。

    posted on 2011-12-29 21:32 Derek.Guo 閱讀(702) 評論(0)  編輯  收藏 所屬分類: Linux/Unix
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 久久av无码专区亚洲av桃花岛| 亚洲不卡AV影片在线播放| 国产成A人亚洲精V品无码性色| 乱爱性全过程免费视频| 亚洲高清无码在线观看| 日韩色视频一区二区三区亚洲| 大陆一级毛片免费视频观看i| 亚洲va久久久久| 大学生a级毛片免费观看| 亚洲乱色熟女一区二区三区蜜臀| 无码日韩精品一区二区免费| 亚洲中文字幕久在线| 真实乱视频国产免费观看| 亚洲av成人片在线观看| 亚洲M码 欧洲S码SSS222| 一区二区三区AV高清免费波多 | 成年美女黄网站色大免费视频| 亚洲喷奶水中文字幕电影| 在线视频观看免费视频18| 亚洲国产成人久久精品软件| 国产精品无码免费视频二三区 | 日本红怡院亚洲红怡院最新| 在线a免费观看最新网站| 亚洲最大福利视频| 亚洲AV中文无码乱人伦| a级毛片免费完整视频| 亚洲黄色在线观看视频| 色妞WWW精品免费视频| 色www免费视频| 久久精品7亚洲午夜a| 91嫩草国产在线观看免费| 色屁屁在线观看视频免费| 亚洲AV无码成人网站久久精品大| 日本精品人妻无码免费大全| 色多多www视频在线观看免费| 久久久久久亚洲精品中文字幕| 岛国大片免费在线观看| 国产99久久久国产精免费| 亚洲国产超清无码专区| 日韩精品电影一区亚洲| 亚洲精品视频免费看|