缓冲区(Buffer)与缓存(Cache)异同

缓冲区(Buffer)定义

缓冲区(Buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。

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

有时候,用户希望得到最及时的反馈,输入输出的内容就不能进入缓冲区。

为什么要引入缓冲区?

首先,缓冲区可以使低速的输入输出设备和高速运行的程序能够协调工作。
一般来说程序在CPU上运行,其速度必定远超过一般硬件运行速度。例如,硬盘的速度要远低于 CPU,它们之间有好几个数量级的差距,当向硬盘写入数据时,程序需要等待,不能做任何事情,就好像卡顿了一样,用户体验非常差。计算机上绝大多数应用程序都需要和硬件打交道,例如读写硬盘、向显示器输出、从键盘输入等,如果每个程序都等待硬件,那么整台计算机也将变得卡顿。但是有了缓冲区,就可以将数据先放入缓冲区中(内存的读写速度也远高于硬盘),然后程序可以继续往下执行,等所有的数据都准备好了,再将缓冲区中的所有数据一次性地写入硬盘,这样程序就减少了等待的次数,变得流畅起来。

其次,缓冲区可以有效减少硬件设备的读写次数。
如果每次输入输出操作只传输少量数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。例如,我们想将数据写入到磁盘中,不是立马将数据写到磁盘中,而是先输入缓冲区中,当缓冲区满了以后,再将数据写入到磁盘中,这样就可以减少磁盘的读写次数,不然磁盘很容易坏掉。

简单来说,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来存储数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作,同时减少操作硬件的次数。

缓冲区的类型

缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

1、全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作,即一定大小的缓冲区填满后。全缓冲的典型代表是对磁盘文件的读写。

2、行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。行缓冲的典型代表就是标准输入设备(也即键盘)和标准输出设备(也即显示器)。

比如:对以下语句进行执行,

#include
#include	//sleep()函数的头文件
int main(void)
{
    printf("key0");
    sleep(5);  //程序将暂停5秒钟
    printf("key1\n");

    return 0;
}

执行时将会看到在Windows 平台下,会先输出 key0 语句,过5s后才会输出 key1 语句。这好像与理论矛盾,其实这只是因为在Windows 平台下,输出设备认为是不带缓冲区的;
在Linux 和 Mac OS 平台下,输出设备带有行缓冲区。这时就会等5s后 key0key1 一起输出。

而对于输入设备,没有缓冲区将导致非常奇怪的行为,因此Windows、Linux、Mac OS 在实现时都给输入设备带上了行缓冲,所以 scanf()、getchar()、gets() 等输入函数在每个平台下的表现都一致。

当然,考虑到有些特殊情况希望输入不带有行缓冲,这时有Windows 下特有的 getche() 和 getch() 函数满足这种特殊需求,它们都不带缓冲区。

3、不带缓冲
也就是不进行缓冲处理,例如C语言中的getch和getche即是如此。

缓冲区的刷新条件

不管是行缓冲还是全缓冲,缓冲区满时会自动刷新;
行缓冲遇到换行符\n时会刷新;
关闭文件时会刷新缓冲区;
程序关闭时一般也会刷新缓冲区,这个是由标准库来保障的;

当缓冲区刷新时,就会进行真正的I/O操作。

缓存(Cache)定义

广义的cache包含很多含义:
一、
CPU的Cache,它中文名称是高速缓冲存储器,读写速度很快,几乎与CPU一样。由于CPU的运算速度太快,内存的数据存取速度无法跟上CPU的速度,所以在CPU与内存间设置了Cache为CPU的数据快取区。当计算机执行程序时,数据与地址管理部件会预测可能要用到的数据和指令,并将这些数据和指令预先从内存中读出送到Cache。一旦需要时,先检查Cache,若有就从Cache中读取,若无再访问内存,现在的CPU还有一级Cache,二级Cache。简单来说,Cache就是用来解决CPU与内存之间速度不匹配的问题,避免内存与辅助内存频繁存取数据,这样就提高了系统的执行效率。

二、
磁盘也有Cache,硬盘的Cache作用就类似于CPU的Cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取。

三、
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览,并且可以减少服务器的压力。这个过程与下载非常类似,不过下载是用户的主动过程,并且下载的数据一般是长时间保存,游览器的缓存的数据只是短时间保存,可以人为的清空。

同样Cache也有大小,例如现在市面上购买的CPU的cache越大,级数越多,CPU的访问速度越快。cache在很多方面都有应用,就不一一列举了。

缓存(Cache)与缓冲区(Buffer)的主要区别

Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率就高了,并极大缓和了冲击。

Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

简单来说,就是Buffer偏重于输出操作,而Cache偏重于输入操作。

你可能感兴趣的:(C语言随笔,缓存,c语言)