文件管理主要有那些功能?(文件管理概述)

文件管理讨论四点。

第一点是文件内部的数据如何组织?

无结构文件:二进制或数据流
有结构文件:文件内的记录如何被组织?有结构文件分为顺序文件、索引文件和索引顺序文件。
顺序文件的记录在物理上可以顺序存储也可以链式存储。
如果是链式存储,无论是定长还是变长记录,都无法实现随机存取。
如果是顺序存储,则需要讨论可变长记录和定长记录两种情况。可变长无法实现随机存取,而定长可以实现随机存取。同时,如果定长采用串结构,无法快速找到某个关键字对应的记录。而如果采用顺序结构,则可以快速找到某关键字对应的记录。顺序结构增删改都比较困难。
索引文件支持很快的检索速度。对于不定长记录的文件,可以采用索引表,索引表本身是定长记录的顺序文件,因此可以快速找到。可以用不同的数据项建立多个索引表。
索引顺序文件是为了处理索引表过大的情况,索引顺序文件不会为每个记录建立一个索引表,而是将数据项分组,给每个分组建立一个索引表项,分组内进行顺序查找。

第二点是文件之间如何组织?

文件之间是由目录组织的。每个文件夹下,对应一个文件目录表,目录表本质上也是一个有结构文件。每一个目录项里面最重要的信息是文件名和物理地址。目前最常用的目录结构为多级目录结构,从根目录出发的路径为绝对路径,但我们经常要访问同一个文件,如果每次都从根目录开始,读磁盘操作次数会增加,因此我们使用当前目录出发的“相对路径”。(Linux中用.表示当前目录)。为了便于文件的共享,允许不同的文件名指向同一个文件。共享结点设置一个共享计数器,记录此时有多少个地方共享此文件。为了给目录“瘦身”,把出了文件名以外的信息都放到索引结点中,目录项中就只包括文件名和索引结点指针。

第三点是从整个计算机的层次来看,计算机为用户提供哪些功能,方便用户使用?

删除(delete),创建(creat),读(read)写(write),打开(open),关闭。
进程打开一个文件后,会把该文件的目录项复制到内存的打开文件表中,并将对应的编号返回给用户,用户使用打开文件表的编号,指明要操作的文件。系统有一张打开文件表,进程也有自己的打开文件表,里面标注了该进程对于该文件的访问权限。为了便于文件的共享,系统的打开文件表中有一个打开计数器项,标注了当前有多少个进程打开该文件。因此在关闭文件时,需要打开计数器变为0后才可以删除对应表项。
文件共享功能,可以让多个用户使用同一个文件。目前关于文件共享有两种方式,一种是硬链接,基于索引结点,索引结点中设置一个计数器,表示链接到本结点上的用户目录项数;另一种是软连接,基于符号链,就是快捷方式。
关于文件保护,主要有口令保护,加密保护(如异或加密),访问控制,每个文件有自己的访问控制表,记录了不同用户对该文件的访问权限。

第四点是从上往下看,文件数据怎么存储在外存上?

操作系统对磁盘块的管理主要分为两部分,一部分是对空闲磁盘块的管理,一部分是对非空闲磁盘块的管理。
操作系统为文件分配存储空间都是以块为单位的。
连续分配方式是在磁盘中为文件分配连续的物理块,用户给出要访问的逻辑块号,操作系统首先找出文件对应的目录项,目录项中有文件的起始块号,物理块号=起始块号+逻辑块号,从而找到该逻辑块号对应的物理地址。支持直接访问和顺序访问。因为磁头移动距离短,因此连续分配方式读写速度最快。但是不方便文件拓展,会产生难以利用的磁盘碎片。
链接分配采用离散分配的思想。
隐式链接除了最后一个磁盘块外,每个磁盘都保存指向下一个磁盘块的指针。先从目录项找到其起始块号,将第一块读入内存,找到第二块物理地址,以此类推,读取第i个磁盘块。只支持顺序访问,不支持随机访问,但是方便拓展文件。
显式连接把用于链接各物理块的指针显式的存放在文件分配表FAT中,目录项中存放起始块号,由于开机时FAT就常驻内存,因此访问FAT就可以找到对应文件块的物理块号。支持随机访问磁盘。
索引分配中,系统为每个文件建立一张索引表。类似于内存管理中的页表,记录了逻辑块号到物理块号之间的对应关系。目录项中记录的是每个文件的索引块地址,读入内存后找到对应的物理块,支持随机访问。存不下的时候一般用多层索引、链接索引或混合索引。
对于空闲磁盘块的管理,主要有空闲表法、空闲链表法、位示图法和成组链接法。
空闲表法类似于内存管理中的动态分区分配。同样可采用首次适应,最佳适应,最坏适应等算法来决定为文件分配哪个区间。 回收时注意表项合并的问题。
空闲盘块链是以盘块为单位组成一条空闲链,空闲盘区链是以盘区为单位组成一条空闲链。
位示图,每个二进制代表一个盘块是否已经分配,因此可以用(字号,位号)对应一个盘块号。比如用0代表未分配,要分配时则找到连续的n个0。
Unix系统中采用成组链接法,适合大型文件系统。第一个超级块记录下一组空闲盘块的数量和盘块号,以类似于索引的方式找到下一个分组的各个盘块,下个分组的第一个盘块的作用与超级块类似,记录的下下一个分组的盘块数量和盘块号。如果没有下一组空闲块,则把值设为特殊值,比如-1。

猜你喜欢

转载自blog.csdn.net/Birdyxh/article/details/112544260