• <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和標準I/O

            不帶緩存的I/O和標準I/O

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

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

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

            標準I
            /O庫就是帶緩存的I/O,它由ANSI C標準說明。當然,標準I/O最終都會調用上面的I/O例程。標準I/O庫代替用戶處理很多細節,比如緩存分配、以優化長度執行I/O等。

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

            1) 全緩存。當填滿標準I/O緩存后才執行I/O操作。磁盤上的文件通常是全緩存的。

            2) 行緩存。當輸入輸出遇到新行符或緩存滿時,才由標準I/O庫執行實際I/O操作。stdin、stdout通常是行緩存的。

            3) 無緩存。相當于read、write了。stderr通常是無緩存的,因為它必須盡快輸出。

            一般而言,由系統選擇緩存的長度,并自動分配。標準I
            /O庫在關閉流的時候自動釋放緩存。

            在標準I
            /O庫中,一個效率不高的不足之處是需要復制的數據量。當每次使用行函數fgets和fputs時,通常需要復制兩次數據:一次是在內核和標準I/O緩存之間(當調用read和write時),第二次是在標準I/O緩存(通常系統分配和管理)和用戶程序中的行緩存(fgets的參數就需要一個用戶行緩存指針)之間。

            不管上面講的到底懂沒懂,記住一點:

            使用標準I
            /O例程的一個優點是無需考慮緩存及最佳I/O長度的選擇,并且它并不比直接調用read、write慢多少。

            帶緩存的文件操作是標準C 庫的實現,第一次調用帶緩存的文件操作函數時標準庫會自動分配內存并且讀出一段固定大小的內容存儲在緩存中。所以以后每次的讀寫操作并不是針對硬盤上的文件直接進行的,而是針對內存中的緩存的。何時從硬盤中讀取文件或者向硬盤中寫入文件有標準庫的機制控制。不帶緩存的文件操作通常都是系統提供的系統調用,更加低級,直接從硬盤中讀取和寫入文件,由于IO瓶頸的原因,速度并不如意,而且原子操作需要程序員自己保證,但使用得當的話效率并不差。
            另外標準庫中的帶緩存文件IO 是調用系統提供的不帶緩存IO實現的。

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

            --------摘自<unix環境編程>

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

            <2012年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久久久久A亚洲欧洲AV冫| 69SEX久久精品国产麻豆| 国产精品美女久久久网AV| 国内精品久久久久久麻豆| 思思久久99热只有频精品66| 婷婷综合久久中文字幕蜜桃三电影 | 精品久久8x国产免费观看| 四虎国产精品免费久久5151| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久久一本精品99久久精品88| 精品国产一区二区三区久久久狼 | 国产99久久精品一区二区| 四虎亚洲国产成人久久精品| 久久精品亚洲精品国产色婷| 久久婷婷五月综合97色直播| 国产情侣久久久久aⅴ免费| 日韩十八禁一区二区久久| 久久91精品国产91久久小草 | 亚洲va中文字幕无码久久不卡| 国内精品久久久久久99蜜桃| 婷婷久久综合九色综合九七| 青青国产成人久久91网| 久久精品黄AA片一区二区三区 | 久久无码人妻一区二区三区午夜| 久久e热在这里只有国产中文精品99 | 久久国产精品一国产精品金尊| 亚洲色欲久久久久综合网 | 91视频国产91久久久| 亚洲AV日韩AV天堂久久| 精品久久久久久久国产潘金莲| 国产精品嫩草影院久久| 久久97精品久久久久久久不卡| 久久久一本精品99久久精品66 | 一本大道久久东京热无码AV| 国产精品久久久久乳精品爆| 久久综合久久久| 色综合合久久天天综合绕视看 | 中文字幕精品久久久久人妻| 欧美久久一级内射wwwwww.| 久久噜噜久久久精品66| 久久一区二区免费播放|