UNIX操作系统的文件管理
UNIX操作系统的文件管理
一、UNIX文件系统的基本工作原理
1、UNIX文件的逻辑结构及分类 UNIX 系统中文件的逻辑结构采用所谓无结构的 流式文件,即是把文件视为一个无内部结构的字 符流。,并把它们分为: (1) 一般文件 (2) 目录文件
由文件的目录组成的文件称为目录文件。
在 UNIX 里,为了加快文件目录的搜索速度, 便于实施文件共享,而把这些内容划分为两部 分: 一部分称为该文件的文件控制块(或索引节点) inode ,它包含了文件的长度、物理位置、文 件组、文件类型、存取权限、共享信息、管理 住处等内容; 另一部分仍称为该文件的目录,它只含文件名以 及 相 应 inode 节 点 的 编 号 ( 见 图 ) 。 因 此 , UNIX 的目录文件虽也是由文件的目录组成, 但相比之下要比通常所说的目录文件简单许多。
UNIX 在树型结构的基础上增加交叉连接部分, 以达到文件共享的目的。在 UNIX 系统中,是通 过文件的 inode 节点来实现文件共享勾连的,并 且只允许勾连到代表一般文件的叶节点上去。由 图18可知,wang和lee共享文件f2。
二、UNIX文件系统的数据结构综述
在UNIX文件系统的实施过程中,涉及到多种数 据结构。有一类数据结构用于对文件的静态管理, 因此都分布在文件所在的存储设备上,它们包括 外存文件控制块inode、目录,以及存储资源管 理信息块filsys三种; 另一类数据结构用于文件打开时的管理,因此都 出现在内存,它们包括内存文件控制块inode、 打开文件控制块file、以及进程打开文件表三种。
(3) 文件目录中的勾连
为了实现文件共享,UNIX允许对一般文件节点 实行交叉连接,这称为勾连。它是通过在同一 文件系统中的两个不同目录项里填入同一个外 存inode节点编号来实现的,图9-25中的虚线处 反映的正是这种勾连。譬如说,一般文件的原 有路径名为 /a31 ,则在目录文件中就应有一目 录项,其文件名为 a31 ,对应的外存 inode 编号 为n。如果再给它另起一个路径名/a0/bx31,则 在目录文件a0中应该新设置一个目录项,它的 文件名部分填入 bx31 ,它的外存 inode 编号仍 填为n。另外,在编号为n的外存inode里,将inlink 的值加 1 。于是文件系统中就有两个目录 项同时指向这一个inode ,实现了对文件a31的 不同名共享。
(3) 文件系统的目录结构
在UNIX文件系统里,基本文件系统和子文件系统都独立 采用树型带勾连的目录结构。所谓树型,即它们各自都 有一个根目录文件,在根目录文件中所列的文件,可以 是一个目录文件,也可以是一个一般文件或特殊文件。 这样一层层地发展下去,就形成了一个通常意义下的树 型文件目录结构。在这种结构下,叶节点为一般文件或 特殊文件,中间节点为目录文件。图18是UNIX文件系统 的目录结构图,我们以方框代表目录文件,圆圈代表一 般文件或特殊文件。
当某进程欲打开一个文件时,首先在自己 user 结构的 打开文件表里申请一个打开文件号 fd (即找到一个 uofile[ ]中的空表目),随之在系统打开文件控制块表里 申请一个 file 结构,且将其位置 fp 填入 u-ofile 表目中。 然后在内存 inode 表里找到该文件的内存 inode ,或申 请一个内存 inode ,并将位置信息填入相应 file 中的 finode, i-count 加1。这样,如果该文件的内存 inode 原 先就在内存inode表中,那么现在这个进程则又一次通 过同一路径名不同路径名将它打开。由于它们都有自 己的file结构,所以它们对这个文件可以持有不同的操 作要求,拥有各自的读、写指针,从而形成了通过不 同的file结构,使用一个内存inode的共享形式。这种共 享在 file 结构里的 f-count 都为 1 ,但因大家都指向同一 个内存inode,故内存inode里面的i-count则大于1(有 几个file结构指向它,它的i-count就为几),图22描述 了这一情形。
文件系统磁盘存储区的分布图
每一个文件的inode节点占用32个字节,因此每一个inode 块包含16个文件控制块。这些inode顺序编号,一个文件 占用了某inode,则其编号就成为这个文件的内部标识, 第1号inode是专门用于根目录文件的。 数据结构filsys 共有12 项内容,下面给出与我们讲述有关 的六项。 (1) s-isize inode区占用的盘块数; (2) s-fsize 盘块总数; (3) s-nfree 直接管理(也就是s-free[100]指向)的空闲块 数; (4) s-free[100] 空闲块索引表 (5) s-ninode 直接管理的空闲inode节点数; (6) s-sinode[100] 空闲inode节点索引表。 至于如何通过filsys来对空闲inode和空闲盘进行具体管理, 详情见后面关于UNIX文件系统资源管理综述部分。
一个文件可以被同一进程或不同进程、用同一路径名不同路径名、 具有同一特性或不同特性(读、写、执行)同时打开。做为内存 inode ,基本上只包含文件的静态信息(如文件的物理结构、勾连 情况、存取权限等),没有记录下一个文件被打开时的动态信息。 为此,UNIX又在系统占用的内存区里开辟一张表)——打开文件控 制块表,简称file表,共有100个表目,每一个表目称做一个打开文 件控制块file。主要内容有 (1) f-flag打开文件的特性,指明对文件的读、写要求 (2) f-count共享该file的进程数 (3) f-inode指向对应于此打开文件的内存inode 每当打开一个文件时,都要在该表里申请分配一个file,形成这个打 开文件的控制块。
6、进程打开文件表
在 进 程 的 user 结 构 里 , 设 有 一 个 整 型 数 组 uofile[15] ,它被称为该进程的打开文件表。在进 程打开一个文件时,分配到一个打开文件控制块 file,就把这个控制块的地址填入u-ofile[ ]的一个 元素里。于是,这个打开文件就和它在u-ofile[ ] 中占据的位置形成一个对应关系,这个位置就是 打开文件号。图 21 给出了 UNIX文件系统中各数 据结构之间的关系。
3、存储资源管理信息块 文件系统所在存储设备上的存储资源,主要有 两个用途,一是用来存放外存文件控制块inode, 一是 用 来存 放 文件 信 息或 扩 展的 地 址索 引表 (当文件是大型的巨型的时,就需要这样做)。 为了能对盘块的使用情况加以管理,UNIX将这 些管理信息集中放在一个数据结构 —— 存储资 源管理信息块filsys中。filsys总是固定在1#盘块 上,这一盘块通常称作该文件系统的管理块。 这样,整个磁盘空间的安排情况就如图 20 所示。
(1) i-count 内存inode访问计数。若为0,表示此节点为空闲, 某文件被打开时,其内存inode里的此项就加1。 只有所有用户都关闭了此文件,以使i-count为0 后,这个文件才被真正关闭。 (2) i-number 与此内存inode相对应的外存inode编号。
5、打开文件控制块file和file表
4外存 、内存文件控制块 inode和内存inode表 inode记录了一个文件的属性和有关信息。可以想象,在对某一
文件的访问过程中,会频繁地涉及到它,于是它就要不断来回于内、 外存之间,这当然是极不经济的。为此,UNIX在系统占用的内存区 里开辟了一张表——内存inode表(或活动文件控制块表、活动索引 节点表),该表共有100个表目,每个表目称为一个内存文件控制块 inode,当需要使用某文件的信息,而在内存inode 表中找不到其相 应的inode时,就申请一个内存inode,把外存inode的大部分内存拷 贝到这个内存inode 中,随之就使用这个内存 inode 来控制磁盘上的 文件。在最后一个用户关闭此文件后,内存inode的内容被写到外存 inode,然后释放以供它用。 内存inode的结构基本上与外存inode相同。增加的有关项目有:
共享打开文件的另一种情形是由父进程创建子 进程引起的。在 UNIX 中,当父进程创建一个 子进程时,先要继承父进程的 u-ofile 表的全部 内容。这样它和父进程使用同一个file结构,对 这个文件有相同的操作要求和读写指针。所以, 这种共享打开文件表现为通过共享同一个file结 构来体现,图23描述了这一情形。由此可知, 在 UNIX 里提供了两种文件共享的方式,第一 种是在目录结构里通过勾连,对同一文件提供 不同路径名,以达到能够异名共享的目的;第 二种是在打开文件结构里,通过共享同一个file 结 构 或 共 享 同 一 个 内存inode而实现对打开文件的共享。
2、目录和目录文件
(1) 目录
UNIX中的每个文件都有一个目录项,目录项中记录了文件的名字以及该 文件对应的外存inode的编号。文件名是一个文件的外部标识,而这个文 件的外存inode编号,则是它的内部标识。可以看出,文件的目录项建立 起了文件内、外部标识之间的对应关系:根据文件名找到它的目录项,由 目录项的外存inode编号找到文件控制块inode,从而获得该文件的信息。 (2) 目录文件 UNIX视每张目录表为一目录文件。作为一个文件,它有自己的名字以及 对应的外存inode。要注意的是,每个文件系统(基本的或子文件系统) 都有一个根目录文件,它的外存inode总是放于文件存储设备上inode区中 的第一个,于是保证很容易从它出发,到达树型目录结构上的的存储空间,每个 盘块的容量为512字节,因此存放目录文件的盘块中,每一盘块可以存放 32个文件的目录。有了这些,UNIX文件目录的树型结构可以细化成如图 19所示。
三、UNIX文件的物理结构