1.文件的概念
文件(File)是以硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片程序等。在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入输出中,则以文件为基本单位。
文件控制块 (FCB) 是用来存放控制文件需要的各种信息的数据结构,以实现“按名存取”。
FCB主要包含以下信息:
①基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
②存取控制信息,包括文件主的存取权限、核准用户的存取权限以及一般用户的存取权限。
③使用信息,如文件建立时间、上次修改时间等。
FCB的有序集合称为文件目录,一个FCB 就是一个文件目录项。
有的系统(如UNIX)采用了文件名和文件描述信息分开的方法,使文件描述信息单独形成一个称为索引结点的数据结构,简称 i 结点 (inode)。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针构成。
(1)磁盘索引结点
它是指存放在磁盘上的索引结点。每个文件有一个唯一的磁盘索引结点。
(2) 内存索引结点
它是指存放在内存中的索引结点。当文件被打开时,要将磁盘索引结点复制到内存的索引结点中,便于以后使用。
2.文件的逻辑结构
从用户观点出发看到的文件的组织形式。
文件的逻辑结构从是否有结构来分,可分为两大类:一类是有结构文件,这是指由一个以上的记录构成的文件,又把它称为记录式文件,另一类是无结构文件,这是指由字符流构成的文件,故又称为流式文件。
1.无结构文件
系统中运行的大量的源程序、可执行文件、库函数等,所采用的就是无结构的文件形式,即流式文件。其文件的长度是以字节为单位的。对流式文件的访问,则是利用读、写指针来指出下一个要访问的字符。可以把流式文件看做是记录式文件的一个特例:一个记录仅有一个字节。
2. 有结构文件
在记录式文件中,每个记录都用于描述实体集中的一个实体,各记录有着相同或不同数目的数据项。记录的长度可分为定长和不定长两类。
有结构文件按记录的组织形式可以分为如下几种:
(1) 顺序文件
文件中的记录一个接一个地顺序排列,记录通常是定长的,可以顺序存储或以链表形式存储。
顺序文件有以下两种结构: 第一种是串结构,记录之间的顺序与关键字无关,通常是按存入时间先后进行排列,对串结构文件进行检索必须从头开始顺序依次查找,比较费时。
第二种是顺序结构,指文件中的所有记录按关键字顺序排列,可采用折半查找法,提高了检索效率。
在对记录进行批量操作,即每次要读或写一大批记录时,顺序文件的效率是所有逻辑文件中最的。此外,对于顺序存储设备(如磁带),也只有顺序文件才能被存储并能有效地工作。在经常需要查找、修改、增加或删除单个记录的场合,顺序文件的性能也比较差。
(2) 索引文件
变长记录文件只能顺序查找,效率较低。为此,可以建立一张索引表,为主文件的每个记录在索引表中分别设置一个表项,包含指向变长记录的指针(即逻辑起始地址)和记录长度,索引表按关键字排序,因此其本身也是一个定长记录的顺序文件。这样就把对变长记录顺序文件的检索转变为对定长记录索引文件的随机检索,从而加快了记录的检索速度。
(3)索引顺序文件
索引顺序文件是顺序文件和索引文件的结合。最简单的索引顺序文件只使用了一级索引。索引顺序文件将顺序文件中的所有记录分为若干组,为顺序文件建立一张索引表,在索引表中为每组中的第一条记录建立一个索引项,其中含有该记录的关键字和指向该记录的指针。
索引表只包含关键字和指针两个数据项。
对于含有 N条记录的顺序文件,查找某关键字的记录时,平均需要查找 N/2 次。在索引顺序文件中,假设 N条记录分为√N 组,索引表中有√N个表项,每组有√N条记录,在查找某关链字的记录时,先顺序查找索引表,需要查找√N/2次,然后在主文件中对应的组中顺序查找,也需要查找√N/2次,因此共需查找√N/2+√N/2=√N 次。显然,索引顺序文件提高了查找效率。
若记录数很多,则可采用两级或多级索引。这种方式就是数据结构中的分块查找。
(4)直接文件或散列文件 (Hash File)
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
3. 文件的物理结构
文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。常用的磁盘空间分配方法有三种,连续分配(顺序结构)、链接分配(链接结构)和索引分配(索引结构)。
1.连续分配
连续分配方法要求每个文件在碰盘上占有一组连续的块,一个文件的目录项中“文件物理地址”字段应包括第一块的地址和该文件所分配区域的长度。
连续分配支持顺序访问和直接访问。
优点是实现简单、存取速度快。
缺点是: 文件长度不宜动态增加,因为一个文件未尾后的盘块可能已分配给其他文件,一旦需奠增加,就需要大量移动盘块。为保持文件的有序性,删除和插入记录时,需要对相邻的记录做物理上的移动,还会动态改变文件的长度。反复增删文件后会产生外部碎片 (与内存管理分配方式中的碎片相似)很难确定一个文件需要的空间天小,因而只适用于长度固定的文件。
2.链接分配
链接分配是一种采用离散分配的方式。 消除了磁盘的外部碎片,提高了磁盘的利用率。可以动态地为文件分配盘块,因此无须事先知道文件的大小。此外,对文件的插入、删除和修改也
非常方便。链接分配又可分为隐式链接和显式链接两种形式。
(1)隐式链接
目录项中含有文件第一块的指针和最后一块的指针。每个文件对应一个碰盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个盘块外,每个盘块都含有指向文件下一个盘块的指针,这些指针对用户是透明的。
隐式链接的缺点是只适合顺序访问,若要访问文件的第 i 个盘块,则只能从第1个盘块开始通过盘块指针顺序查找到第 i 块,随机访问效率很低。隐式链接的稳定性也是一个问题,系统在运行过程中由于软件或硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。 解决方案是,将几个盘块组成簇(cluster),按簇而不按块来分配,可以成倍地减少查找时间。这种方法的代价是增加内部碎片。簇可以改善许多算法的磁盘访同时间,因此应用于大多数操作系统。
(2)显式链接
显式链接是指把用于链接文件各物理块的指针,从每个物理块的末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,称为文件分配表(FAT)。
FAT 表在系统启动时就会被读入内存,因此查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数。
3.索引分配
链接分配解决了连续分配的外部碎片和文件大小管理的问题。但依然存在问题:①链接分配不能有效支持直接访问(FAT除外);②FAT 需要占用较大的内存空间。事实上,在打开某个文件时,只需将该文件对应盘块的编号调入内存即可,完全没有必要将整个FAT 调入内存。为此,索引分配将每个文件所有的盘块号都集中放在一起构成索引块(表),每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第 i 个条目指向文件的第 i 个块。要读第 i 块,通过索引块的第 i 个条目的指针来查找和读入所需的块。
索引分配的优点是支持直接访问,且没有外部碎片问题。
缺点是由于索引块的分配,增加了系统存储空间的开销。
索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。可以采用以下机制来处理这个问题:
1)链接方案。一个索引块通常为一个磁盘块,因此它本身能直接读写。为了支持大文件,可
以将多个索引块链接起来。
2)多层索引。通过第一级索引块指向一组第二级的索引块,第二级索引块再指向文件块。查找时,通过第一级索引查找第二级索引,再采用这个第二级索引查找所需数据块。
3)混合索引。将多种索引分配方式相结合的分配方式。例如,系统既采用直接地址,又采用单级索引分配方式或两级索引分配方式。(下面介绍)
4.混合索引分配
为了能够较全面地照顾到小型、中型、大型和特大型文件,可采用混合索引分配方式。
对于小文件,为了提高对众多小文件的访问速度,最好能将它们的每个盘块地址直接放入FCB,这样就可以直接从FCB 中获得该文件的盘块地址,即为直接寻址。
对于中型文件,可以采用单级索引方式,需要先从FCB 中找到该文件的索引表,从中获得该文件的盘块地址,即为一次间址。
对于大型或特大型文件,可以采用两级和三级索引分配方式。UNIX 系统采用的就是这种分配方式
4.文件保护
为了防止文件共享可能会导致文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取。文件保护通过口令保护、加密保护和访问控制等方式实现。其中,口令和加密是为了防止用户文件被他人存取或窃取,而访问控制则用于控制用户对文件的访问方式。
1.访问类型
- 读。从文件中读。
- 写。向文件中写。
- 执行。将文件装入内存并执行。
- 添加。将新信息添加到文件结尾部分。
- 删除。删除文件,释放空间。
- 列表清单。列出文件名和文件属性。
此外还可以对文件的重命名、复制、编辑等加以控制。这些高层的功能可以通过系统程序调保低层系统调用来实现。保护可以只在低层提供。例如,复制文件可利用一系列的读请求来完成,具有读访问权限的用户同时也就具有了复制和打印权限。
2.访问控制
解决访问控制最常用的方法是根据用户身份进行控制。而实现基于身份访问的最为普通的方法是,为每个文件和目录增加一个访问控列表。以规定每个用户名及其所允许的访问类型。这种方法的优点是可以使用复杂的访问方法,缺点是长度无法预计并且可能导致复杂的空间管理 。
使用精简的访问列表可以解决这个问题。精简的访问列表采用拥有者、组和其他三种用户类型。
1) 拥有者。创建文件的用户。
2)组。一组需要共享文件且具有类似访问的用户。
3)其他。系统内的所有其他用户。
这样,只需用三个域即可列出访问表中这三类用户的访问权限。文件主在创建文件时,说明创建者用户名及所在的组名,系统在创建文件时也将文件主的名字、所属组名列在该文件的FCB中。用户访问该文件时,若用户是文件主,按照文件主所拥有的权限访问文件;若用户和文件主在同一个用户组,则按照同组权限访问,否则只能按其他用户权限访问。
口令和密码是另外两种访问控制方法。
口令指用户在建立一个文件时提供一个口令,系统为其建立 FCB 时附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应的口令。这种方法时间和空间的开销不多,缺点是口令直接存在系统内部,不够安全。
密码指用户对文件进行加密,文件被访问时需要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定的时间。
口令和密码都是防止用户文件被他人存取或窃取,并没有控制用户对文件的访问类型。
注意两个问题:
1)现代操作系统常用的文件保护方法是,将访问控制列表与用户、组和其他成员访问控制方案一起组合使用。
2)对于多级目录结构而言,不仅需要保护单个文件,而且需要保护子目录内的文件,即要提供目录保护机制。目录操作与文件操作并不相同,因此需要不同的保护机制。
5.目录结构
1.单级目录结构
在整个文件系统中只建立一张目录表,每个文件占一个目录项。
单级目录结构实现了“按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。
2.两级目录结构
将文件目录分成主文件目录和用户文件目录两级。
主文件目录项记录用户名及相应用户文件目录所在的存储位置。
用户文件目录项记录该用户文件的FCB信息。当某用户欲对其文件进行访问时,只需搜索该用户对应的 用户文件目录,这既解决了不同用户文件的“重名”问题,又在一定程度上保证了文件的安全。
两级目录结构提高了检索的速度,解决了多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。
3.树形目录结构
将两级目录结构加以推广,就形成了树形目录结构。
文件路径名是个字符串,由从根目录出发到所找文件通路上所有目录名与数据文件名用分隔符“/”接而成。
从根目录出发的路径称为绝对路径。
每次从根目录查询会浪费时间,于是加入了当前目录(又称工作目录),进程对各文件的访问都是相对于当前目录进行的。当用户要访问某个文件时,使用相对路径标识文件,相对路径由从当前目录出发到所找文件通路上所有目录名与数据文件名用分隔符“/”链接而成。
4.无环图目录结构
树形目录结构能便于实现文件分类,但不便于实现文件共享,为此在树形目录结构的基础上增加了一些指向同一结点的有向边,使整个目录成为一个有向无环图 。
当某用户要求删除一个共享结点时,若系统只是简单地将它删除,则当另一共享用户需要访问时,会因无法找到这个文件而发生错误。为此,可为每个共享结点设置一个共享计数器,每当图中增加对该结点的共享链时,计数器加 1;每当某用户提出删除该结点时,计数器减 1。仅当共享计数器为0时,才真正删除该结点,否则仅删除请求用户的共享链。
6.目录实现
在访问一个文件时,操作系统利用路径名找到相应目录项,目录项中提供了查找文件磁盘块所需要的信息。目录实现的基本方法有线性列表和哈希表两种,要注意目录的实现就是为了查找因此线性列表实现对应线性查找,哈希表的实现对应散列查找。
在目录中查找某个文件可以采用线性列表法或哈希表法。线性列表把文件名组织成一个线性表,查找时依次与线性表中的每个表项进行比较。若把文件名按序排列,则使用折半查找法可以降低平均的查找时间,但建立新文件时会增加维护线性表的开销。哈希表用文件名通过哈希函数得到一个指向文件的指针,这种方法非常迅速,但要注意避免冲突。
7.文件共享
文件共享使多个用户共享同一个文件,系统中只需保留该文件的一个副本。
1.基于索引结点的共享方式 (硬链接)
在树形结构的目录中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中,才能方便地找到该文件。
在这种共享方式中,诸如文件的物理地址及其他的文件属性等信息,不再放在目录项中,而被在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针。在索引结点中还应有个链接计数 count,用于表示链接到本索引结点(即文件)上的用户目录项的数目。当count=2,表示有两个用户目录项链接到本文件上,或者说有两个用户共享此文件 。
改图展示了用户B链接到文件前和后,以及用户A删除了文件后情况。当count=0时,表示没有用户使用该文件,才会删除该文件。
2、利用符号链实现文件共享 (软链接)
为使用户B 能共享用户A 的一个文件F,可以由系统创建一个LINK 类型的新文件,也取名为F,并将该文件写入用户B的目录中,以实现用户 B 的目录与文件F的链接。在新文件中只包含被链接文件F的路径名,当用户B要访问被链接的文件且正要读 LINK 类新文件时,操作系统查看到要读的文件是 LINK 类型,则根据该文件中的路径名去找到文件 F,然后对它进行读,从而实现用户B对文件F的共享。这样的链接方法被称为符号链接。
在利用符号链方式实现文件共享时,只有文件主才拥有指向其索引结点的指针。而共享该文件的其他用户只有该文件的路径名,并不拥有指向其索引结点的指针。当文件主把一个共享文件删除后,若其他用户又试图过符号链去访问它时,则会访问失败,于是将符号链删除,此时不会产生任何影响。
硬链接和软链接都是文件系统中的静态共享方法,在文件系统中还存在着另外的共享需求,即两个进程同时对同一个文件进行操作,这样的共享称为动态共享。
可以这样说:文件共享,“软”“硬”兼施。硬链接就是多个指针指向一个索引结点,保证只要还有一个指针指向索引结点,索引结点就不能删除;软链接就是把到达共享文件的路径记录下来,当要访问文件时,根据路径寻找文件。可见,硬链接的查找速度要比软链接的快。
1)目录管理的要求是什么?
①实现“按名存取”,这是目录管理最基本的功能。②提高对目录的检索速度,从而提高对文件的存取速度。③为了方便用户共享文件,目录还需要提供用于控制访问文件的信息。④允许不同用户对不同文件采用相同的名字,以便用户按自己的习惯给文件命名。