缓冲区(缓存)

详细查看:http://c.biancheng.net/cpp/html/2413.htmlhtml

缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,计算机在内存中预留了必定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫作缓冲区(缓存)。数据库

 

有时候,从键盘输入的内容,或者将要输出到显示器上的内容,会暂时进入缓冲区,待时机成熟,再一股脑将缓冲区中的全部内容“倒出”,咱们才能看到变量的值被刷新,或者屏幕产生变化。缓存

1.为何要引入缓冲区(缓存)

缓冲区是为了让低速的输入输出设备和高速的用户程序可以协调工做,并下降输入输出设备的读写次数。网络

 

例如,咱们都知道硬盘的速度要远低于 CPU,它们之间有好几个数量级的差距,当向硬盘写入数据时,程序须要等待,不能作任何事情,就好像卡顿了同样,用户体验很是差。计算机上绝大多数应用程序都须要和硬件打交道,例如读写硬盘、向显示器输出、从键盘输入等,若是每一个程序都等待硬件,那么整台计算机也将变得卡顿。函数

 

可是有了缓冲区,就能够将数据先放入缓冲区中(内存的读写速度也远高于硬盘),而后程序能够继续往下执行,等全部的数据都准备好了,再将缓冲区中的全部数据一次性地写入硬盘,这样程序就减小了等待的次数,变得流畅起来。性能

 

缓冲区的另一个好处是能够减小硬件设备的读写次数。其实咱们的程序并不能直接读写硬件,它必须告诉操做系统,让操做系统内核(Kernel)去调用驱动程序,只有驱动程序才能真正的操做硬件。网站

 

从用户程序到硬件设备要通过好几层的转换,每一层的转换都有时间和空间的开销,并且开销不必定小;一旦用户程序须要密集的输入输出操做,这种开销将变得很是大,会成为制约程序性能的瓶颈。spa

 

这个时候,分配缓冲区就是必不可少的。每次调用读写函数,先将数据放入缓冲区,等数据都准备好了再进行真正的读写操做,这就大大减小了转换的次数。实践证实,合理的缓冲区设置能成倍提升程序性能。操作系统

 

如今你基本明白了吧,缓冲区其实就是一块内存空间,它用在硬件设备和用户程序之间,用来缓存数据,目的是让快速的 CPU 没必要等待慢速的输入输出设备,同时减小操做硬件的次数。.net

2.缓冲区的类型

根据不一样的标准,缓冲区能够有不一样的分类。

 

根据缓冲区对应的是输入设备仍是输出设备,能够分为输入缓冲区和输出缓冲区。

 

根据数据刷新(也能够称为清空缓冲区,就是将缓冲区中的数据“倒出”)的时机,能够分为全缓冲、行缓冲、不带缓冲。这种分类才本节要重点讲解的内容。

 

1) 全缓冲

在这种状况下,当缓冲区被填满之后才进行真正的输入输出操做。缓冲区的大小都有限制的,好比 1KB、4MB 等,数据量达到最大值时就清空缓冲区。如,文件操做,关闭文件,或者程序结束,或者缓存区满就会刷新缓存。

2) 行缓冲

在这种状况下,当在输入或者输出的过程当中遇到换行符时,才执行真正的输入输出操做。行缓冲的典型表明就是标准输入设备(也即键盘)和标准输出设备(也即显示器)。

 

3) 不带缓冲

不带缓冲区,数据就没有地方缓存,必须当即进行输入输出。

getche()、getch() 就不带缓冲区,输入一个字符后当即就执行了,根本不用按下回车键。

 

3.缓冲区的刷新(清空)

所谓刷新缓冲区,就是将缓冲区中的内容送达到目的地。缓冲区的刷新遵循如下的规则:

  1. 不论是行缓冲仍是全缓冲,缓冲区满时会自动刷新;
  2. 行缓冲遇到换行符\n时会刷新;
  3. 关闭文件时会刷新缓冲区;
  4. 程序关闭时通常也会刷新缓冲区,这个是由标准库来保障的;
  5. 使用特定的函数也能够手动刷新缓冲区。

4.总结

缓冲区位于用户程序和硬件设备之间,用来缓存数据,目的是让快速的 CPU 没必要等待慢速的输入输出设备,同时减小操做硬件的次数。对于 IO 密集型的网络应用程序,好比网站、数据库、DNS、CDN 等,缓冲区的设计相当重要,它能十倍甚至一百倍得提升程序性能。

相关文章
相关标签/搜索