性能优化--面试官问缓冲与缓存有什么区别?

Posted changyandou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能优化--面试官问缓冲与缓存有什么区别?相关的知识,希望对你有一定的参考价值。

在软件系统中谈到数据复用,首先想到的就是缓冲和缓存,两者意义完全不同。

缓冲(Buffer):常见于对数据的暂存,然后批量传输或者写入, 多使用顺序的方式,用来缓解不同设备之间频繁地、缓慢地随机写。

缓存(Cache):常见于对已读数据的复用,通过将它们缓存在相对高速的区域,缓存主要针对的是读操作。

缓冲区是解决速度差异的唯一工具。但是,在极端情况下,比如断电时,这些缓冲区容易丢。

直观上来讲, 缓冲可以说是一种机制,一种思路或者一种技术。但是缓存所指的Cache和缓冲区在计算机组成中都可以找到对应的硬件支持。

在百度百科中可以看到对缓冲技术有这样一种说明,如下图:

另外,还有以下两种形象的比喻可以用来进行辅助理解:

可以把缓冲区想象成一个蓄水池,放水的水龙头一直开着,如果池子里有水,它就以恒定的速度流淌,不需要暂停。而供水的水龙头,速度却不确定,有时候会快一点,有时候会特别慢。通过判断水池里水的状态,就可以自由控制进水的速度。

也可以比作包饺子,擀饺皮的把饺皮擀出来给包饺子的,这样一进一出,就慢。如果在中间放一个盆。擀饺皮的把饺子皮放到盆里。包饺子的人只管从盆里取。这样效率就会快很多。


缓冲区的目的:

  • 缓冲双方各自保持自己的操作节奏,操作处理顺序也不会打乱,可以one by one顺序进行

  • 以批量的方式处理,减少网络交互和繁重的I/O操作,从而减少性能损耗

  • 优化用户体验,比如常见的音频/视频缓冲加载,通过提前缓冲数据,达到流畅的播放效果


从软件的角度,

宏观上讲,JVM的堆就是一个大的缓冲区,代码不停地在堆空间中生产对象,而垃圾回收其进程则在背后默默地进行垃圾回。

缓冲在java中被广泛应用,在idea中搜索 buffer可以看到常常的类列表,其中最典型的就是文件读取和写入字符流。

从硬件的角度看,

为了屏蔽设备之间的差异,每个设备都有一个叫设备控制器(Device Control)的组件,比如硬盘有硬盘控制器、显示器有视频控制器等。

因为这些控制器都很清楚的知道对应设备的用法和功能,所以CPU是通过设备控制器和设备打交道的。设备控制器里有芯片,它可执行自己的逻辑,也有自己的寄存器,用来与CPU进行通信,比如:

  • 通过写入这些寄存器,操作系统可以命令设备发送数据、接受数据、开启或关闭,或者执行某些其他操作

  • 通过读取这些寄存器,操作系统可以了解设备的状态,是否准备好接收一个新的命令等。

输入输出设备分为两大类:块设备(Block Device)和字符设备(Character Device)

块设备通常传输的数据量会非常大,于是控制器设立了一个可读写的数据缓冲区

  • CPU写入数据到控制器的缓冲区时,当缓冲区的数据囤够了一部分,才会发给设备。

  • CPU从控制器的缓冲区读取数据时,也需要缓冲区囤够了一部分,才拷贝到内存。

这就结合实际的I/O设备中对于缓冲的应用进一步加深对于缓冲的理解。

(注:我会尽量的渗透关于硬件知识的补充,来更深入理解软件运行的原理)

微型机的主要组成部件:

  • 主板

  • CPU

    • 通用寄存器

    • 专用寄存器

      • 数据缓冲寄存器(这里的数据缓冲寄存器(MDR),用来暂时存放由主存中读出的指令或数据或者写入主存的指令或数据,即CPU要写入主存单元的数据先送入MDR中,再从MDR送入主存响应的单元中;同样,从主存单元中读出数据时,先送入MDR中,再送入CPU指定的寄存器。所以MDR可作为CPU和内存,外部设备之间信息传送的中转站。)

      • 指令寄存器

      • 程序计数器

      • 状态字寄存器

    • 运算部件(ALU)

    • 寄存器组(用来保存从存储单元中读取的指令或数据,也保存来自其他各部件的状态信息)

    • 控制器(EU)

  • 存储器

    • 主存(主存储器,简称主存,因为主存一般在主机之内,所以又称内存)

    • 高速缓存(高速缓冲存储器)

    • 性能优化--面试官问缓冲与缓存有什么区别?

    • 辅存(辅助存储器)

上述的内容,主要描述的是对于缓冲技术和缓冲寄存器这种硬件在计算机中的应用的理解?

到这儿如果面试官继续问一个问题,缓存是什么,高速缓存中的缓存和Redis这种我们平时用的分布式缓存有什么区别和联系?