国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux之緩沖區(qū)的理解

這篇具有很好參考價(jià)值的文章主要介紹了Linux之緩沖區(qū)的理解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、問題引入

二、緩沖區(qū)

1、什么是緩沖區(qū)

2、刷新策略

3、緩沖區(qū)由誰提供

4、重看問題

三、緩沖區(qū)的簡(jiǎn)單實(shí)現(xiàn)


一、問題引入

我們先來看看下面的代碼:我們使用了C語言接口和系統(tǒng)調(diào)用接口來進(jìn)行文件操作。在代碼的最后,我們還使用fork函數(shù)創(chuàng)建了一個(gè)子進(jìn)程。

Linux之緩沖區(qū)的理解,Linux,linux,運(yùn)維,服務(wù)器

?代碼運(yùn)行結(jié)果如下:

Linux之緩沖區(qū)的理解,Linux,linux,運(yùn)維,服務(wù)器

結(jié)果沒有什么問題啊?結(jié)果很正確。但是我們?cè)賮砜纯聪旅娴牟僮鳎何覀儗?duì)其進(jìn)行輸出重定向。然后,查看log.txt的代碼。

Linux之緩沖區(qū)的理解,Linux,linux,運(yùn)維,服務(wù)器

我們驚奇地發(fā)現(xiàn),文件里面的內(nèi)容和打印到顯示器的內(nèi)容是不一樣的!我們?cè)僮屑?xì)觀察,發(fā)現(xiàn),C語言的函數(shù)都打印了兩次,而系統(tǒng)調(diào)用接口只打印了一次。為什么呢??

這種現(xiàn)象就和fork函數(shù)以及我們下面要講的緩沖區(qū)有關(guān)了。

二、緩沖區(qū)

1、什么是緩沖區(qū)

緩沖區(qū)的本質(zhì)就是一段內(nèi)存空間。

我們知道,內(nèi)存的速度比磁盤的速度快了幾個(gè)數(shù)量級(jí)。所以數(shù)據(jù)如果直接從內(nèi)存寫到磁盤,那么訪問外設(shè)效率比較低,那就太消耗時(shí)間了。所以緩沖區(qū)的意義就是通過減少與外設(shè)的IO次數(shù),來節(jié)省進(jìn)程進(jìn)行數(shù)據(jù)IO的時(shí)間。

所以C語言中就提供了緩沖區(qū)。而有了緩沖區(qū)的存在,可以提高整機(jī)效率,并提高用戶的響應(yīng)速度。

2、刷新策略

~ 立即刷新。
~ 行刷新(行緩沖)。(常見的對(duì)顯示器進(jìn)行數(shù)據(jù)刷新)以\n為標(biāo)志
~ 滿刷新(全緩沖)。(常見的對(duì)磁盤文件寫入數(shù)據(jù))

特殊情況:1、用戶強(qiáng)制刷新(fflush)? ? ? ? ? 2、進(jìn)程退出

注:所有的設(shè)備,永遠(yuǎn)都傾向于全緩沖,即緩沖區(qū)滿了才刷新,因?yàn)檫@樣只需要更少的IO操作,更少次的外設(shè)訪問,效率更高。

當(dāng)然,我們要根據(jù)實(shí)際情況去改變刷新策略。如:顯示器是直接給用戶看的,一方面要照顧效率,一方面要照顧用戶體驗(yàn)。所以顯示器一般使用行刷新。

3、緩沖區(qū)由誰提供

從上面的例子,我們發(fā)現(xiàn)直接往顯示器上打印的結(jié)果為4條,往文件打印的結(jié)果為7條,這跟緩沖區(qū)有關(guān),同時(shí)這也說明了緩沖區(qū)一定不在Linux內(nèi)核中,為什么?因?yàn)閣rite是系統(tǒng)接口,如果在內(nèi)核中,write也應(yīng)該打印兩次。所以緩沖區(qū)是由C標(biāo)準(zhǔn)庫提供的。

我們之前所說的所有緩沖區(qū)都指的是用戶級(jí)語言層面提供的緩沖區(qū)。stdout,stdin,stderr對(duì)應(yīng)的類型——FILE*,F(xiàn)ILE是一個(gè)結(jié)構(gòu)體,里面封裝了fd,同時(shí)還包括了一個(gè)緩沖區(qū)。

從源碼出發(fā),我們可以來看一看FILE結(jié)構(gòu)體:

Linux之緩沖區(qū)的理解,Linux,linux,運(yùn)維,服務(wù)器

4、重看問題

有了緩沖區(qū)的概念,我們就來解釋解釋問題引入中的現(xiàn)象。

首先,我們要先知道,代碼運(yùn)行完了,并不代表數(shù)據(jù)已經(jīng)刷新了。上面代碼中,使用C語言函數(shù)的操作在執(zhí)行完了后,先將數(shù)據(jù)寫入了緩沖區(qū)中,并沒有直接向顯示器上打印。

第一次運(yùn)行,沒有重定向操作,就是直接向顯示器打印,而顯示器的刷新策略是行刷新,且每個(gè)代碼后面都有\(zhòng)n,所以在調(diào)用fork之前,代碼不僅執(zhí)行完了,而且數(shù)據(jù)都已經(jīng)刷新了。所以fork對(duì)結(jié)果沒有影響。

第二次運(yùn)行,我們有了重定向操作,于是函數(shù)就由向顯示器打印變成了向磁盤文件打印。所以刷新策略也由行刷新變成了滿刷新。那么\n就已經(jīng)沒有意義了。所以代碼在運(yùn)行到fork時(shí),之前的代碼雖然已經(jīng)運(yùn)行完成了,但是數(shù)據(jù)還沒有刷新到文件中。數(shù)據(jù)還在當(dāng)前進(jìn)程對(duì)應(yīng)的C標(biāo)準(zhǔn)庫中的緩沖區(qū)中,且該數(shù)據(jù)屬于父進(jìn)程。

于是最后,我們fork創(chuàng)建了子進(jìn)程。接著,父進(jìn)程或子進(jìn)程退出,這時(shí)數(shù)據(jù)會(huì)強(qiáng)制刷新出來。我們假設(shè)父進(jìn)程先退出:父進(jìn)程退出后,其數(shù)據(jù)強(qiáng)制刷新,而刷新的過程也是一種寫入,所以這時(shí),為了父子進(jìn)程的數(shù)據(jù)不會(huì)相互影響,就會(huì)發(fā)生寫時(shí)拷貝!這樣數(shù)據(jù)就會(huì)有兩份,于是父子進(jìn)程各自退出時(shí)都會(huì)刷新各自的數(shù)據(jù)。(當(dāng)然,如果子進(jìn)程先退出也是同樣的)

所以,簡(jiǎn)單總結(jié)來說:重定向?qū)е滤⑿虏呗园l(fā)生了改變(由行緩沖變成了全緩沖)。同時(shí)發(fā)生了寫時(shí)拷貝,父子進(jìn)程各自刷新。

三、緩沖區(qū)的簡(jiǎn)單實(shí)現(xiàn)

有了緩沖區(qū)的一些基本概念。我們可以自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的帶有緩沖區(qū)的struct file。

主函數(shù):

int main
{
    MyFILE* fp = fopen_("log.txt", "r");
    if(fp==NULL)
    {
        printf("open file fail");
        return 0;
    }
    fputs_("hello world", fp);
    fclose_(fp);
    
    return 0;
}

struct file

struct MyFILE_
{
    int fd;
    char buff[NUM];
    int end;//當(dāng)前緩沖區(qū)的結(jié)尾
};

typedef struct MyFILE_ MyFILE;

?fopen函數(shù)的簡(jiǎn)單實(shí)現(xiàn)

MyFILE* fopen_(const char* pathname, const char* mode)
{
    assert(pathname);
    assert(mode);
    MyFILE* fp = NULL;

    if(strcmp(mode, "w")==0)
    {
        int fd = open(pathname, O_WRONLY|O_TRUNC|O_CREAT);
        if(fd>0)
        {
            MyFILE* fp=(MyFILE*)malloc(sizeof(MyFILE));
            memset(fp,'\0',sizeof(MyFILE));
            fp->fd = fd;
        }
    }
    else if(strcmp(mode, "w+")==0)
    {}
    else if(strcmp(mode,"r")==0)
    {}
    else if(strcmp(mode,"r+")==0)
    {}
    else if(strcmp(mode,"a")==0)
    {}
    else if(strcmp(mode,"a+")==0)
    {}
    else 
    {}

    return fp;
}

fputs函數(shù)的簡(jiǎn)單實(shí)現(xiàn)

void fputs_(const char* message, MyFILE* fp)
{
    assert(message);
    assert(fp);

    strcpy(fp->buff+fp->end, message);
    fp->end += strlen(message);

    if(fp->fd==0)
    {}
    else if(fp->fd==1)
    {
        if(fp->buff[fp->end-1]== '\n')
        {
            write(fp->fd, fp->buff,fp->end);
            fp->end = 0;
        }
    }
    else if(fp->fd==2)
    {}
    else 
    {}
}

fclose函數(shù)簡(jiǎn)單實(shí)現(xiàn)和fflush函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-769680.html

void fclose_(MyFILE* fp)
{
    assert(fp);

    fflush_(fp);
    close(fp->fd);
    free(fp);
}

void fflush_(MyFILE* fp)
{
    assert(fp);
    
    if(fp->end != 0)
    {
        write(fp->fd, fp->buff, fp->end);
        syncfs(fp->fd);
        fp-> end = 0;
    }
}

到了這里,關(guān)于Linux之緩沖區(qū)的理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 用Linux的視角來理解緩沖區(qū)概念

    用Linux的視角來理解緩沖區(qū)概念

    緩沖區(qū)(buffer)是存儲(chǔ)數(shù)據(jù)的臨時(shí)存儲(chǔ)區(qū)域。當(dāng)我們用C語言向文件中寫入數(shù)據(jù)時(shí),數(shù)據(jù)并不會(huì)直接的寫到文件中,中途還經(jīng)過了緩沖區(qū),而我們需要對(duì)緩沖區(qū)的數(shù)據(jù)進(jìn)行刷新,那么數(shù)據(jù)才算寫到文件當(dāng)中。而緩沖區(qū)通常是一塊內(nèi)存區(qū)域,可以是數(shù)組、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu)。

    2024年01月20日
    瀏覽(23)
  • Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)

    Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)

    至此,我們理解了緩沖區(qū)的概念和作用,下面我們來簡(jiǎn)易模擬實(shí)現(xiàn)一下C標(biāo)準(zhǔn)庫 我們要實(shí)現(xiàn)的是: 1.文件結(jié)構(gòu)體的定義 1.首先要有一個(gè)文件結(jié)構(gòu)體: 刷新策略分別宏定義為 2.myfopen等等函數(shù)的聲明 path:文件路徑+文件名 mode:打開文件的方式 “r”:只讀 “w”:覆蓋寫 “a”:追加寫 strea

    2024年03月11日
    瀏覽(18)
  • [Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫)

    [Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫詳細(xì)制作使用?。ň彌_區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫)

    ? ? ? ? hello,大家好,這里是bang___bang_,今天來談?wù)劦奈募到y(tǒng)知識(shí),包含有緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫。本篇旨在分享記錄知識(shí),如有需要,希望能有所幫助。 目錄 1??緩沖區(qū) ??緩沖區(qū)的意義 ??常見緩沖區(qū)刷新策略 ??緩沖區(qū)位置猜想 ??現(xiàn)象猜測(cè) ??現(xiàn)象解

    2024年02月13日
    瀏覽(27)
  • 【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    ?? ??? 爆笑 教程 ????《看表情包學(xué)Linux》?? ? 猛戳訂閱 ? ? ?? ?? 寫在前面: 在上一章中,我們已經(jīng)把 fd 的基本原理搞清楚了。本章我們將開始探索 fd 的應(yīng)用特征,探索 文件描述符的分配原則。講解重定向,上一章是如何使用 fflush 把內(nèi)容變出來的,介紹 dup2 函數(shù),

    2023年04月25日
    瀏覽(19)
  • 【Linux】文件緩沖區(qū)

    【Linux】文件緩沖區(qū)

    提到文件緩沖區(qū)這個(gè)概念我們好像并不陌生,但是我們對(duì)于這個(gè)概念好像又是模糊的存在腦海中,之間我們?cè)诮榻Bc語言文件操作已經(jīng)簡(jiǎn)單的提過這個(gè)概念,今天我們不妨深入理解什么是文件緩沖區(qū) 通過自己實(shí)現(xiàn)庫中的一些文件操作函數(shù)更加深入的理解文件緩沖區(qū) 自定義實(shí)現(xiàn)

    2024年02月10日
    瀏覽(25)
  • 【linux】重定向+緩沖區(qū)

    【linux】重定向+緩沖區(qū)

    自我名言 : 只有努力,才能追逐夢(mèng)想,只有努力,才不會(huì)欺騙自己。 喜歡的點(diǎn)贊,收藏,關(guān)注一下把! close(1),為什么沒有打印新建文件fd呢? printf(“%dn”,fd); printf會(huì)把內(nèi)容打印到stdout文件中。 但是close(1)關(guān)閉標(biāo)準(zhǔn)輸出stdout—顯示器,int fd=open();新打開的文件fd是1。 st

    2024年02月08日
    瀏覽(22)
  • 淺談linux緩沖區(qū)的認(rèn)識(shí)!

    淺談linux緩沖區(qū)的認(rèn)識(shí)!

    今天來為大家分享一波關(guān)于緩沖區(qū)的知識(shí)!那么既然我們要談緩沖區(qū),那么就得從是什么?為什么?有什么作用這幾個(gè)方面來談?wù)撘幌戮彌_區(qū)!然后再通過一些代碼來更加深刻的理解緩沖區(qū)的知識(shí)! 從最簡(jiǎn)單的理解方面來,我們可以將緩沖區(qū)理解成一塊內(nèi)存!那么這塊內(nèi)存是

    2024年02月05日
    瀏覽(20)
  • [Linux打怪升級(jí)之路]-緩沖區(qū)

    [Linux打怪升級(jí)之路]-緩沖區(qū)

    前言 作者 : 小蝸牛向前沖 名言 : 我可以接受失敗,但我不能接受放棄 ? ?如果覺的博主的文章還不錯(cuò)的話,還請(qǐng) 點(diǎn)贊,收藏,關(guān)注??支持博主。如果發(fā)現(xiàn)有問題的地方歡迎?大家在評(píng)論區(qū)指正 ?本期學(xué)習(xí)目標(biāo):認(rèn)識(shí)什么是緩沖區(qū),緩沖區(qū)在哪里,模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩

    2024年02月07日
    瀏覽(26)
  • 【Linux】緩沖區(qū)+磁盤+動(dòng)靜態(tài)庫

    【Linux】緩沖區(qū)+磁盤+動(dòng)靜態(tài)庫

    緩沖區(qū)的本質(zhì)就是一段用作緩存的 內(nèi)存 。 節(jié)省進(jìn)程進(jìn)行數(shù)據(jù)IO的時(shí)間。進(jìn)程使用fwrite等函數(shù)把數(shù)據(jù)拷貝到緩沖區(qū)或者外設(shè)中。 3.1、 立即刷新(無緩沖)——ffush() 情況很少,比如調(diào)用printf后,手動(dòng)調(diào)用fflush刷新緩沖區(qū)。 3.2、 行刷新(行緩沖)——顯示器 顯示器需要滿足人

    2024年02月05日
    瀏覽(27)
  • 【Linux】基礎(chǔ)IO —— 緩沖區(qū)深度剖析

    【Linux】基礎(chǔ)IO —— 緩沖區(qū)深度剖析

    (???(??? )??,我是 Scort 目前狀態(tài):大三非科班啃C++中 ??博客主頁:張小姐的貓~江湖背景 快上車??,握好方向盤跟我有一起打天下嘞! 送給自己的一句雞湯??: ??真正的大師永遠(yuǎn)懷著一顆學(xué)徒的心 作者水平很有限,如果發(fā)現(xiàn)錯(cuò)誤,可在評(píng)論區(qū)指正,感謝?? ????

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包