所有的应用程序都需要存储和检索信息。进程运行时,它能够在自己的存储空间内存储一定量的信息。然而,存储容量受虚拟地址空间大小的限制。对于一些应用程序来说,存储空间的大小是充足的,但是对于其他一些应用程序,比如航空订票系统、银行系统、企业记账系统来说,这些容量又显得太小了。
第二个问题是,当进程终止时信息会丢失。对于一些应用程序(例如数据库),信息会长久保留。在这些进程终止时,相关的信息应该保留下来,是不能丢失的。甚至这些应用程序崩溃后,信息也应该保留下来。
第三个问题是,通常需要很多进程在同一时刻访问这些信息。解决这种问题的方式是把这些信息单独保留在各自的进程中。
因此,对于长久存储的信息我们有三个基本需求:
必须要有可能存储的大量的信息
信息必须能够在进程终止时保留
必须能够使多个进程同时访问有关信息
磁盘(Magneticdisk)一直是用来长久保存信息的设备。近些年来,固态硬盘逐渐流行起来。
固态硬盘不仅没有易损坏的移动部件,而且能够提供快速的随机访问。相比而言,虽然磁带和光盘也被广泛使用,但是它们的性能相对较差,通常应用于备份。我们会在后面探讨磁盘,现在姑且把磁盘当作一种大小固定块的线性序列好了,并且支持如下操作
读块k
写块k
事实上磁盘支持更多的操作,但是只要有了读写操作,原则上就能够解决长期存储的问题。
然而,磁盘还有一些不便于实现的操作,特别是在有很多程序或者多用户使用的大型系统上(如服务器)。在这种情况下,很容易产生一些问题,例如
你如何找到这些信息?
你如何保证一个用户不会读取另外一个用户的数据?
你怎么知道哪些块是空闲的?等等问题
我们可以针对这些问题提出一个新的抽象-文件。进程和线程的抽象、地址空间和文件都是操作系统的重要概念。如果你能真正深入了解这三个概念,那么你就走上了成为操作系统专家的道路。
文件(Files)是由进程创建的逻辑信息单元。一个磁盘会包含几千甚至几百万个文件,每个文件是独立于其他文件的。事实上,如果你能把每个文件都看作一个独立的地址空间,那么你就可以真正理解文件的概念了。
进程能够读取已经存在的文件,并在需要时重新创建他们。存储在文件中的信息必须是持久的,这也就是说,不会因为进程的创建和终止而受影响。一个文件只能在当用户明确删除的时候才能消失。尽管读取和写入都是最基本的操作,但还有许多其他操作,我们将在下面介绍其中的一些。
文件由操作系统进行管理,有关文件的构造、命名、访问、使用、保护、实现和管理方式都是操作系统设计的主要内容。从总体上看,操作系统中处理文件的部分称为文件系统(filesystem),这就是我们所讨论的。
从用户角度来说,用户通常会关心文件是由什么组成的,如何给文件进行命名,如何保护文件,以及可以对文件进行哪些操作等等。尽管是用链表还是用位图记录内存空闲区并不是用户所关心的主题,而这些对系统设计人员来说至关重要。下面我们就来探讨一下这些主题
1
文件
1.1
文件命名文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。可能任何一种机制最重要的特性就是管理对象的命名方式。在创建一个文件后,它会给文件一个命名。当进程终止时,文件会继续存在,并且其他进程可以使用名称访问该文件。
文件命名规则对于不同的操作系统来说是不一样的,但是所有现代操作系统都允许使用1-8个字母的字符串作为合法文件名。
某些文件区分大小写字母,而大多数则不区分。UNIX属于第一类;历史悠久的MS-DOS属于第二类(顺便说一句,尽管MS-DOS历史悠久,但MS-DOS仍在嵌入式系统中非常广泛地使用,因此它绝不是过时的);因此,UNIX系统会有三种不同的命名文件:maria、Maria、MARIA。在MS-DOS,所有这些命名都属于相同的文件。
这里可能需要在文件系统上预留一个位置。Windows95和Windows98都使用了MS-DOS文件系统,叫做FAT-16,因此继承了它的一些特征,例如有关文件名的构造方法。Windows98引入了对FAT-16的一些扩展,从而导致了FAT-32的生成,但是这两者很相似。另外,WindowsNT,Windows,WindowsXP,WindowsVista,Windows7和Windows8都支持FAT文件系统,这种文件系统有些过时。然而,这些较新的操作系统还具有更高级的本机文件系统(NTFS),有不同的特性,那就是基于Unicode编码的文件名。事实上,Windows8还配备了另一种文件系统,简称ReFS(ResilientFileSystem),但这个文件系统一般应用于Windows8的服务器版本。下面除非我们特殊声明,否则我们在提到MS-DOS和FAT文件系统的时候,所指的就是Windows的FAT-16和FAT-32。这里要说一下,有一种类似FAT的新型文件系统,叫做exFAT。它是微软公司对闪存和大文件系统开发的一种优化的FAT32扩展版本。ExFAT是现在微软唯一能够满足OSX读写操作的文件系统。
许多操作系统支持两部分的文件名,它们之间用.分隔开,比如文件名prog.c。原点后面的文件称为文件扩展名(fileextension),文件扩展名通常表示文件的一些信息。例如在MS-DOS中,文件名是1-8个字符,加上1-3个字符的可选扩展名组成。在UNIX中,如果有扩展名,那么扩展名的长度将由用户来决定,一个文件甚至可以包括两个或更多的扩展名,例如homepage.html.zip,html表示一个web网页而.zip表示文件homepage.html已经采用zip程序压缩完成。一些常用的文件扩展名以及含义如下图所示
扩展名含义bak备份文件cc源程序文件gif符合图形交换格式的图像文件hlp帮助文件htmlWWW超文本标记语言文档jpg符合JPEG编码标准的静态图片mp3符合MP3音频编码格式的音乐文件mpg符合MPEG编码标准的电影o目标文件(编译器输出格式,尚未链接)pdfpdf格式的文件psPostScript文件tex为TEX格式化程序准备的输入文件txt文本文件zip压缩文件在UNIX系统中,文件扩展名只是一种约定,操作系统并不强制采用。
名为file.txt的文件是文本文件,这个文件名更多的是提醒所有者,而不是给计算机传递信息。但是另一方面,C编译器可能要求它编译的文件以.c结尾,否则它会拒绝编译。然而,操作系统并不关心这一点。
对于可以处理多种类型的程序,约定就显得及其有用。例如C编译器可以编译、链接多种文件,包括C文件和汇编语言文件。这时扩展名就很有必要,编译器利用它们区分哪些是C文件,哪些是汇编文件,哪些是其他文件。因此,扩展名对于编译器判断哪些是C文件,哪些是汇编文件以及哪些是其他文件变得至关重要。
与UNIX相反,Windows就会