【操作系统】文件 目录

来源:互联网 发布:淘宝网html源码下载 编辑:程序博客网 时间:2024/06/06 10:43

文件分为二进制文件和ascii码文件,不论哪一种,最终都是以二进制的形式存储在磁盘上的。

磁盘在上一节介绍了,文件最终存放在磁盘的分区上,每一个分区又是分为很多的扇区,若干的扇区最终组成一个块,操作系统与磁盘交互是以块为单位进行的。所以在操作系统眼中,磁盘是以块为单位组织的,每一个块有块号。所以,文件存储的实现最重要的问题是搞清楚文件存放在哪些块上。关于文件与块的对应或者分配有如下四种方式:

1.连续分配,即把一个文件存入连续的几个块中,这种方法的弊端在于当删除文件以后,会残留空隙,空间利用率不高。


2.链表分配方式:把每一个块的第一个存储空间用作指向该文件下一个块的地址的指针,余下的部分存储文件。这样可以解决碎片问题,但是定位其中的某一块只能顺序查找,效率很低。



3.磁盘快的链表:为一个磁盘的所有块维护一个列表,每一个块对应一个表项,表项的内容是该文件的下一个块的号。这样表项之间形成了一个链表。当定位一个中间的块时,虽然也需要顺序查找,但是这个磁盘的链表可以加载到内存中,这样速度很快。相比较前面的链表方式,前面的链表是存在磁盘上的,所以读取很慢。



这个方法的弊端在于一般的磁盘空间很大,所以表项会很多,占用很多的内存空间。

4.inode:每一个文件都有一个inode节点,存储了该文件的一些属性信息和文件的磁盘块号。每打开一个文件就加载该文件的inode入内存。每一个inode节点的存储空间是固定的。这样打开多少文件就有多少inode在内存,相比于上一个方案,节省了很多空间。那么有一个问题,因为文件所需磁盘块数目是不一定的,为什么inode节点的大小是固定的?确实,一旦inode大小固定,所存储的磁盘块号数目就固定,可以让最后一个地址条目不存磁盘块好,而是存一个地址,这个地址存储了剩余的磁盘块块号。


至此,文件存储大致结束。

下面是目录的实现。

磁盘上存的都是二进制,所以目录算是一个特殊的文件,该“文件”的内容是固定的,目录文件存的是一个一个的目录项,每一个目录由目录名和一个指针或者inode号组成,总之第二项必须能够定位到这个名字的文件或者目录的地址和其他相关信息。通常,目录项的大小是固定的,但是文件名长度不固定,如何保证目录项大小固定?可以让目录项的第一个元素是一个指向string的指针,string就是文件名,可以分配在堆上。


这就固定了。


剩下的一个问题是,给定了一个路径,如何定位到这个路径指示的文件的磁盘块号。首先根目录的inode在磁盘的固定位置,因此总是可以找到根目录,在根据第二级目录名在根目录文件中找到对应的目录项,就可以找到二级目录的inode号,也就找到了二级目录文件的位置,以此类推。


最后附上一个很好的体现了文件系统中各个概念的图:



软链接和硬链接:

硬链接指的是让另一个路径名指向同一个inode块。inode块的引用数目加一。

软链接指的是一种特殊的文件,存储了另一个文件的物理地址的文件,它有自己的inode块和数据块,只不过数据块存储的是另一个文件的地址。


原创粉丝点击