安全气囊给我来了个缓存
见字如面,小伙伴们大家好呀,我是小牛肉~ 写这篇文章的起因主要是最近复习计网滑动窗口中看到的一句话 “窗口的本质是内核缓冲区”,之前一直没有仔细去理解,以为就是缓存,很多博客写得也是缓存......,But 缓冲和缓存在概念上其实是有区别的。本篇文章就先来解释下这俩概念上的区别,为后续内核缓冲区铺下垫
缓冲和缓存英文单词完全不一样,因为翻译问题,很容易被混淆。。。。。
可以说安全气囊给你来了个缓冲,能说安全气囊给你来了个缓存吗?
滑稽
缓存(cache
):是为了弥补高速设备和低速设备的鸿沟而引入的中间层,主要目的就是基于时间局部性原理,将常用的数据放到访问速度更快的缓存中,从而最终起到加快访问/读取速度的作用。
缓冲(buffer
):主要目的进行流量规整,把很多个规模较小的 IO 整理成少数个较大规模的 IO,以减少响应次数(比如从网上下电影,不是下一点数据就写一下磁盘,而是积攒一定量的数据以后一整块一起写)。
具体来说,缓冲是为了解决生产者和消费者速度不均匀的问题,而在生产和消费者之间设立的一个缓和区、平衡区。
比如你网上冲浪在线看视频,一开始我们往往能看到下面这个界面:
其实就是视频控件先预加载几秒的视频资源到缓冲区中,看视频的你是资源消费者,你消费视频的速率肯定是稳定的,但是视频加载的速率由于网络(生产者)的波动可能时快时慢。
如果刚开始先预加载几秒资源缓冲区,就算有一两秒网络拥塞了,视频可以从缓冲区中取资源,还能顺畅播放一会,如果网速给力,等不到缓冲区中的资源被消费完,就会有更多的资源被下载进缓冲区中,资源在缓冲区中就会越积越多。
当然,如果缓冲区满了,就会暂时停止加载,等你消费的缓冲区空出一部分了,再继续开始加载。
这样虽然视频的下载速度是波动的,但对你是透明的,你看到的视频是从缓冲区中稳定地等速率拿的。
再举个例子,从网上下载大文件到磁盘上的的时候,block(块)是操作系统中最小的逻辑存储单位,操作系统与磁盘打交道的最小单位就是磁盘块,就比如一个 block 是 4KB 吧
下载文件的时候肯定是一连串的字符,所以这时,你要把数据写到磁盘上,就要先准备好足够填充一个 block 的数据(4KB),然后写入一个 block,再准备 4KB 的数据.....,而不是每次准备好了一个字节的数据,就马上写到磁盘里,这样对于磁盘的写操作实在是太频繁了。
这时候,下载文件的你是生产者,磁盘是消费者,磁盘以每次 4KB 的稳定速率进行消费数据,而你生产数据是一个字节一个字节地生产,这时就需要一个缓冲区,暂时存放那些还没攒够 4KB 的数据。
所以说,当断网或者断电的时候,缓冲区中的数据是会丢失的
上张图看下有无 buffer 的对比图:
简单来说,Cache 是把最常用的东西放在最容易拿到的地方,这样你可以少走一点路;而 Buffer 就跟个垃圾桶一样(有点不恰当了哈),你平时的垃圾先扔在垃圾桶里,等垃圾桶满了再扔垃圾,这样减少你扔垃圾的次数。
Tip:学虚拟地址到物理地址转换的时候,我们一定知道 TLB(转换检测缓冲区,Translation Lookaside Buffer),TLB 中存放的就是那些会被反复读取的页表项。所以,这里名字起得有些偏颇,TLB 起到的其实是 Cache 的作用。
心之所向,素履以往,我是小牛肉,小伙伴们下篇文章再见 👋