关闭

linux----缓冲区

标签: 缓存
141人阅读 评论(0) 收藏 举报
分类:

一:缓冲区
针对的是输入输出数据。其又称缓存,是内存空间的一部分存储空间,这些存储空间是用来缓冲输入输出
数据的。

Buffer和Cache:
buffer和cache是两个不同的概念:cache是高速缓存,用于CPU和内存之间的缓冲;buffer是I/O缓存,
用于内存和硬盘的缓冲;简单的说,cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,
保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。

二:为什么要有缓冲区:

在此之前举一个例子:

你有一盒子牙签,200根全掉在地上了,你的全都捡回桌子上。现在有里两种方式:

-----------不用缓冲的方式------------

  你蹲下,用右手拿一根牙签,站起来,把那根牙签放在桌子上。
  重复这个动作200次。

-----------用缓冲的方式----------------

  你蹲下,用右手拿一根牙签,放在左手上。等你的左手拿不下了,站起来把左手的牙签都放在桌上。
  再蹲下重复。

  在这个方式中,你的左手就是缓冲。缓冲能提交效率的原理就是减少了“蹲下/站起”这个比较费力费
时的动作的次数

:类似的道理

     在I/O过程中,cpu读取磁盘的速度相对内存读取速度要慢的太多,毕竟让cpu读取数据的时候不能
总是在硬盘中读取,否则你cpu光读取数据了,其它的事也就不用做了。因此为了能够加快处理数据的速
度,就需要将读取过的数据缓存在内存里 。
     换句话说,buffer(缓冲区)是一个用于存储速度不同步的设备或优先级不同的设备之间传输数据
的区域。一方面,通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速
度快的设备的操作进程不发生间断。另一方面,可以保护硬盘或减少网络传输的次数。
     缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设
备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

三:缓冲区的类型:
全缓冲:缓冲区满之后才进行I/O操作。
行缓冲:遇到/n之后,执行I/O操作
无缓冲: 不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

四:缓冲区的刷新
只有缓冲区被刷新的时候缓冲区中的内容才会写入真实的文件或输出设备上。

下列情况会引发缓冲区的刷新:
1.缓冲区满时;
2.行缓冲区遇到回车时;
3.关闭文件;

C语言:
4 使用特定函数刷新缓冲区: fflush(stdout) 清空输出缓冲区 ; fflush(stdin): 清空输入缓冲区

定义函数:int fflush(FILE* stream);

函数说明:fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中. 如果参数stream 为
NULL,fflush()会将所有打开的文件数据更新.
返回值:成功返回0, 失败返回EOF, 错误代码存于errno 中.

c++ :
4.用操纵符显示地刷新缓冲区,如用endl,flush等.
5.在每次输出操作执行完毕后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。
6. .可将输出流与输入流关联起来,在读输入流时将刷新其关联的输出缓冲区

实例:
c语言:

printf("hello world");
fflush(stdout);    //结果直接输出,即使缓冲区没满

c++ :

 // 操纵符
 cout << "hi!" << flush; // flushes the buffer, adds no data
 cout << "hi!" << ends; // inserts a null, then flushes the buffer
 cout << "hi!" << endl; // inserts a newline, then flushes the buffer
 // unitbuf操纵符
 cout << unitbuf << "first" << " second" << nounitbuf;

 // unitbuf会在每次执行完写操作后都刷新流

 // 上条语句等价于
 cout << "first" << flush << " second" << flush;

 // nounitbuf将流恢复为正常的,由系统管理的缓冲区方式

 // 将输入输出绑在一起
 // 标准库已经将cin和cout绑定在一起
 // 我们可以调用tie()来实现绑定
 cin.tie(&cout); // the library ties cin and cout for us
 ostream *old_tie = cin.tie();
 cin.tie(0); // break tie to cout, cout no longer flushed when cin is read
 cin.tie(&cerr); // ties cin and cerr, not necessarily a good idea!
 cin.tie(0); // break tie between cin and cerr
 cin.tie(old_tie); // restablish normal tie between cin and cout
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27533次
    • 积分:891
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条
    文章分类