看了鸟哥私房菜中Linux的文件系统,现在把我理解的写下来。很多问题还是一知半解。期望以后有更深的理解。
我个人认为操作系统在管理数据时是以文件为单位对数据进行储存和管理的。(这只是我觉得而已,欢迎指正)
文件系统,当然是用来管理文件的啦。操作系统的文件除了实际的内容外还含有许多属性。比如Linux操作系统中的文件权限(rwx)与文件属性(u,g,o,时间参数等)。
如果要你来设计怎么管理文件。也许你和我初步的想法一样。直接把逻辑上属于一个文件的数据直接往磁盘上放啊。就像一个邋遢的男孩子,衣服都是一团直接塞进柜子里。只要柜子里还要空间就还可以塞衣服。这样只是放下了文件的实际内容,那还要文件附带的属性呢?也许你也会和我当初想得一样。把文件的各种属性用约定的格式和字符直接写在文件实际内容的开头处啊。那还有一个问题。我们应怎么知道这个文件从哪儿开始从哪里结束呢?数据又不是真的像衣服一样,你抓住衣服的一部分就可以扯出整件衣服。也许你又想到了,我们可以在文件中表明啊。好吧就算这样,我们总结一下这个初步的、原始的文件系统的特征。
一个文件包含一下内容:
一个特殊的文件标志。(要不你怎么识别它是不是文件,磁盘中有多少个文件?)
文件的开始和结尾处。
一堆属性标志。
文件的实际内容。
以上就是我们的文件系统。我们再想象一下。如果你柜子里的衣服也像这样是一团一团的塞进去的。你要找一件衣服是不是得要翻动其他你不需要找的衣服。(因为你的衣服是塞在一起,也许你要找的衣服塞在最底下。)如果计算机要访问上面文件系统中的数据还不得经过一些不需要访问的文件才能找到需要的文件,这太慢了吧。磁盘中的文件数总比衣柜中的衣服数量多吧!这是不可忍受的。
聪明一点女主人可能会这样管理自己的衣柜。一般的衣柜都会分成几个区域(我们把磁盘分成几个区)。每放进一件衣服就记下这件衣服放在什么地方,柜子里的哪个区域还有多大的空间,还可以放多少衣服。这时候女主人已经在脑子里把什么衣服放在什么位置,还有多大空间都记住了。当然人的记忆不是万能的。在下次放进一件衣服的时候女主人需要观察柜子的那个位置还有足够大的空间放下手里的衣服。放下衣服后再大致记一下柜子里的状况。如果有心情还可用笔记下来什么衣服放在什么位置了。毕竟人的记忆力不是一直可靠的。
这样女主人找衣服的时候效率是不是大大的提高了。因为女主人记得什么衣服放在什么位置,直接拿就好了。女主人脑子里记的什么衣服放在什么位置可以叫做索引。
索引式文件系统也一样。文件系统将自己管理的磁盘空间分为两块,一块叫inode块(有很多inode),一块叫block块(有很多block)。
block:记录文件实际的内容,如果一个文件太大会占用多个block。
inode:记录文件的各种属性,同时记录文件的实际内容所在的block号码。一个文件对应一个inode。
这样要访问哪个文件只需要找到相应的inode,再根据找到的inode记录的block号码去block块找相应的block就找到文件的实际内容了。类似于女主人在找衣服时会先在脑子里想想这件衣服放在柜子里的哪个位置,然后直接去相应的位置拿衣服。
不过还有一个问题。女主人在放衣服到柜子里时只需要用眼睛看看一看柜子里还有没有足够的位置放下手中的衣服。而文件系统怎么知道自己还有没有空间放新的文件呢?这样第三个块了,这个块叫super block用来记录还有没有位置。
super block:记录文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件格式与相关信息等。
这样每次放心文件进就去super block查有没有空余inode和block就行了。
这样文件系统将自己管理的磁盘空间分为三块,分别是super block块、inode块,block块。
需要注意的inode块中有很多inode,block块中也有很多block,每个inode和block都是编号的。系统中没放入一个新的文件或新建一个文件只用一个inode,而inode中记录的数据是文件实际内容所在的block块编号。如果文件太大,一个block放不下,就放在多个block中,这样这个文件对于的inode中就记录了多个block号码。访问一个文件时只需要找到这个文件对应的inode自然就知道这个文件实际内容所在的block号码了,当然也就能读出文件的实际数据了。由于寻找文件时只需要在inode块中寻找对于的inode,效率也就大大提高了。
还有一个问题,刚开始是往系统里放文件,当然都是放在连续的block里,可是一段时间后有的文件删除了,就留下了中间的某些block没放内容,而它相邻的block放了内容。这样就会出现一些空隙。就像衣柜里经常拿衣服出来却没有整理,也会留下几个空的。假如我要再往衣柜里放入一件衣服,假如衣服比某个空小就直接放进空里。系统也一样,如果新放入文件时,系统先查查block块中有哪些空隙够大可以放入这个新的文件。如果找到了就放入。如果没找到比文件大的空隙,却有一些小的空隙,就把文件的实际内容分成几块放到不同的间歇对于的block中。(这样慢慢的文件就变得离散了,会影响访问时的效率,后面解释怎么解决。如果空隙很小,后来放入的文件无法利用也会造成空间的浪费。)当然往衣柜里放衣服时我们不会将放不下的衣服撕成几块放到不同的空隙中(也许笨蛋会这么做)。
假如你有一件大的棉袄必须放进柜子里,而柜子里的没个空隙都只能放下一条内裤。也许这几个空隙加起来可以放下这个棉袄。这时候你怎么办?前面说过我们不能把棉袄撕成几小块吧。我们常做的是把柜子里所有的衣服重新摆好,也许你要做的只是把所有的衣服从左边推到右边,把空隙都压没了,左边就留出一个大空隙可以放棉袄。前面提到过文件过于离散会影响访问效率。衣柜可以整理,文件系统也一样。将文件对应的block也移动一下,尽量把空隙消灭。同时更新inode块里的记录。这样不就可以留出更大的空间放入更大的文件了,同时提高文件的访问效率了。其实这就叫磁盘碎片整理。
以上只是我暂时的理解。实际上我也有解释清楚inode和block是什么。在我脑子里这和磁盘分区、格式化有关。这好像也涉及到系统能利用的最小磁盘空间单位。
以后我还会修改的。
如有拍砖,不甚荣幸!