=Start=
缘由:
在复习Linux的内存相关知识时想到的问题,Buffer和Cache分别是什么?又有哪些区别和联系?
正文:
参考解答:
首先从翻译上,Buffer应该翻译为“缓冲”,Cache应该翻译为“缓存”,两个完全不是一个东西。
从硬件这一层来看,Buffer应该为内存,Cache为CPU集成的高速缓存。
- Buffer是为了让不同速度的设备能够同步,建立的一个缓冲区域,写进Buffer的数据是为了从中拿出写入其他设备。
- Cache是为了提高读取速度,将经常或马上需要的数据预读到缓存中,写进Cache的数据是为了其他设备从中去读取。
从软件这一层来说,Buffer是块设备的缓冲,Cache是文件系统的缓存。以Linux为例:
- Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。
- Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。
总而言之,Buffer里面的东西是为了写到别处去,Cache里面的东西是为了给别处读。
cache
cache 就是缓存的意思。当系统读文件的时候,都是把数据从硬盘读到内存里,因为硬盘比内存慢很多,所以这个过程会很耗时。为了提高效率,Linux 会把读进来的文件在内存中缓存下来(因为读取相近部分的内容是程序很常见的情况),即使程序结束,cache 也不会被自动释放。所以呢,如果有程序进行大量的读文件操作,你会发现内存使用率就上去了。
不过也不用担心,如果其他程序使用要使用内存的时候,linux 也会把这些没人使用的 cache 释放掉,给其他运行的程序使用。当然你也可以手动去释放掉这部分内存:
echo 1 > /proc/sys/vm/drop_caches
buffer
buffer 的意思和 cache 相近,不过稍有区别。考虑内存写文件到硬盘的过程,因为硬盘太慢了,如果内存要等待数据写完之后才继续后面的操作,实在是效率很低的事情,也会影响程序的运行速度。所以就有了 buffer,写到硬盘的数据会放到 buffer 里面,内存很快把数据写到 buffer,可以继续其他的工作,而硬盘可以在后台慢慢读出 buffer 中的数据,保存起来。这样就提高了读写的效率!
讲一个大家会经常遇到的例子,当我们把电脑里中的文件拷贝到 U 盘的时候,如果文件特别大,大家会遇到这种情况:明明看到文件已经拷贝完了,但系统还是会提示 U 盘正在使用中。这就是 buffer 的原因,拷贝程序把东西放到 buffer 之后,但是 U 盘还没有写完。
同样的,可以手动来 flush buffer 的内容,使用的命令是:
sync
Page Cache和Buffer Cache的区别
Page Cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。
Buffer Cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。
简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
参考链接:
- Buffer与Cache
http://www.penglixun.com/tech/system/buffer_and_cache_diff.html - Page Cache和Buffer Cache的区别
http://www.penglixun.com/tech/system/the_diffrents_of_page_cache_and_buffer_cache.html - 通过 free 命令理解 linux 内存管理
http://cizixs.com/2015/10/01/linux-memory-management-through-free - Meaning of the buffers/cache line in the output of free
http://serverfault.com/questions/85470/meaning-of-the-buffers-cache-line-in-the-output-of-free - In Linux, what is the difference between “buffers” and “cache” reported by the free command?
http://serverfault.com/questions/23433/in-linux-what-is-the-difference-between-buffers-and-cache-reported-by-the-f - Linux memory: buffer vs cache
http://stackoverflow.com/questions/6345020/linux-memory-buffer-vs-cache - The buffer cache
http://www.tldp.org/LDP/sag/html/buffer-cache.html - 【linux】free命令中cached和buffers的区别
http://www.cnblogs.com/chenpingzhao/p/5161844.html - Linux Cache 机制探究
http://www.penglixun.com/tech/system/linux_cache_discovery.html
=END=
《 “Buffer和Cache” 》 有 3 条评论
缓存那些事
http://tech.meituan.com/cache_about.html
在 Linux 上如何清除内存的 Cache、Buffer 和交换空间
https://linux.cn/article-5627-1.html
http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/
为什么手工drop_caches之后cache值并未减少?
http://linuxperf.com/?p=201
free命令显示的buffers与cached的区别
http://linuxperf.com/?p=32