• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            不帶緩存的I/O和標(biāo)準(zhǔn)I/O

            不帶緩存的I/O和標(biāo)準(zhǔn)I/O

            首先說說不帶緩存的I
            /O,UNIX的文件I/O read、write是不帶緩存的。不帶緩存是指每個read、write都調(diào)用內(nèi)核的一個系統(tǒng)調(diào)用,它們是POSIX.1的組成部分。
            二者的原型為:
            ssize_t read( 
            int fd, void* buf, size_t nbytes );    // 若成功返回讀到的字節(jié)數(shù)
            ssize_t write( int fd, const void* buf, size_t nbytes );    // 若成功返回已寫的字節(jié)數(shù)

            注意,上面的buf不是指read、write帶緩存,而是當(dāng)read時用來存放讀出的字節(jié),write時存放待寫的字節(jié)。對于read,nbytes表示每次最多讀的字節(jié)數(shù)。但這個塊的大小將影響I
            /O的效率,其值和具體系統(tǒng)有關(guān)。

            補(bǔ)充一下,不帶緩存的I
            /O對文件描述符操作,下面帶緩存的I/O是針對流的。

            標(biāo)準(zhǔn)I
            /O庫就是帶緩存的I/O,它由ANSI C標(biāo)準(zhǔn)說明。當(dāng)然,標(biāo)準(zhǔn)I/O最終都會調(diào)用上面的I/O例程。標(biāo)準(zhǔn)I/O庫代替用戶處理很多細(xì)節(jié),比如緩存分配、以優(yōu)化長度執(zhí)行I/O等。

            標(biāo)準(zhǔn)I
            /O提供緩存的目的就是減少調(diào)用read和write的次數(shù),它對每個I/O流自動進(jìn)行緩存管理(標(biāo)準(zhǔn)I/O函數(shù)通常調(diào)用malloc來分配緩存)。它提供了三種類型的緩存:

            1) 全緩存。當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才執(zhí)行I/O操作。磁盤上的文件通常是全緩存的。

            2) 行緩存。當(dāng)輸入輸出遇到新行符或緩存滿時,才由標(biāo)準(zhǔn)I/O庫執(zhí)行實(shí)際I/O操作。stdin、stdout通常是行緩存的。

            3) 無緩存。相當(dāng)于read、write了。stderr通常是無緩存的,因?yàn)樗仨毐M快輸出。

            一般而言,由系統(tǒng)選擇緩存的長度,并自動分配。標(biāo)準(zhǔn)I
            /O庫在關(guān)閉流的時候自動釋放緩存。

            在標(biāo)準(zhǔn)I
            /O庫中,一個效率不高的不足之處是需要復(fù)制的數(shù)據(jù)量。當(dāng)每次使用行函數(shù)fgets和fputs時,通常需要復(fù)制兩次數(shù)據(jù):一次是在內(nèi)核和標(biāo)準(zhǔn)I/O緩存之間(當(dāng)調(diào)用read和write時),第二次是在標(biāo)準(zhǔn)I/O緩存(通常系統(tǒng)分配和管理)和用戶程序中的行緩存(fgets的參數(shù)就需要一個用戶行緩存指針)之間。

            不管上面講的到底懂沒懂,記住一點(diǎn):

            使用標(biāo)準(zhǔn)I
            /O例程的一個優(yōu)點(diǎn)是無需考慮緩存及最佳I/O長度的選擇,并且它并不比直接調(diào)用read、write慢多少。

            帶緩存的文件操作是標(biāo)準(zhǔn)C 庫的實(shí)現(xiàn),第一次調(diào)用帶緩存的文件操作函數(shù)時標(biāo)準(zhǔn)庫會自動分配內(nèi)存并且讀出一段固定大小的內(nèi)容存儲在緩存中。所以以后每次的讀寫操作并不是針對硬盤上的文件直接進(jìn)行的,而是針對內(nèi)存中的緩存的。何時從硬盤中讀取文件或者向硬盤中寫入文件有標(biāo)準(zhǔn)庫的機(jī)制控制。不帶緩存的文件操作通常都是系統(tǒng)提供的系統(tǒng)調(diào)用,更加低級,直接從硬盤中讀取和寫入文件,由于IO瓶頸的原因,速度并不如意,而且原子操作需要程序員自己保證,但使用得當(dāng)?shù)脑捫什⒉徊睢?br />另外標(biāo)準(zhǔn)庫中的帶緩存文件IO 是調(diào)用系統(tǒng)提供的不帶緩存IO實(shí)現(xiàn)的。

            “術(shù)語不帶緩沖指的是每個read和write都調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。所有的磁盤I
            /O都要經(jīng)過內(nèi)核的塊緩沖(也稱內(nèi)核的緩沖區(qū)高速緩存),唯一例外的是對原始磁盤設(shè)備的I/O。既然read或write的數(shù)據(jù)都要被內(nèi)核緩沖,那么術(shù)語“不帶緩沖的I/O“指的是在用戶的進(jìn)程中對這兩個函數(shù)不會自動緩沖,每次read或write就要進(jìn)行一次系統(tǒng)調(diào)用。“

            --------摘自<unix環(huán)境編程>

            posted on 2012-05-10 16:53 天下 閱讀(969) 評論(0)  編輯 收藏 引用 所屬分類: Win32Linux編程

            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久夜色精品国产网站| 亚洲第一永久AV网站久久精品男人的天堂AV | 色偷偷888欧美精品久久久| 久久精品国产亚洲网站| 国产成人久久精品麻豆一区| 久久影视综合亚洲| 久久丫精品国产亚洲av| 国内精品欧美久久精品| 久久久久精品国产亚洲AV无码| 无遮挡粉嫩小泬久久久久久久| 久久99热只有频精品8| 久久久久国产精品麻豆AR影院| 久久人人爽人人爽人人片AV麻烦| 国产精品久久久久久吹潮| 久久免费观看视频| 久久香蕉综合色一综合色88| 久久久久国产成人精品亚洲午夜| 亚洲综合熟女久久久30p| 久久伊人精品青青草原高清| 综合人妻久久一区二区精品| 青青青国产精品国产精品久久久久 | 人妻无码αv中文字幕久久琪琪布| 久久国产亚洲高清观看| 久久夜色撩人精品国产| 国产一久久香蕉国产线看观看| 伊人热热久久原色播放www| 久久青草国产精品一区| 亚洲精品无码久久久影院相关影片| 国产A级毛片久久久精品毛片| 亚洲第一极品精品无码久久| 久久精品国产99国产精品| 韩国三级大全久久网站| 午夜精品久久久久久中宇| 亚洲欧美另类日本久久国产真实乱对白| 国产精品久久久久无码av| 欧美黑人激情性久久| 久久精品国产亚洲AV影院| 久久久这里有精品| 亚洲国产日韩欧美久久| 久久天天躁狠狠躁夜夜av浪潮 | 人妻无码中文久久久久专区|