缓存(cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。

缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的 MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。

两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。

buffer是由各种进程分配的,由进程和系统一起管理.被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。

cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

一.Buffer含义

下图是对buffer的一个理解。

Buffer和Cache的区别_第1张图片

其中模块A代表一定代码行的逻辑模块, 模块B代表另外一段代码行的逻辑模块。

模块A通过buffer同模块B进行了间接连接。间接链接好处是两个模块的耦合关系降低了。

图中,Buffer的作用就是 将输入前 杂乱无规则的数据,经过整理后 变成规则有序的数据。真实的buffer的作用其实就是数据的加工与处理,这样便于后一个环节进行处理利用等。具体情况视不同的buffer而不同。

以上仅仅是我个人的理解,那么是否正确?

二.Buffer的英文原义

下面是Buffer的专业的定义,如下:

Buffer和Cache的区别_第2张图片

网络定义如下:

Buffer和Cache的区别_第3张图片

三.Buffer小结

从上面两个定义可以知道buffer含义是缓冲的意思,在机械学上通过缓冲垫把两个系统链接到一起。其他定义都是有缓冲相关的意思。

因此我们可以这么理解

1. Buffer中一定至少存在两个物体或者事务。

2. 这个两个事务通过buffer进行连接

3. Buffer起到一定减缓或者协调的作用。

4. 两个物体或者事务一定是相互知道或者了解,只是进行了间接的连接。

四.Cache的理解

下图是cache的一种处理情况

如图,cache系统中存在模块A, 模块B,模块B包括若干实例, 模块A也可以包括若干实例。 模块A存数据到cache中。 模块B获取数据从cache中。

因此cache是个数据的临时存储场所,有的模块写入,有的模块获取。 写入模块未必了解读取模块的存在,更准确的是读取模块实例的存在,同时写入模块也不关心这些事情,他只管写入。读取模块同样只关心数据的读取,没必要了解到写入的存在。

五.Cache的英文含义

下面是cache的英文原义

Buffer和Cache的区别_第4张图片

Buffer和Cache的区别_第5张图片

从英文含义中我们可以获取到cache应该个存储东西的场所,他的核心功能是存储。

六.Cache小结

从上面两个定义可以知道cache含义是临时储存的一个场所。因此我们可以这么理解

1. Cache是存储场所,一个临时的储存场所

2. Cache系统中存在写入模块A,可以包括多个实例,读取模块B可以包括多个实例。

3. Cache是两类模块的数据中转的地方

4. 模块A仅仅需要知道cache, 模块B也仅仅需要知道cache的存在,他们相互间不需要相互了解。

七. Cache及buffer相同点

1. Cache及buffer都可以存储一定的数据

2. Cache及buffer存储的数据一般都是临时性的,不是永久性的

3. Cache及buffer系统中都存在若干模块的实例,一般至少需要两类模块的存在,模块A写入数据(生产数据),模块B读取数据(消费数据)

八.Cache及buffer的区别

1. Buffer中,写入模块及读取模块之间是通过buffer做的间接连接,两个模块的特定实例之间是存在耦合关系的。

2. Buffer一般是特定实例对之间专有的,其他实例不应该访问否则有可能造成问题,除非逻辑上做了处理。

3. Buffer中数据一般是有顺序的,写入顺序及读取顺序之间需要一定的对应关系。双方必须按照约定进行相应的读取操作。

4. Cache是个共享的方式, 写入模块实例不需要了解读取模块的任何实例

5. Cache系统中各个实例之间只有同cache本身的耦合关系

6. Cache数据的写入及读取都是没有顺序的

7. Cache一般存在有效期,buffer没有,一般buffer都是专用的,buffer中数据有效期由专有实例管理就好了。Cache中数据过期后将由cache进行淘汰出去。