计算机操作系统——文件管理(2)

来源:互联网 发布:如何java创建表格 编辑:程序博客网 时间:2024/04/29 20:40

目录管理

文件控制块和索引结点

为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为“文件控制块(FCB)”。文件管理程序可借助于文件控制块中的信息,对文件施以各种操作。文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,即一个文件控制块就是一个文件目录项。通常,一个文件目录也被看做是一个文件,称为目录文件。

文件控制块

为了能对系统中的大量文件施以有效的管理,在文件控制块中,通常应含有三类信息,即基本信息、存取控制信息及使用信息。
1) 基本信息类
基本信息类包括: ① 文件名,指用于标识一个文件的符号名。在每个系统中,每一个文件都必须有惟一的名字,用户利用该名字进行存取。② 文件物理位置,指文件在外存上的存储位置,它包括存放文件的设备名、文件在外存上的起始盘块号、指示文件所占用的盘块数或字节数的文件长度。③ 文件逻辑结构,指示文件是流式文件还是记录式文件、记录数;文件是定长记录还是变长记录等。④ 文件的物理结构,指示文件是顺序文件,还是链接式文件或索引文件。

2) 存取控制信息类
存取控制信息类包括:文件主的存取权限、核准用户的存取权限以及一般用户的存取权限。

3) 使用信息类
使用信息类包括: 文件的建立日期和时间、文件上一次修改的日期和时间及当前使用信息(这项信息包括当前已打开该文件的进程数、是否被其它进程锁住、文件在内存中是否已被修改但尚未拷贝到盘上)。应该说明,对于不同OS 的文件系统,由于功能不同,可能只含有上述信息中的某些部分。

索引结点

1) 索引结点的引入
文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块。在查找目录的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户所给定的文件名与目录项中的文件名逐一比较。若未找到指定文件,便再将下一个盘块中的目录项调入内存。稍加分析可以发现,在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需从该目录项中读出该文件的物理地址。而其它一些对该文件进行描述的信息,在检索目录时一概不用。显然,这些信息在检索目录时不需调入内存。为此,在有的系统中,如UNIX 系统,便采用了把文件名与文件描述信息分开的办法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称为i结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i 结点的指针所构成



2) 磁盘索引结点
这是存放在磁盘上的索引结点。每个文件有惟一的一个磁盘索引结点,它主要包括以下内容:
(1) 文件主标识符,即拥有该文件的个人或小组的标识符。
(2) 文件类型,包括正规文件、目录文件或特别文件。
(3) 文件存取权限,指各类用户对该文件的存取权限。
(4) 文件物理地址,每一个索引结点中含有13 个地址项,即iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号。
(5) 文件长度,指以字节为单位的文件长度。
(6) 文件连接计数,表明在本文件系统中所有指向该(文件的)文件名的指针计数。
(7) 文件存取时间,指本文件最近被进程存取的时间、最近被修改的时间及索引结点最近被修改的时间。

3) 内存索引结点
这是存放在内存中的索引结点。当文件被打开时,要将磁盘索引结点拷贝到内存的索引结点中,便于以后使用。在内存索引结点中又增加了以下内容:
(1) 索引结点编号,用于标识内存索引结点。
(2) 状态,指示i结点是否上锁或被修改。
(3) 访问计数,每当有一进程要访问此i结点时,将该访问计数加1,访问完再减1。
(4) 文件所属文件系统的逻辑设备号。
(5) 链接指针。设置有分别指向空闲链表和散列队列的指针。

目录结构

单级目录结构



两级目录结构



多级目录结构



目录查询技术

线性检索法

Hash方法

如果我们建立了一张Hash索引文件目录,便可利用Hash 方法进行查询,即系统利用用户提供的文件名并将它变换为文件目录的索引值,再利用该索引值到目录中去查找,这将显著地提高检索速度。顺便指出,在现代操作系统中,通常都提供了模式匹配功能,即在文件名中使用了通配符“*”、“?”等。对于使用了通配符的文件名,系统此时便无法利用Hash 方法检索目录,因此,这时系统还是需要利用线性查找法查找目录。


文件存储空间的管理

①首先,系统必须能记住存储空间的使用情况。为此,系统应为分配存储空间而设置相应的数据结构。
②其次,系统应提供对存储空间进行分配和回收的手段。(存储空间分配的基本单位都是盘块而非字节)

空闲表法

空闲表法属于连续分配方式,它与内存的动态分配方式雷同,它为每个文件分配一块连续的存储空间,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列。


在内存分配上,虽然很少采用连续分配方式,然而在外存的管理中,由于这种分配方式具有较高的分配速度,可减少访问磁盘的I/O 频率,故它在诸多分配方式中仍占有一席之地。例如,在前面所介绍的对换方式中,对对换空间一般都采用连续分配方式。对于文件系统,当文件较小(1~4个盘块)时,仍采用连续分配方式,为文件分配相邻接的几个盘块;当文件较大时,便采用离散分配方式。

空闲链表法

①空闲盘块链。这是将磁盘上的所有空闲空间,以盘块为单位拉成一条链。
②空闲盘区链。这是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。

位示图法

位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。有的系统把“0”作为盘块已分配的标志,把“1”作为空闲标志。磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用m × n 个位数来构成位示图,并使m × n等于磁盘的总块数,如图6-22 所示。


成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太长。在UNIX 系统中采用的是成组链接法。

空闲盘块的组织

空闲盘块号栈(只有一个,每一组的第一个盘块的S.free、S.free(0)~S.free(99)记录了下一组的盘块总数N和下一组所有的盘块号)用来存放当前可用的一组空闲盘块的盘块号(最多含100 个号),以及栈中尚有的空闲盘块号数N。顺便指出,N 还兼作栈顶指针用。例如,当N=100 时,它指向S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设置了一把锁。图6-23 左部示出了空闲盘块号栈的结构。其中,S.free(0)是栈底,栈满时的栈顶为S.free(99)。
②文件区中的所有空闲盘块被分成若干个组,比如,将每100 个盘块作为一组。假定盘上共有10 000 个盘块,每块大小为1 KB,其中第201~7999 号盘块用于存放文件,即作
为文件区,这样,该区的最末一组盘块号应为7901~7999;次末组为7801~7900……;第二组的盘块号为301~400;第一组为201~300,如图6-23右部所示。
③将每一组含有的盘块总数N 和该组所有的盘块号记入其前一组的第一个盘块的S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。
④将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
⑤最末一组只有99 个盘块,其盘块号分别记入其前一组的S.free(1) ~S.free(99)中,而在S.free(0)中则存放“0”,作为空闲盘块链的结束标志。(注:最后一组的盘块数应为99,
不应是100,因为这是指可供使用的空闲盘块,其编号应为(1~99),0号中放空闲盘块链的结尾标志。)

空闲盘块的分配与回收

当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。该过程首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。若该盘块号已是栈底,即S.free(0),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,须调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1 并返回。

在系统回收空闲盘块时,须调用盘块回收过程进行回收。它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加1 操作。当栈中空闲盘块号数目已达100 时,表示栈已满,便将现有栈中的100个盘块号记入新回收的盘块中,再将其盘块号作为新栈底。



0 0
原创粉丝点击