超级块、索引节点区和数据块区
超级块、索引节点区和数据块区,什么关系都存放哪些东西?
我们都知道的是,磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。
-
超级块,存储整个文件系统的状态
-
索引节点区,用来存储索引节点
-
数据块区,则用来存储文件数据
今天来讨论一下为什么这么设计,先想象一下自己一个商场的老板,应该怎么管理自己的商场。
先看不变的东西,房间数,房间大小等等。再看变的东西,比如房间里面的物品等等。
我作为老板第一应该关心,有多少个房间数,每个房间大小,多少房间是空的,多少房间是满的,有没有坏了的房间。
这些资料放哪里呢,首先我需要一个自己的办公室。我需要随手就能看到。
这个就是超级块,存在整个文件系统的状态情况。
第二 我就应该关心一下我的物品了,那我应该怎么管理我的物品呢,我需要给我每个物品做一个档案,包括编号,大小等等。
这些档案需要放到一个档案室里面,放在哪个店面。
档案对于我来说会很多,不可能直接放置到我的办公室里面,只有存在档案室。
这个就是索引节点区,可以这里迅速找到我们的物品在哪个房间。
第三就是具体的店面了,我的真实的物品都放置在我的店面里面,这个就是数据块区。
通过这个例子大家是不是可以快速理解文件系统的编排了。
官方解释:
超级块,是文件系统中的第一个块,用来存放文件系统本身的信息,比如可以用于记录每块区域的大小;
索引节点区,每个文件对应索引节点区中的一个块,我们称为索引节点,也就是 Inode,存放每个文件中所用到的数据块的地址,Inode 也是元数据主要存储的地方;
数据块区,也就是 Data Blocks,这里是真实数据存放的区域,一个文件的 inode 可能存有多个指向数据块的指针。
image.pngbuffer和cache
回归本质:cache叫缓存,buffer叫缓冲。
- buffer是啥呢?疫情来了多储备点粮食在家里,这个是啥,就是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。
网友评论