文件操作接口二(缓冲区和缓存):
一、缓冲区
1、什么是缓冲区?
-
缓冲区(Buffer)
缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
显然缓冲区是具有一定大小的。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2. 为什么需要缓冲区?
高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,我们可以在这两者之间设立一个缓冲区。
3. 缓冲区的作用
-
可以解除两者的制约关系,数据可以直接送往缓冲区,高速设备不用再等待低速设备,提高了计算机的效率。
例如:我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。 -
可以减少数据的读写次数.
如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。例如:我们想将数据写入到磁盘中,不是立马将数据写到磁盘中,而是先输入缓冲区中,当缓冲区满了以后,再将数据写入到磁盘中,这样就可以减少磁盘的读写次数,不然磁盘很容易坏掉。 -
总结:
简单来说,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来存储数据。
它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
4.缓冲区的类型
缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。
1、全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。
全缓冲的典型代表是对磁盘文件的读写。
2、行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。
典型代表是键盘输入数据。
3、不带缓冲
也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
典型代表是标准出错stderr。
5.缓冲区的刷新
下列情况会引发缓冲区的刷新:
- 缓冲区满时;
- 关闭文件。
可见,缓冲区满或关闭文件时都会刷新缓冲区,进行真正的I/O操作。
大家要仔细理解缓冲区刷新的意思,刷新字面上的意思是用刷子刷,把原来旧的东西变新了,这里就是改变的意思。
例如像缓冲区溢出的时候,多余出来的数据会直接将之前的数据覆盖,这样缓冲区里的数据就发生了改变。
比如在Linux下,操作命令行就属于常见的行缓冲模式
输入一行命令例如ls,命令ls就会进入到缓冲区内,不输入回车的话,什么也不会发生,当输入回车就会执行真正的IO操作
还有一种情况,并不需要输入回车。
例如在vim的正常模式下,输入dd可以直接删除某一行,并不需要输入回车。这种情况貌似就是直接把信号传送到内存中。
5.1 输出缓冲区的条件:
1、程序结束(不能以_exit/_Exit结束);
2、遇到“\n”;
3、主动刷新fflush(stdout);
4、缓冲区满
5.2 fflush()函数:更新缓冲区
头文件:#include <stdio.h>
定义函数: int fflush(FILE* stream);
函数说明:
fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中.
如果参数stream 为NULL,fflush()会将所有打开的文件数据更新.
返回值:成功返回0, 失败返回EOF, 错误代码存于errno 中.
二、缓存
2.1 缓存是什么?
CPU的Cache,它中文名称是高速缓冲存储器,读写速度很快,几乎与CPU一样。
2.2 为什么需要缓存?
由于CPU的运算速度太快,内存的数据存取速度无法跟上CPU的速度,所以在cpu与内存间设置了cache为cpu的数据快取区。
2.3 缓存原理
当计算机执行程序时,数据与地址管理部件会预测可能要用到的数据和指令,并将这些数据和指令预先从内存中读出送到Cache。一旦需要时,先检查Cache,若有就从Cache中读取,若无再访问内存,现在的CPU还有一级cache,二级cache。
2.3.1 L1级缓存 和 L2级缓存
L1级缓存:
位于处理器芯片上的L1高速缓存的容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。
L2级缓存:
容量为十万到数百万字节大小。
进程访问L2的时间开销要比访问L的开销大5倍,但是这仍然比访问主存的时间快5~10倍。
L1和L2高速缓存是用一种叫做静态随机访问存储器(SRAM)的硬件技术实现的
2.4 缓存作用
.有效的一种提高程序性能的机制
简单来说,Cache就是用来解决CPU与内存之间速度不匹配的问题,避免内存与辅助内存频繁存取数据,这样就提高了系统的执行效率。
2.4.1 缓存提高性能的原理
通过缓存能提高I/O性能是基于以下2个重要的原理
1. CPU访问内存的速度远远大于访问磁盘的速度
(访问速度差距不是一般的大,差好几个数量级)
3. 数据一旦被访问,就有可能在短期内再次被访问(临时局部原理)
2.5 磁盘的cache
磁盘也有cache,硬盘的cache作用就类似于CPU的cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取。
2.6 浏览器缓存
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储。
当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览,并且可以减少服务器的压力。这个过程与下载非常类似,不过下载是用户的主动过程,并且下载的数据一般是长时间保存,游览器的缓存的数据只是短时间保存,可以人为的清空。
2.6.1 同一ip不同设备,经常需要清空缓存
ctrl+shift+del 清空web缓存
三、缓存(cache)与缓冲(buffer)的主要区别
Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
简单来说就是buffer偏重于写,而cache偏重于读。
参考
https://blog.csdn.net/qq_28657577/article/details/80990777
https://www.cnblogs.com/mlgjb/p/7991903.html