缓存(cache)与缓冲(buffer)

相关文章:

 

《MySQL:更新过程(buffer pool与redo、bin、undo log)》

《Redis:持久化RDB与AOF》

《Java8之BufferedInputStream源码》

        写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。

        本文属于临时起意写的,仅作为备忘录使用,内容比较少,后续有机会的话可能会做一些补完。

目录

一、Cache

        1、Page Cache

        2、CPU Cache

二、Buffer

三、Cache 和 Buffer的区别


一、Cache

        在现代计算机系统中,CPU,RAM,DISK的速度不相同。CPU与RAM之间,RAM与DISK之间的速度差异常常是指数级。为了在速度和容量上折中,在CPU与RAM之间使用CPU cache以提高访存速度,在RAM与磁盘之间,操作系统使用page cache提高系统对文件的访问速度。

        1、Page Cache

        在之前的文章中有介绍过内存中的数据写回磁盘的策略:

        (1)在MySQL中redo log的写回

        (2)在Redis中AOF文件的落地:缓存(cache)与缓冲(buffer)_第1张图片

         我们都提到了可以利用操作系统的缓存来临时存储将要写回磁盘的数据,这个缓存空间被叫做磁盘高速缓存(Page Cache)。       

        操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到CPU的二级和一级高速缓存中。

        不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存在逻辑上属于磁盘,物理上则是驻留在内存中的盘块。

        高速缓存在内存中分为两种形式:一种是在内存中开辟一个单独的存储空间作为磁速缓存,大小固定;另一种是把未利用的内存空间作为一个缓沖池,供请求分页系统和磁盘I/O时共享。

        2、CPU Cache

        首先,我们都知道现在的CPU多核技术,都会有几级缓存,老的CPU会有两级内存(L1和L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示:

缓存(cache)与缓冲(buffer)_第2张图片

        其中:

  • L1缓存分成两种,一种是指令缓存,一种是数据缓存。L2缓存和L3缓存不分指令和数据。
  • L1和L2缓存在每一个CPU核中,L3则是所有CPU核心共享的内存。
  • L1、L2、L3的越离CPU近就越小,速度也越快,越离CPU远,速度也越慢。

        我们来看一些他们的速度:

  • L1 的存取速度:4 个CPU时钟周期
  • L2 的存取速度: 11 个CPU时钟周期
  • L3 的存取速度:39 个CPU时钟周期
  • RAM内存的存取速度:107 个CPU时钟周期

        我们可以看到,L1的速度是RAM的27倍,但是L1/L2的大小基本上也就是KB级别的,L3会是MB级别的。

       以上就是Page Cache与CPU Cache的基本介绍,可以看出,cache 的作用主要是为了弥补高速设备和低速设备的速度差,最终起到加快访问速度的作用。

二、Buffer

      在之前讲解BufferedInputStream源码的文章里,对buffer已经做了介绍,简单来说就是整合流量,每次读写都进行批量操作。

        引入缓冲区的目的主要有:

  • 缓和CPU与I/O设备间速度不匹配的矛盾。
  • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
  • 解决基本数据单元大小(即数据粒度)不匹配的问题。
  • 提高CPU和I/O设备之间的并行性。

缓存(cache)与缓冲(buffer)_第3张图片

三、Cache 和 Buffer的区别

        1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。

        2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。

        3、假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。

你可能感兴趣的:(杂谈,缓存)