预计阅读本页时间:-
第4章 文件系统
所有的计算机应用程序都需要存储和检索信息。进程运行时,可以在它自己的地址空间存储一定量的信息,但存储容量受虚拟地址空间大小的限制。对于某些应用程序,它自己的地址空间已经足够用了;但是对于其他一些应用程序,例如航空订票系统、银行系统或者公司记账系统,这些存储空间又显得太小了。
在进程的地址空间上保存信息的第二个问题是:进程终止时,它保存的信息也随之丢失。对于很多应用(如数据库)而言,有关信息必须能保存几星期、几个月,甚至永久保留。在使用信息的进程终止时,这些信息是不可以消失的,甚至,即使是系统崩溃致使进程消亡了,这些信息也应该保存下来。
第三个问题是:经常需要多个进程同时存取同一信息(或者其中部分信息)。如果只在一个进程的地址空间里保存在线电话簿,那么只有该进程才可以对它进行存取,也就是说一次只能查找一个电话号码。解决这个问题的方法是使信息本身独立于任何一个进程。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
因此,长期存储信息有三个基本要求:
1)能够存储大量信息。
2)使用信息的进程终止时,信息仍旧存在。
3)必须能使多个进程并发存取有关信息。
磁盘(magnetic disk)由于其长期存储的性质,已经有多年的使用历史。磁带与光盘虽然也在使用,但它们的性能很低。我们将在第5章学习更多有关磁盘的知识,但目前我们可以先把磁盘当作一种固定块大小的线性序列,并且支持如下两种操作:
1)读块k;
2)写块k。
事实上磁盘支持更多的操作,但只要有了这两种操作,原则上就可以解决长期存储的问题。
不过,这里存在着很多不便于实现的操作,特别是在有很多程序或者多用户使用着的大型系统上(如服务器)。在这种情况下,很容易产生一些问题,例如:
1)如何找到信息?
2)如何防止一个用户读取另一个用户的数据?
3)如何知道哪些块是空闲的?
就像我们看到的操作系统提取处理器的概念来建立进程的抽象,以及提取物理存储器的概念来建立进程(虚拟)地址空间的抽象那样,我们可以用一个新的抽象——文件来解决这个问题。进程(与线程)、地址空间和文件,这些抽象概念均是操作系统中最重要的概念。如果真正深入理解了这三个概念,那么读者就迈上了成为一个操作系统专家的道路。
文件是进程创建的信息逻辑单元。一个磁盘一般含有几千甚至几百万个文件,每个文件是独立于其他文件的。文件不仅仅被用来对磁盘建模,以替代对随机存储器(RAM)的建模,事实上,如果能把每个文件看成一种地址空间,那么读者就离理解文件的本质不远了。
进程可以读取已经存在的文件,并在需要时建立新的文件。存储在文件中的信息必须是持久的,也就是说,不会因为进程的创建与终止而受到影响。一个文件应只在其所有者明确删除它的情况下才会消失。尽管读写文件是最常见的操作,但还存在着很多其他操作,其中的一些我们将在下面加以介绍。
文件是受操作系统管理的。有关文件的构造、命名、存取、使用、保护、实现和管理方法都是操作系统设计的主要内容。从总体上看,操作系统中处理文件的部分称为文件系统(file system),这就是本章的论题。
从用户角度来看,文件系统中最重要的是它在用户眼中的表现形式,也就是文件是由什么组成的,怎样给文件命名,怎样保护文件,以及可以对文件进行哪些操作等。至于用链表还是用位图来记录空闲存储区以及在一个逻辑磁盘块中有多少个扇区等细节并不是用户所关心的,当然对文件系统的设计者来说这些内容是相当重要的。正因为如此,本章将分为几节讲述,前两节分别叙述在用户层面的关注内容——文件和目录,随后是有关文件系统实现的详细讨论,最后是文件系统的一些实例。
4.1 文件
在本节中,我们从用户角度来考察文件,也就是说,用户如何使用文件,文件具有哪些特性。
4.1.1 文件命名
文件是一种抽象机制,它提供了一种在磁盘上保留信息而且方便以后读取的方法。这种方法可以使用户不用了解存储信息的方法、位置和实际磁盘工作方式等有关细节。
也许任何一种抽象机制的最重要的特性就是对管理对象的命名方式,所以,我们将从对文件的命名开始考察文件系统。在进程创建文件时,它给文件命名。在进程终止时,该文件仍旧存在,并且其他进程可以通过这个文件名对它进行访问。
文件的具体命名规则在各个系统中是不同的,不过所有的现代操作系统都允许用1至8个字母组成的字符串作为合法的文件名。因此,andrea、bruce和cathy都是合法文件名。通常,文件名中也允许有数字和一些特殊字符,所以像2、urgent!和Fig.2-14也是合法的。许多文件系统支持长达255个字符的文件名。
有的文件系统区分大小写字母,有的则不区分。UNIX是前一类,MS-DOS是后一类。所以在UNIX系统中maria、Maria和MARIA是三个不同的文件,而在MS-DOS中,它们是同一个文件。
关于文件系统在这里需要插一句,Windows 95与Windows 98用的都是MS-DOS的文件系统,即FAT-16,因此继承了其很多性质,例如有关文件名的构造方法。Windows 98对FAT-16引入了一些扩展,从而成为FAT-32,但这两者是很相似的。并且,Windows NT、Windows 2000、Windows XP和Windows Vista支持这两种已经过时的FAT文件系统。这4个基于NT的操作系统有着一个自带文件系统(NTFS),它具有很多不同的性质(例如基于Unicode的文件名)。在本章中,当提到MS-DOS或FAT文件系统的时候,我们指的是用在Windows上的FAT-16和FAT-32,除非特别指明。我们将晚一些在这章讨论FAT文件系统,并在第11章讨论NTFS,并细致地分析了Windows Vista。
许多操作系统支持文件名用圆点隔开分为两部分,如文件名prog.c。圆点后面的部分称为文件扩展名(file extension),文件扩展名通常表示文件的一些信息,如MS-DOS中,文件名由1至8个字符以及1至3个字符的可选扩展名组成。在UNIX里,如果有扩展名,则扩展名长度完全由用户决定,一个文件甚至可以包含两个或更多的扩展名。如homepage.html.zip,这里.html表明HTML格式的一个Web页面,.zip表示该文件(homepage.html)已经采用zip程序压缩过。一些常用文件扩展名及其含义如图4-1所示。

在某些系统中(如UNIX),文件扩展名只是一种约定,操作系统并不强迫采用它。名为file.txt的文件也许是文本文件,这个文件名在于提醒所有者,而不是表示传送什么信息给计算机。但是另一方面,C编译器可能要求它编译的文件以.c结尾,否则它会拒绝编译。
对于可以处理多种类型文件的某个程序,这类约定是特别有用的。例如,C编译器可以编译、连接多种文件,包括C文件和汇编语言文件。这时扩展名就很必要,编译器利用它区分哪些是C文件,哪些是汇编文件,哪些是其他文件。
相反,Windows对扩展名赋予含义。用户(或进程)可以在操作系统中注册扩展名,并且规定哪个程序“拥有”该扩展名。当用户双击某个文件名时,“拥有”该文件扩展名的程序就启动并运行该文件。例如,双击file.doc启动了Microsoft Word程序,并以file.doc作为待编辑的初始文件。