日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高级I/O(七)--readv和writev函数

發(fā)布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高级I/O(七)--readv和writev函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

From: http://blog.chinaunix.net/uid-26822401-id-3158225.html

readv和write函數(shù)讓我們在單個函數(shù)調(diào)用里從多個不連續(xù)的緩沖里讀入或?qū)懗觥_@些操作被稱為分散讀(scatter read)和集合寫(gather write)。



  • #include <sys/uio.h>

  • ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);

  • ssize_t writev(int filedes, const struct iovec *iov, int iovcnt);

  • 兩者都返回讀或?qū)懙淖止?jié)數(shù),錯誤返回-1。


  • 兩個函數(shù)的第二個參數(shù)都是一個iovec結(jié)構(gòu)體數(shù)組的指針:
    struct iovec {
    ? void *iov_base;? /* starting address of buffer */
    ? size_t iov_len;? /* size of buffer */
    };


    iov數(shù)組里的元素數(shù)量由iovcnt指定。它限制于IOV_MAX(第二章)。下圖顯示了這兩個函數(shù)的參數(shù)和iovec結(jié)構(gòu)體的關(guān)系:




    writev函數(shù)把緩沖的輸出數(shù)據(jù)按順序集合到一起:iov[0]、iov[1]、到iov[iovcnt-1];writev返回輸出字節(jié)的總數(shù)量,它應(yīng)該等于所有緩沖長度的和。


    readv函數(shù)把數(shù)據(jù)按順序分散到緩沖里,問題在處理下一個緩沖時填滿第一個。readv返回被讀的字節(jié)總數(shù)。如果沒有更多數(shù)據(jù)和碰到文件末尾時返回0的計數(shù)。


    這兩個函數(shù)起源于4.2BSD,后來加入到SVR4。這兩個函數(shù)被SUS的XSI擴展包含。


    盡管SUS定義了緩沖地址為一個void *,然而許多未跟上標(biāo)準(zhǔn)的實現(xiàn)仍使用char *代替。


    在20.8節(jié)里,函數(shù)_db_writeidx里,我們需要連續(xù)地寫兩個緩沖到一個文件。第二個要輸出的緩沖是一個傳給調(diào)用者的參數(shù),而第一個緩沖是我們創(chuàng)建的,包含第二個緩沖的長度和文件里其它信息的一個文件偏移量。我們可以有三種方法做這個。


    1、調(diào)用write兩次,一個緩沖一次;


    2、分配一個我們自己的緩沖,它足夠大來包含兩個緩沖,然后把兩者拷貝到新緩沖。我們?nèi)缓鬄檫@個新緩沖調(diào)用write一次。


    3、調(diào)用writev來輸出兩個緩沖。


    我們在20.8節(jié)使用的解決方案是使用writev,但是把它跟其它兩種方案比較是有指導(dǎo)性的。


    下表顯示了提到的三種方法的結(jié)果。?


    writev和其它技術(shù)的時間結(jié)果比較
    操作Linux (Intel x86)Mac OS X (PowerPC)
    用戶系統(tǒng)時鐘用戶系統(tǒng)時鐘
    兩次write1.293.157.391.6017.4019.84
    緩沖拷貝,然后一次write1.031.986.471.1011.0912.54
    一次writev0.70?2.726.410.8613.5814.72


    我們測量的測試程序輸出一個100字節(jié)的頭,接著一個200字節(jié)的數(shù)據(jù)。這被完成1048576次,產(chǎn)生一個300M的文件。測試程序有三個分離的條件--上表中每個測量的技術(shù)是一個。我們使用times(8.16節(jié))來得到用戶CUP時間,系統(tǒng)CPU系統(tǒng)和掛鐘時間,在write前后。所有三個時間以秒顯示。

    正如我們意料的,系統(tǒng)時間當(dāng)我們調(diào)用兩次write時增加,對比于一次的write或writev。這和3.9節(jié)的測量結(jié)果對應(yīng)。


    接著,注意CPU時間的總和(用戶加上系統(tǒng)),當(dāng)我們執(zhí)行緩沖拷貝接著單個write比單個writev調(diào)用要少。對于單個write,我們在用戶層拷貝緩沖到一個分段運輸?shù)木彌_,然后在我們調(diào)用write時內(nèi)核會把數(shù)據(jù)拷貝到它內(nèi)部的緩沖。對于writev,我們應(yīng)該做更少的拷貝,因為內(nèi)核只需要直接把數(shù)據(jù)拷貝到它的分段運輸緩沖里。然而,為如此少的數(shù)據(jù)使用writev的固定花費,比所得要大。當(dāng)我們需要拷貝的數(shù)據(jù)量增加時,在我們程序里拷貝緩沖會便耗時,而writev替代地將更具吸引力。


    小必不要被上表中Linux相對于Mac的性能影響太多。這兩個電腦非常不同:它們有不同的處理器架構(gòu)、不同的RAM量、不同速度的磁盤。為了公平比較兩個操作系統(tǒng),我們需要使用相同的硬件。


    總而言之,我們應(yīng)該總是嘗試使用所需的最少次數(shù)的系統(tǒng)調(diào)用來完成工作。如果我們寫少量數(shù)據(jù),那么我們將發(fā)現(xiàn)自己拷貝數(shù)據(jù)和使用單個write而不是使用writev會更不耗時。然而,我們可能發(fā)現(xiàn),性能的好處比不上需要管理我們自己的分段運輸緩沖的復(fù)雜性代價。


    總結(jié)

    以上是生活随笔為你收集整理的高级I/O(七)--readv和writev函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。