Buffer的中文意思是“缓冲,缓冲区”,Cache是“缓存”。他们之间有什么区别和联系呢?这确实是个让人为难的问题,也比较容易产生争议,我和一些朋友们也私下讨论过很多遍,可终究还是没有统一结果。本文我将就这个问题说说自己的理解。
从两者的作用来说:
- Buffer:侧重于“缓冲”。什么是缓冲呢?举个例子:我国的长江水量分配不均,有的时候水流比较大,容易造成洪灾,这时就可以通过在其途中修建堤坝,以平缓迸发的水流,降低它对下游的冲击,这是堤坝起到的作用就是缓冲。
- Cache:很明显它侧重与“存”。还是上面例子,不过这时堤坝的作用主要就体现在“蓄水”,以保证在干旱时候的水源“补给”。可见“存”的最终目的也是为了“取”,所以Cache是为了提高“取”的效率而存在的。
从操作的对象来看:
- Buffer:一般侧重于“流”。
- Cache:倾向于对“具体对象”的操作,比如说一张图片、一个茶杯等。
有人认为,在Linux系统上(
注意:这种说法是不妥的,请看"")
- Buffer:与写磁盘相关。
- Cache:与读磁盘相关。
并以此区分free输出结果中的Buffers和Cached。事实上,这种简单的区分方法是有效且符合实际的。这也与我们开头所讨论的Buffer和Cache在作用上的差别相符,Buffer是为了降低“频繁”的写操作对磁盘的冲击,Cache是为了提高“读”的效率(尤其是重复内容)。我们还可以根据这个推广开来:Buffer应用于从高速设备到低速设备数据转移操作,Cache适用于满足“局部性原理”的从低速设备到高速设备的数据转移操作。
提到Linux内核,不免多说两句:其中基于slab的内存缓存(kmem_cache_t)并没有统计在free命令输出的Buffers或Cached中,它属于内核内存部分,不能交换,但是可以在系统内存不足的时候,通过释放掉处于空闲(free)状态的slab结构来调度内存给操作系统的其他部分。
Buffer和Cache通常也是联系在一起的,这表现在它可能属于同一事物的两个不同面。比如,我们通常用于加速网页读取的squid就是一个面向网络文档对象的缓存服务器,但是如果我们把它置于网页服务器的前端,那么它对于网页服务器起到的作用就是“缓冲”。同一个事物,由于观测角度或侧重点的不同,得出的结论也往往不同。
不知道你是否多少明白了些,其实也没有必要这么较真,两者换用也未尝不可!
阅读(1846) | 评论(0) | 转发(0) |