文件系统中目录和文件的理解
在最开始的开始,让我们了解一下两个事实:
1、目录文件和普通文件都是文件
2、操作系统想要管理这些文件,就需要得到两个东西,目录项(有时候也叫FCB)和文件内容
其中目录项存放三个主要的内容:文件的名字,ID号,文件内容在物理设备的存储地址。
那操作系统里的文件系统是怎么处理这些事务的。
以Unix操作系统为例:
不管是读文件,写文件,还是删除文件,重命名文件。最开始都需要查找到这个文件。
怎么查找到这个文件呢?我们会提供一个文件名,这个文件名再加上路径的话作为这个输入。有人疑惑,我没有加文件名啊,没加就是进程提供的当前文件夹,你提供的是相对路径名。绝对路径会从根目录进行查找,相对路径会从当前目录查找。
假设,路径名+文件名,是一个从根目录到当前的文件的全路径。
所以,从根文件开始找。我们来看张图:
可以看到,根文件里面存放的内容是一块块的记录,术语叫目录项,在实际的Unix文件系统中,这个里面存放着文件号和文件名。
你一定疑惑了,这里你明明刚刚说的是存放的是文件号呢,那假如在根目录下放了一个目录呢,怎么办呢?在本文的一开始,我们就说了,不管是普通文件,还是目录,在文件系统眼里,那都是文件。
你又说了,怎么去找这个根文件呢?
是的,文件系统中的分区内容里面,专门划分一块存储区域用来存储根目录。好了,现在,我们找到了起点。
接下来就会在根目录的文件内容里面查找下级目录,然后再读取下级目录的内容,查找一下下级目录的内容。如第一张图所示。
就这样,一步步,到最后一级目录。这个最后一级目录文件的内容,可能存放者目录文件的目录项,也可能存放者普通的文件的目录项。
如果此次不是最后一级目录的话,依然会找下去,有没有像递归的感觉。
如果存放的是普通文件的目录项的话,就会得到这个文件存放的物理地址,从而就能拿到文件的内容。这个查找过程就结束了。
相信大家通过一次文件的查找,对目录和文件在整个文件系统扮演的角色有了一些认识。
再说细一点,Unix为了提高查找效率,将目录项拆分成两个部位,一个是符号目录项,符号目录项只放两个值,一个名字,一个是文件号,而基本目录项(叫做Inode,这个你可能熟悉)存放的是文件号和其他信息(其他信息包括文件的具体内容,如果是目录文件的话,内容就是一个个目录项,如果是文件的话就是一个具体的文件内容了)。
现在的查找,只需要根据文件名查找符号目录项就行了。然后,就知道了文件号,知道了文件号,就去知道了Inode里面存放的所有信息,当然包括文件的存放地址,知道了存放地址,里面是啥内容就知道了。
如有错误,欢迎更正。
感谢:公开课:北京大学 《操作系统》——陈向群。文中所有截图都来自该公开课,视频地址(建议1.5倍播放):