Cache和Buffer的区别
1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。
Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。
2. Buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据;通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。
Buffer:一般是用在写入磁盘的,例如:某个进程要求多个字段被读入,当所有要求的字段被读入之前已经读入的字段会先放到buffer中。
buffer cache
又称bcache,其中文名称为缓冲器高速缓冲存储器。oracle数据库的本质就是能够用磁盘上的文件来存储数据,并提供了各种各样的手段对这些数据进行管理。作为管理数据的最基本要求就是能够保存和读取磁盘上的文件中的数据。众所周知,读取磁盘的速度相对来说是非常慢的,而内存相对速度则要快的多。因此为了能够加快处理数据的速度,oracle必须将读取过的数据缓存在内存里。而这些缓存在内存里的数据就是数据高速缓存区(db buffer cache),通常就叫做buffercache。按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝。通过初始化参数:buffer_cache_size来指定buffercache的大小。oracle实例一旦启动,该区域大小就被分配好了。buffer cache的内容对应磁盘上一个块(block),块通常为1K,都是连续的
Buffer cache简介
1、结构:Buffer Cache是SGA的一部分,Oracle利用Buffer Cache来管理data block,Buffer Cache的最终目的就是尽可能的减少磁盘I/O。Buffer Cache中主要有3大结构用来管理Buffer Cache。
Hash Bucket & Hash Chain List:Hash Bucket与Hash Chain List用来实现data block的快速定位。
LRU List:挂载有指向具体的free buffer, pinnedbuffer以及还没有被移动到write list的dirty buffer等信息。所谓的free buffer就是指没有包含任何数据的buffer,所谓的pinned buffer,就是指当前正在被访问的buffer。
Write(Dirty)List:挂载有指向具体的dirtyblock的信息。所谓的dirty block,就是指在buffer cache中被修改过但是还没有被写入到磁盘的block。
2、功能:
1)通过缓存数据块,从而加快对磁盘上数据的访问,减少I/O。
2)通过构造CR块,从而提供读一致性功能。
3)通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能。
3、大小:buffer cache的内容对应磁盘上一个块(block),块通常为1K,都是连续的。在linux下,为了更有效的使用物理内存,操作系统自动使用所有空闲内存作为BufferCache使用。当程序需要更多内存时,操作系统会自动减小Cache的大小。
在linux下,可通过命令cat /proc/meminfo和free-m查看buffer cache的内存使用情况.
在从外存的一页到内存的一页的映射过程中,page cache与buffer cache、swap cache共同实现了高速缓存功能,以下是其简单映射图:
外存的一页(分解为几块,可能不连续)——物理磁盘的磁盘块——内存的buffer Cache——内存的一页(由一个页框划分的几个连续buffer cache构成)——页高缓系统
在这个过程中,物理文件系统与Buffer Cache交互,负责在外围存储设备和Buffer Cache 之间交换数据。
由于bcache位于物理文件系统和块设备驱动程序之间,因此,当物理文件系统需要从块设备上读取数据时,它首先试图从bcache中去读。如果命中,则内核就不必在去访问慢速的块设备。否则如果命中失败,也即数据不在bcache中,则内核从块设备上读取相应的数据块,并将其在bcache中缓存起来,以备下次访问之用。
类似地,但物理文件系统需要向块设备上写数据时,也是先将数据写到相应的缓冲区中,并将这个缓冲区标记为脏( dirty ),然后在将来的某些时候将 buffer cache 中的数据真正地回写到块设备上,或者将该缓冲区直接丢弃。从而实现减少磁盘写操作的频率。