12 文件管理(2)

1.目录结构

1.1 一级目录结构

        在系统中设置一张线性目录表,表中包括了所有文件的文件控制块,每个文件控制块指向一个普通文件,这就是一级目录结构;一级目录结构是一种最简单、最原始的文件目录结构。 有了一级目录,文件系统就可实现对文件空间的管理和按名存取。一级目录表中各文件只能按连续结构或顺序结构存放,因此,文件名与文件必须一一对应,限制了用户对文件的命名,不能重名。优点:简单,容易实现。 缺点:搜索效率较低,文件平均检索时间长。

1.2  二级目录结构

        为克服一级目录结构中文件目录命名中的可能冲突,并提高对目录文件的检索速度,一级目录被改进扩充成二级目录。在二级目录结构中,目录被分为两级:① 第一级称为主文件目录(Main File Directory,MFD),给出了用户名和用户子目录所在的物理位置;② 第二级称为用户文件目录(User File Directory,UFD),又称用户子目录,给出了该用户所有文件的FCB。优点:解决了文件的重名问题,可以实现用户间的文件共享,查找时间也降低了。缺点:增加了系统的开销。

1.3 树形目录

        把二级目录的层次关系加以推广,就形成了多级目录,又称树形目录结构。在树形目录结构中,最高层为根目录,最低层为文件。根目录是唯一的,由它开始可以查找到所有其他目录文件和普通文件。根目录一般可放在内存。从根结点出发到任一个非叶结点或叶结点(文件)都有且仅有一条路径,该路径上的全部分支组成了一个全路径名。树形目录结构的优点是便于文件分类,且具有下列特点:① 层次清楚。② 解决了文件重名问题。③ 查找搜索速度快。

2.全路径名&相对路径

        有两种根据路径名检索的方法,一种是全路径名,另一种是相对路径。

2.1 全路径名

        使用全路径名检索的方法,需要从根目录开始,列出由根到用户指定文件的全部有关子目录,全路径名又称为“绝对路径名”。 缺点:不方便,影响访问速度,耗费时间。

2.2 相对路径

        用于检索的路径名只是从当前目录开始到所要访问文件的一段路径,即以当前目录作为路径的相对参照点。优点:检索路径缩短,检索速度提高。

3.目录项分解法

        为加快目录检索可采用目录项分解法,即把目录项(FCB)分为符号目录项(次部)和基本目录项(主部)两部分。 符号目录项包含文件名以及相应的文件号;基本目录项包含了除文件名外文件控制块的其他全部信息。
        例子:假设一个文件控制块有48 字节,符号目录项占8 字节,其中文件名占6 字节,文件号占2 字节;基本目录项占48-8=40 字节。设物理块的大小为512 字节。在进行目录项分解前,一个物理块可以存放512/48≈10 个文件控制块。在进行目录项分解后,一个物理块可以存放512/8=64 个符号目录项,或者512/40≈12 个基本目录项。如果一个目录文件有 128 个目录项,那么分解前 128×48/512=12,即需要 12 个物理块存放该目录文件。在进行目录项分解后,符号目录文件占 128×8/512=2,即需要 2 个物理块存放符号文件。基本目录项占128×40/512=10,即需要 10 个物理块存放基本目录文件。
        下面,计算查找一个文件的平均访盘次数。
分解前:(1+12)/2=6.5 次。
分解后:(1+2)/2+1=2.5 次。
        目录项分解法的优点:减少了访问磁盘的次数,提高了文件目录检索速度。

4.存储空间分配与回收

        在设计空闲空间登记表的数据结构时,一般有四种不同的方案可以考虑,下面分别介绍。

4.1  位示图

        位示图法的基本思想是,利用一串二进制位(bit)的值来反映磁盘空间的分配使用情况。在位示图中,每一个磁盘中物理块用一个二进制位对应,如果某个物理块为空闲,则相应的二进制位为0;如果该物理块已分配了,则相应的二进制位为1;在申请磁盘物理块时,可在位示图中从头查找为0 的位,如果发现了为0 的位,则将其改为1,同时返回该二进制位对应的物理块号。在归还不再使用的物理块时,则在位示图中将该物理块所对应的二进制位改为0,表示这块物理
块恢复为空闲状态。优点:① 对空间分配情况的描述能力强。一个二进制位就描述一个物理块的状态;② 位示图占用空间较小,因此可以复制到内存,使查找既方便又快速;③ 适用于各种文件物理结构的文件系统。

4.2 空闲块表

        空闲块表是专门为空闲块建立的一张表,该表记录外存储器中全部空闲的物理块,包括每个空闲块的第一个空闲物理块号和该空闲块中空闲物理块的个数;空闲块表方式特别适合于文件物理结构为顺序结构的文件系统。

4.3 空闲块链表

        将外存储器中所有的空闲物理块连成一个链表,用一个空闲块首指针指向第一个空闲块,随后的每个空闲块中都含有指向下一个空闲块的指针,最后一块的指针为空,表示链尾,这样就构成了一个空闲块链表;在空闲块链表模式中对空间的申请和释放是以块为单位的。申请空间时从链首取空闲块,空间释放时将物理块接入链尾。空闲块链表法节省内存,但申请空间和回收空间的速度较慢,实现效率较低。

4.4 成组链接

        对链接表的一个改进方案是将n 个空闲盘块的地址存放在第一个空闲块中,其余n-1 个空闲盘块是实际空闲的。假设每100 个空闲块为一组。第一组的100 个空闲块块号放在第二组的头一块中,而第二组的其余99 块是完全空闲的。第二组的100 个块号又放在第3 组的头一块中。依此类推,组与组之间形成链接关系。在最后一组的块号中第2 个单元填“0”,表示该块中指出的块号是最后一组的块号,空闲块链到此结束。在这个空闲块链中,不足100 块的那个组的块号通常放在内存的一个专用块中。这种方式称为成组链接。

5.回收和分配算法

5.1 分配一个空闲块

        查 L 单元内容(空闲块数):当空闲块数>1,i:=L+空闲块数;从 i 单元得到一空闲块号;
把该块分配给申请者;空闲块数减 1。当空闲块数=1,取出 L+1 单元内容(一组的第一块块号或 0);取值=0,无空闲块,申请者等待;取值≠0,把该块内容复制到专用块;该块分配给申请者;把专用块内容读到主存 L 开始的区域。

5.2 归还一块

        查 L 单元的空闲块数;当空闲块数<100,空闲块数加 1;j:=L+空闲块数;归还块号填入 j 单元。当空闲块数=100,把主存中登记的信息写入归还块中;把归还块号填入 L+1 单元;将 L 单元置成 1。

6.记录的成组

        把若干个逻辑记录合成一组存放在一个物理块的工作称为“记录的成组”,每块中的逻辑记录
个数称为“块因子”。由于信息交换以块为单位,所以要进行成组操作时必须使用内存的缓冲区,该缓冲区的长度等于要进行成组的最大逻辑记录长度乘以成组的块因子。

7.建立文件

        用户首先调用文件系统的“建立文件”操作,在请求调用该操作时提供所要创建的文件的文件
名及若干参数:用户名、文件名、存取方式、存储设备类型、记录格式、记录长度,等等。建立文件系统调用的一般格式为:create(文件名,访问权限,(最大长度))。
建立文件的具体步骤如下:
① 检查参数的合法性:文件名是否符合命名规则,若是,则进行下一步②;否则报错,返回。
② 检查同一目录下有无重名文件:若没有,则进行下一步③;否则报错,返回。
③ 在目录中有无空闲位置:若有,则进行下一步④;否则,不成功返回Q。有的系统可能要为此文件申请数据块空间(申请一部分或一次性全部申请)。
④ 填写目录项内容:包括:文件名、用户名、存取权限、长度置零、首地址等。
⑤ 返回。

8.打开文件

        打开文件,是使用文件的第一步,任何一个文件使用前都要先打开,即把文件控制块FCB 送到内存。打开文件系统调用的一般格式为:fd=open(文件路径名,打开方式)。打开文件时,系统主要完成以下工作:
① 根据文件路径名查目录,找到FCB 主部。
② 根据打开方式、共享说明和用户身份检查访问合法性。
③ 根据文件号查系统打开文件表,看文件是否已被打开。如果是,共享计数加1;否则,将外存中的FCB 主部等信息填入系统打开文件表空表项,共享计数置为1。
④ 在用户打开文件表中取一空表项,填写打开方式等,并指向系统打开文件表对应表项。返回信
息:文件描述符fd,这是一个非负整数,用于以后读写文件。

9.读文件

        打开文件后,就可以读取文件中的信息。读文件系统调用的一般格式为:read(文件名,(文件内位置),要读的长度,内存目的地址)。隐含参数:文件主。读写方式可为读、写和既读又写等。读文件时,系统主要完成以下工作:
① 检查长度是否为正整数:若是,则进行下一步②;否则,转向⑩。
② 根据文件名查找目录,确定该文件在目录中的位置。
③ 根据隐含参数中的文件主和目录中该文件的存储权限数据,检查是否有权读。若是,则进行下一步④;否则,转向⑩。
④ 由文件内位置与要读的长度计算最末位置,将其与目录中的文件长度比较,超过否?若是,则
转向⑩;否则,进行下一步⑤。也可将参数中的长度修正为目录中的文件长度。
⑤ 根据参数中的位置、长度和目录中的映射信息,确定物理块号、需要读出的块数等读盘参数
(参数准备完毕后,进行物理的读盘操作,读盘操作可能要进行多次)。
⑥ 根据下一块号读块至内存缓冲区。
⑦ 取出要读的内容,也许要进行成组的分解,将取出的内容送至参数中的内存目的地址。
⑧ 根据块内长度或起始块号+块数,确定还读下一块吗?同时确定下一块块号;若是,则转向⑤;否则,进行下一步⑨。
⑨ 正常返回。
⑩ 错误返回,返回相应错误号。

10.写文件

        写文件系统调用的一般格式为:write(文件名,记录键,内存位置)。把内存中指定单元的数据作为指定的一个记录写入指定文件中,系统还将为其分配物理块,以便把记录信息写到外存上。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值