中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

免費(fèi)企業(yè)網(wǎng)站注冊(cè)廣告優(yōu)化師培訓(xùn)

免費(fèi)企業(yè)網(wǎng)站注冊(cè),廣告優(yōu)化師培訓(xùn),用ps個(gè)人網(wǎng)站怎么做,鎮(zhèn)江核酸檢測(cè)通知linux基礎(chǔ)io重定向-CSDN博客 文章目錄 目錄 文章目錄 什么是緩沖區(qū) 為什么要有緩沖區(qū) 二、編寫(xiě)自己的fopen、fwrite、fclose 1.引入函數(shù) 2、引入FILE 3.模擬封裝 1、fopen 2、fwrite 3、fclose 4、fflush 總結(jié) 前言 用快遞站講述緩沖區(qū) 收件區(qū)(類(lèi)比輸…

linux基礎(chǔ)io重定向-CSDN博客


文章目錄

目錄

文章目錄

什么是緩沖區(qū)

為什么要有緩沖區(qū)

二、編寫(xiě)自己的fopen、fwrite、fclose

1.引入函數(shù)

2、引入FILE

3.模擬封裝

1、fopen

2、fwrite

3、fclose

4、fflush

總結(jié)


前言

用快遞站講述緩沖區(qū)

收件區(qū)(類(lèi)比輸入緩沖區(qū)):

快遞站的收件區(qū)就如同計(jì)算機(jī)的輸入緩沖區(qū)。當(dāng)快遞員不斷送來(lái)包裹(好比計(jì)算機(jī)從外部設(shè)備接收數(shù)據(jù)),收件區(qū)先把這些包裹暫存起來(lái)。就像計(jì)算機(jī)通過(guò)輸入設(shè)備(如鍵盤(pán)輸入字符、網(wǎng)絡(luò)傳來(lái)數(shù)據(jù)等)接收到的數(shù)據(jù),不會(huì)立刻被全部處理,而是先放在輸入緩沖區(qū)。例如,很多快遞在一天內(nèi)不同時(shí)段被送來(lái),收件區(qū)堆積著這些待進(jìn)一步處理的包裹,這類(lèi)似輸入緩沖區(qū)存放著源源不斷接收到的數(shù)據(jù),等待后續(xù)的處理步驟。

分揀區(qū)(類(lèi)比處理緩沖區(qū)):

這里可比作計(jì)算機(jī)的處理緩沖區(qū)。在快遞站分揀區(qū),工作人員會(huì)對(duì)包裹進(jìn)行查看、分類(lèi)(依據(jù)目的地等信息),這類(lèi)似計(jì)算機(jī)處理緩沖區(qū)對(duì)暫存的數(shù)據(jù)進(jìn)行分析、判斷處理方式。比如要確定數(shù)據(jù)該送往哪個(gè)程序或存儲(chǔ)區(qū)域進(jìn)行下一步操作,就如同分揀區(qū)確定包裹該發(fā)往哪個(gè)派送點(diǎn)。而且有時(shí)候包裹會(huì)在分揀區(qū)排隊(duì)等待進(jìn)一步轉(zhuǎn)運(yùn)安排,這也如同數(shù)據(jù)在處理緩沖區(qū)可能會(huì)因處理資源不足等原因排隊(duì)等待處理,以確保按正確順序完成處理。

發(fā)件區(qū)(類(lèi)比輸出緩沖區(qū)):

快遞站的發(fā)件區(qū)就像計(jì)算機(jī)的輸出緩沖區(qū)。分揀好準(zhǔn)備發(fā)往各個(gè)派送點(diǎn)的包裹會(huì)在發(fā)件區(qū)暫存(如同計(jì)算機(jī)處理好的數(shù)據(jù)在輸出緩沖區(qū)暫存),等待快遞車(chē)輛來(lái)運(yùn)走(類(lèi)似等待合適時(shí)機(jī)輸出到外部設(shè)備)。比如一批要發(fā)往同一區(qū)域的包裹先在發(fā)件區(qū)集合,就如同一組要輸出到顯示器顯示的數(shù)據(jù)先在輸出緩沖區(qū)等待統(tǒng)一發(fā)送以便正確顯示。同時(shí),發(fā)件區(qū)工作人員要協(xié)調(diào)快遞車(chē)輛到來(lái)時(shí)間等,保證包裹有序發(fā)出,這類(lèi)似輸出緩沖區(qū)要協(xié)調(diào)與外部設(shè)備的連接及數(shù)據(jù)傳輸時(shí)機(jī),確保數(shù)據(jù)準(zhǔn)確輸出到目標(biāo)設(shè)備。

總之,快遞站的不同區(qū)域通過(guò)暫存、處理、再暫存并協(xié)調(diào)輸出的流程,很好地模擬了計(jì)算機(jī)緩沖區(qū)在接收、處理、輸出數(shù)據(jù)過(guò)程中的作用。


一、緩沖區(qū)是什么?

緩沖區(qū)是計(jì)算機(jī)存儲(chǔ)體系中的一個(gè)特定區(qū)域,主要起到暫存數(shù)據(jù)的作用。

在輸入方面:
當(dāng)外部設(shè)備(如鍵盤(pán)、鼠標(biāo)、網(wǎng)絡(luò)等)向計(jì)算機(jī)輸入數(shù)據(jù)時(shí),數(shù)據(jù)不會(huì)立刻被計(jì)算機(jī)核心部件(如CPU)處理,而是先進(jìn)入輸入緩沖區(qū)暫存。比如你通過(guò)鍵盤(pán)快速打字,字符數(shù)據(jù)會(huì)先堆積在輸入緩沖區(qū),等待后續(xù)按合適的速度和順序被處理,避免因輸入速度過(guò)快而導(dǎo)致數(shù)據(jù)丟失或處理混亂。

在輸出方面:
當(dāng)計(jì)算機(jī)內(nèi)部處理好的數(shù)據(jù)要輸出到外部設(shè)備(如顯示器、打印機(jī)等)時(shí),也會(huì)先暫存到輸出緩沖區(qū)。例如計(jì)算機(jī)要在顯示器上顯示一幅圖像,處理好的圖像數(shù)據(jù)會(huì)先放在輸出緩沖區(qū),然后再按照顯示器的刷新頻率等要求,適時(shí)且有序地將數(shù)據(jù)傳輸?shù)斤@示器進(jìn)行顯示,這樣能保證輸出的穩(wěn)定性和連貫性。

在數(shù)據(jù)處理過(guò)程中:
有時(shí)數(shù)據(jù)在不同部件(如CPU和內(nèi)存之間、不同程序之間等)流轉(zhuǎn)時(shí),也會(huì)在中間設(shè)置緩沖區(qū)來(lái)暫存數(shù)據(jù),起到協(xié)調(diào)數(shù)據(jù)傳輸速度差異、避免數(shù)據(jù)沖突等作用。

總之,緩沖區(qū)就像是數(shù)據(jù)流轉(zhuǎn)過(guò)程中的一個(gè)個(gè)“臨時(shí)倉(cāng)庫(kù)”,讓數(shù)據(jù)的輸入、輸出和處理都能更順暢、有序地進(jìn)行。

什么是緩沖區(qū)

緩沖區(qū)本質(zhì)上一塊內(nèi)存區(qū)域,用來(lái)保存臨時(shí)數(shù)據(jù)。緩沖區(qū)在各種計(jì)算任務(wù)中都廣泛應(yīng)用,包括輸入/輸出操作、網(wǎng)絡(luò)通信、圖像處理、音頻處理等。

這塊內(nèi)存區(qū)域是由誰(shuí)提供的呢,緩沖區(qū)在哪里呢?可以繼續(xù)向下看.

這里先告訴答案,是C標(biāo)準(zhǔn)庫(kù)提供的.

為什么要有緩沖區(qū)

緩沖區(qū)用于解決數(shù)據(jù)傳輸速度不匹配或不穩(wěn)定的問(wèn)題,并提高數(shù)據(jù)處理的效率。

當(dāng)從硬盤(pán)讀取大量數(shù)據(jù)時(shí),將數(shù)據(jù)直接傳輸?shù)絻?nèi)存中可能會(huì)導(dǎo)致讀寫(xiě)速度不匹配(內(nèi)存速度快,而硬盤(pán)讀取速度慢,這是相對(duì)來(lái)說(shuō)的),從而導(dǎo)致性能瓶頸。為了緩解這個(gè)問(wèn)題,可以引入一個(gè)緩沖區(qū),先將一部分?jǐn)?shù)據(jù)讀取到緩沖區(qū)中,然后再?gòu)木彌_區(qū)逐步讀取數(shù)據(jù)到內(nèi)存中,以平衡數(shù)據(jù)傳輸速度。

這里有個(gè)很合適的例子來(lái)解釋:

例如你和你的朋友在兩個(gè)不同的大學(xué),相差大概500公里,有一天你想送一些書(shū)給你的朋友,此時(shí)你可以選擇騎自行車(chē),親自騎行去送這些書(shū),禮輕情意重嘛,加上中途休息,然后由于速度慢,花了大概一周的時(shí)間才到,送了之后然后又騎回自己的學(xué)校,又花了一周的時(shí)間,一共過(guò)了兩周完整的工作才完成,耗時(shí)太長(zhǎng)。

假設(shè)此時(shí)你學(xué)聰明了,既然那么慢,那么直接坐高鐵去送,可來(lái)回一共都500多了,這都比這些書(shū)的價(jià)值多了,即成本太高了.

可以把以上這些書(shū)看做資源,這種模式叫做寫(xiě)透模式.

此時(shí)你想到,可以寄快遞來(lái)送這些書(shū)啊,價(jià)格便宜,而且兩三天就到了,這多實(shí)惠,于是你把這些書(shū)交給了順豐 快遞,過(guò)了兩三天,你的朋友在手機(jī)上給你說(shuō),說(shuō)我收到這些書(shū)了,然后這樣就成功的把資源交到了對(duì)方的手中。這個(gè)順豐快遞在這里扮演的角色便是緩沖區(qū).?

順豐 拿到你的快遞也不是立馬就送,而是等待數(shù)量足夠多時(shí),再一次性開(kāi)始運(yùn)輸,這相當(dāng)于是一種緩沖區(qū)的刷新策略.

緩沖區(qū)刷新策略
刷新策略主要有以下3種:

1.立即刷新

2.行刷新(行緩沖),遇到\n刷新

3.滿刷新(全緩沖),指的是將輸入或輸出的數(shù)據(jù)完全存儲(chǔ)在緩沖區(qū)中,然后再進(jìn)行傳輸或處理。

當(dāng)然也會(huì)有一些特殊情況:

1.用戶強(qiáng)制刷新(fflush)

2.進(jìn)程退出

遇到以上兩種情況時(shí),必須馬上從刷新緩沖區(qū)的數(shù)據(jù),而不要按照之前的刷新策略繼續(xù)等待.

所以緩沖策略 = 一般情況 + 特殊情況.

一般而言,行緩沖的設(shè)備文件 --- 顯示器

全緩沖的設(shè)備文件 --- 磁盤(pán)文件

但所有的設(shè)備,永遠(yuǎn)傾向于全緩沖 --> 緩沖區(qū)滿了再刷新 --> 需要更少次數(shù)的IO操作 -->更少次數(shù)的外設(shè)訪問(wèn)(相當(dāng)于提高了整機(jī)效率).

有同學(xué)可能有疑問(wèn),比如10行數(shù)據(jù),每一行有100個(gè)字節(jié),雖然10行最后再一起刷新,只進(jìn)行了一次的外設(shè)訪問(wèn),但是數(shù)據(jù)量很多啊,1000個(gè)字節(jié),而按行刷新雖然刷新了10次,但每次數(shù)據(jù)量少啊,那為什么外設(shè)訪問(wèn)次數(shù)越少越好呢?

這是因?yàn)楹屯獠吭O(shè)備IO的時(shí)候,數(shù)據(jù)量的大小不是主要矛盾,你和外設(shè)預(yù)備IO的過(guò)程是最耗費(fèi)時(shí)間的.

比如你和別人借錢(qián),往往溝通的過(guò)程要耗費(fèi)很長(zhǎng)時(shí)間,而轉(zhuǎn)賬的過(guò)程只需要幾秒,這同樣的道理.

那我們直接改成全緩沖不就行了嗎?這樣效率不就高了嗎,還要什么行緩沖.

其實(shí)這些策略,都是根據(jù)實(shí)際情況做的妥協(xié):

例如行緩沖就是針對(duì)于顯示器,是給用戶看的,一方面要照顧效率,另一方面也要照顧用戶體驗(yàn).

而平常我們打開(kāi)的一些文本文件便是全緩沖,等到用戶全部寫(xiě)完再一次性進(jìn)行保存.

有了這些緩沖區(qū)和策略,便可以提高數(shù)據(jù)處理的效率.?

二、編寫(xiě)自己的fopen、fwrite、fclose

1.引入函數(shù)

這些函數(shù)都是3好手冊(cè)的函數(shù),也就是說(shuō)這些函數(shù)可以有2好手冊(cè)的系統(tǒng)函數(shù)來(lái)封裝。

2、引入FILE

在之前的語(yǔ)言學(xué)習(xí)時(shí),我們知道“->"引用通常都是結(jié)構(gòu)體,那么stdin、stdout、stderr這三個(gè)流也就是結(jié)構(gòu)體了。

因?yàn)镮O相關(guān)函數(shù)與系統(tǒng)調(diào)用接口對(duì)應(yīng),并且?guī)旌瘮?shù)封裝系統(tǒng)調(diào)用,所以本質(zhì)上,訪問(wèn)文件都是通過(guò)fd訪 問(wèn)的。

所以C庫(kù)當(dāng)中的FILE結(jié)構(gòu)體內(nèi)部,必定封裝了fd。

man 3 stdin,我們可以看到他們的類(lèi)型。

?編輯

那么FILE又是什么類(lèi)型呢?

打開(kāi)頭文件找到EILE類(lèi)

3.模擬封裝

我們想要實(shí)現(xiàn)一個(gè)文件的打開(kāi),寫(xiě)入和關(guān)閉文件操作的函數(shù)。

#include"myfile.h"
#define myfile "test.txt" 
int main()
{//打開(kāi)文件_FILE* _fd= _fopen(myfile,"a");if(_fd==NULL)return 1;//讀文件const char*ptr="hello linux!!\n";//size_t _fwrite(ptr,strlen(ptr),_fd);int cnt = 10;while(cnt){_fwrite(ptr, strlen(ptr),_fd);// fflush(fp);sleep(1);cnt--;}//寫(xiě)關(guān)閉文件_fclose(_fd); return 0;
}

我們現(xiàn)在就來(lái)實(shí)現(xiàn)這個(gè)幾個(gè)函數(shù)內(nèi)部封裝。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>#include <string.h>#define SIZE 1024
#define FILE_MODE 0666
#define FLUSH_NOW 1
#define FLUSH_LINE 2
#define FLUSH_ALL 4typedef struct _FILE_IO 
{int fileno;int flag; //char inbuffer[SIZE];//int in_pos;char outbuffer[SIZE]; // 用一下這個(gè)int out_pos;
}_FILE;_FILE* _fopen(const char*path,const char* made);
size_t _fwrite(const char*ptr,size_t size,_FILE* _stream);
int _fclose(_FILE*_stream);

1、fopen

_FILE* _fopen(const char*path,const char* made)
{assert(path);assert(made);int fd=-1;int f=0;if(strcmp(made, "w") == 0) {f = (O_CREAT|O_WRONLY|O_TRUNC);fd = open(path, f, FILE_MODE);}else if(strcmp(made, "a") == 0) {f = (O_CREAT|O_WRONLY|O_APPEND);fd = open(path, f, FILE_MODE);}else if(strcmp(made, "r") == 0) {f = O_RDONLY;fd = open(path, f);}else return NULL;if(fd == -1) return NULL;_FILE *fp = (_FILE*)malloc(sizeof(_FILE));if(fp == NULL) return NULL;fp->fileno = fd;//fp->flag = FLUSH_LINE;fp->flag = FLUSH_ALL;fp->out_pos = 0;return fp;
}

2、fwrite

size_t _fwrite(const char*ptr,size_t size,_FILE* _stream)
{memcpy(&_stream->outbuffer[_stream->out_pos], ptr, size); // 沒(méi)有做異常處理, 也不考慮局部問(wèn)題_stream->out_pos += size;if(_stream->flag&FLUSH_NOW){write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}else if(_stream->flag&FLUSH_LINE){if(_stream->outbuffer[_stream->out_pos-1] == '\n'){ // 不考慮其他情況write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}}else if(_stream->flag & FLUSH_ALL){if(_stream->out_pos == SIZE){write(_stream->fileno, _stream->outbuffer, _stream->out_pos);_stream->out_pos = 0;}}return size;
}

3、fclose

int _fclose(_FILE*_stream)
{if(_stream == NULL) return -1;int fd=_stream->fileno;_fflush(_stream);close(fd);free(_stream);return fd;}

4、fflush

void _fflush(_FILE *fp)
{if(fp->out_pos > 0){write(fp->fileno, fp->outbuffer, fp->out_pos);fp->out_pos = 0;}
}

完整代碼


總結(jié)

緩沖區(qū)位于用戶程序和硬件設(shè)備之間,用來(lái)緩存數(shù)據(jù),目的是讓快速的 CPU 不必等待慢速的輸入輸出設(shè)備,同時(shí)減少操作硬件的次數(shù)。對(duì)于 IO 密集型的網(wǎng)絡(luò)應(yīng)用程序(如網(wǎng)站、數(shù)據(jù)庫(kù)、DNS、CDN 等),緩沖區(qū)的設(shè)計(jì)至關(guān)重要,它能十倍甚至一百倍得提高程序性能。
關(guān)于緩沖區(qū)還有更多的內(nèi)容,將在 “文件操作” 一章中深入講解

http://www.risenshineclean.com/news/28993.html

相關(guān)文章:

  • 成都網(wǎng)站建設(shè)公司招聘競(jìng)價(jià)排名服務(wù)
  • 對(duì)門(mén)戶網(wǎng)站建設(shè)的見(jiàn)解查詢(xún)網(wǎng) 域名查詢(xún)
  • 做網(wǎng)站的硬件和軟件環(huán)境2022磁力鏈接搜索引擎推薦
  • 門(mén)戶網(wǎng)站建設(shè)投標(biāo)書(shū)濟(jì)南新聞?lì)^條最新事件
  • 建設(shè)個(gè)人網(wǎng)站梅州seo
  • 海南做網(wǎng)站的google chrome
  • 如何使用模板做網(wǎng)站公司網(wǎng)站如何建設(shè)
  • 南京做網(wǎng)站哪家好網(wǎng)站關(guān)鍵詞快速排名服務(wù)
  • 網(wǎng)站怎么裝模版沒(méi)干過(guò)網(wǎng)絡(luò)推廣能干嗎
  • 東莞建域名網(wǎng)站專(zhuān)業(yè)制作網(wǎng)站的公司哪家好
  • 品牌網(wǎng)站建設(shè)解決網(wǎng)址大全下載到桌面
  • 建設(shè)銀行網(wǎng)站預(yù)約取款長(zhǎng)春網(wǎng)站建設(shè)方案咨詢(xún)
  • 網(wǎng)站的圖片水印怎么做百度資源提交
  • 免費(fèi)小程序開(kāi)發(fā)平臺(tái)天津seo優(yōu)化公司哪家好
  • 建站網(wǎng)址平臺(tái)寧波seo快速優(yōu)化平臺(tái)
  • 淄博手機(jī)網(wǎng)站建設(shè)推廣優(yōu)化網(wǎng)站
  • 電白區(qū)建設(shè)局網(wǎng)站怎么做電商生意
  • 成都網(wǎng)站建設(shè)創(chuàng)意新手學(xué)百度競(jìng)價(jià)要多久
  • 國(guó)外做家裝的網(wǎng)站有哪些短鏈接在線生成器
  • 個(gè)人網(wǎng)站建設(shè)方案書(shū)范文百度搜索推廣產(chǎn)品
  • 個(gè)人做地方民生網(wǎng)站百度推廣的步驟
  • 做電影網(wǎng)站用什么軟件叫什么名字嗎seo服務(wù)公司招聘
  • 將網(wǎng)站打造成推特最新消息今天
  • 深圳快速seo排名優(yōu)化惠州seo按天計(jì)費(fèi)
  • 龍崗住房和建設(shè)局網(wǎng)站百度推廣登錄平臺(tái)客服
  • 日照網(wǎng)站推廣今日熱榜
  • 夢(mèng)織網(wǎng)站短視頻seo推廣
  • 洞口做網(wǎng)站推廣信息怎么寫(xiě)
  • 龍華高端網(wǎng)站設(shè)計(jì)愛(ài)站網(wǎng)關(guān)鍵詞查詢(xún)網(wǎng)站
  • 書(shū)畫(huà)網(wǎng)站 建設(shè)方案室內(nèi)設(shè)計(jì)培訓(xùn)