收藏

【文件系统】buffer和cache的区别和联系

2023-07-12  本文已影响0人  Bogon

超级块、索引节点区和数据块区

超级块、索引节点区和数据块区,什么关系都存放哪些东西?

我们都知道的是,磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。

今天来讨论一下为什么这么设计,先想象一下自己一个商场的老板,应该怎么管理自己的商场。

先看不变的东西,房间数,房间大小等等。再看变的东西,比如房间里面的物品等等。

我作为老板第一应该关心,有多少个房间数,每个房间大小,多少房间是空的,多少房间是满的,有没有坏了的房间。
这些资料放哪里呢,首先我需要一个自己的办公室。我需要随手就能看到。
这个就是超级块,存在整个文件系统的状态情况。

第二 我就应该关心一下我的物品了,那我应该怎么管理我的物品呢,我需要给我每个物品做一个档案,包括编号,大小等等。
这些档案需要放到一个档案室里面,放在哪个店面。
档案对于我来说会很多,不可能直接放置到我的办公室里面,只有存在档案室。
这个就是索引节点区,可以这里迅速找到我们的物品在哪个房间。

第三就是具体的店面了,我的真实的物品都放置在我的店面里面,这个就是数据块区。

通过这个例子大家是不是可以快速理解文件系统的编排了。

官方解释:

超级块,是文件系统中的第一个块,用来存放文件系统本身的信息,比如可以用于记录每块区域的大小;

索引节点区,每个文件对应索引节点区中的一个块,我们称为索引节点,也就是 Inode,存放每个文件中所用到的数据块的地址,Inode 也是元数据主要存储的地方;

数据块区,也就是 Data Blocks,这里是真实数据存放的区域,一个文件的 inode 可能存有多个指向数据块的指针。

image.png

buffer和cache

回归本质:cache叫缓存,buffer叫缓冲。

很多解释,cache会为了提高读性能,buffer是提高写性能,想想这个是为什么?
相当于一个是取出来给客户,一个把客户东西给自己放仓库。

cache经常是读,读是要去提供给用户的所以必须要快。就需要把经常用的东西放到手边。

buffer是写,是为了放东西放到仓库,攒一起在放就行。
因为写成功相当于我给你一个东西,你可以先放到一个最低的地方,等攒够了一起放到仓库里面。
只要跟用户说,收到了。

在日常工作想想redis等为了提高读的性能,cache命中率。
肯定不会为了写性能,因为如果是一个写操作的话几乎都是新的东西,肯定命中不了。

不过在网盘这种写多读少场景下,一般的操作都是都会把数据积攒到了一定规模之后在去写盘。

Linux内存中的buffer和Cache

image.png

理论上来说,读一个文件,首先到Block Buffer, 然后到Page Cache。
有了文件系统才有了Page Cache.在老的Linux上这两个Cache是分开的。
那这样对于文件数据,会被Cache两次。这种方案虽然简单,但低效。后期Linux把这两个Cache统一了。

对于文件,Page Cache指向Block Buffer,对于非文件则是Block Buffer。
这样就如文件实验的结果,文件操作,只影响Page Cache,Raw操作,则只影响Buffer.
现在如果有些操作不直接用文件系统其实影响的就是buffer这个,比如一些VM虚拟机,则会越过File System,只操作 Disk, 常说的Direct IO。

上一篇 下一篇

猜你喜欢

热点阅读