资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章 文件系统,第七章 文件系统,7.1,文件系统概述,7.2,文件的结构和存取法,7.3,文件目录,7.4,文件存储空间的管理,7.5,文件的共享,7.6,文件的存取控制,7.7,文件系统和用户间的接口,7.1,文件系统概述,7.1.1,文件和文件系统,1.,文件,文件,(File),是一个具有符号名的一组相关联元素的有序序列。,文件可以包含范围非常广泛的内容。系统和用户都可以将具有一定独立功能的程序模块、一组数据或一组文字命名为一个文件。例如用户的一个,Pascal,源程序、一个目标代码程序、系统中的库程序和各种系统程序、一批待加工处理的数据、一篇文章等等,都可构成,一个文件。,2.,文件系统,操作系统中负责管理和存取文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储器的存储空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤消文件等。,在操作系统中增设了文件管理部分后,为用户带来了如下好处:,使用的方便性:,(2),数据的安全性:,(3),接口的统一性:,7.1.2,文件的类型,为便于文件的控制和管理,通常把文件分成若干类型。,文件按其性质和用途可以分为:,(1),系统文件:有关操作系统及其它系统程序的信息所组成的文件。这类文件对用户不直接开放,只能通过系统调用为用户服务。,(2),库文件:由标准子程序及常用的应用程序组成的文件。这类文件允许用户调用,但不允许用户修改。,(3),用户文件:由用户委托操作系统保存的文件,如源程序文件,目标程序文件,以,及由原始数据、计算结果等组成的文件。,这类文件根据使用情况又可以分为三种类型:,临时文件:用户在一次算题过程中建立的“中间文件”。当用户撤离系统时,其文件也随之被撤消。,档案文件:只保存在作为档案的磁带上,以便考证和恢复用的文件,如日志文件。,永久文件:用户要经常使用的文件。它不仅在磁盘上有文件副本,而且在“档案”,上也有一个可靠的副本。,根据文件的保护方式,文件可分为三类:,(1),只读文件:允许文件主及核准的用户读,但不允许写的文件。,(2),读写文件:允许文件主及核准的用户读、写,但禁止未核准的用户读、写的文件。,(3),不保护文件:所有用户都可以存取的文件。,按文件信息的流向,它又可分为三类:,(1),输入文件:例如键盘输入文件,只能输入。,(2),输出文件:例如打印机文件,只能输出。,(3),输入输出文件:在磁盘、磁带上的文件,既可读,又可写。,在,UNIX,操作系统中,文件按组织和处理方式分为三类:,(1),普通文件:由内部无结构的一串平滑的字符构成的文件。这种文件既可以是系统文件,也可以是库文件或用户文件。,(2),目录文件:由文件目录构成的一类文件。对它的处理,(,读、写、执行,),在形式上与普通文件相同。,(3),特别文件:由一切输入输出慢速字符设备构成的文件。这类文件对于查找目录、存取权限验证等的处理与普通文件相似,而其它部分的处理要针对设备特性要求做相应的特,殊处理。,7.1.3,文件系统的基本功能,操作系统中的文件管理部分应具有如下功能:,(1),文件的结构及有关存取方法;,(2),文件的目录机构和有关处理;,(3),文件存储空间的管理;,(4),文件的共享和存取控制;,(5),文件操作和使用。,7.2,文件的结构和存取法,7.2.1,文件的逻辑结构,图,7.1,记录式文件,(,a,),定长记录文件;,(,b,),变长记录文件,7.2.2,文件的物理结构,1.,连续结构,图,7.2,连续结构文件,2.,串联结构,图,7.3,串联结构文件,3.,索引文件,图,7.4,索引结构文件,图,7.5,按串联文件方式组织索引表块,图,7.6,按多重索引方式组织索引表块,图,7.7 UNIX,系统的多重索引结构,4.Hash,文件,文件的物理结构的另一种组织方式是采用计算寻址结构。在这种方式中,把记录中的键值通过某种计算,转换为相应记录的相应地址。一般说来,由于地址的总数比可能的键值总数,(,范围,),要少得多,也就是不会出现一一对应的关系。因此,不同键值在计算之后,可能会得到相同的地址,这种现象称为“地址冲突”。所谓计算寻址,就是通常所说的,Hash,方法,或称散列法,杂凑法。利用这种方法所建立的文件称为,Hash,文件。这种物理结构用在不宜采用连续结构、记录次序较乱、又需在极短时间内存取的场合,如用在实时处理文件、操作系统目录文件、编译程序变量名表等方面特别有效。此外,又不需索引,从而节省了索引表所占的空间和索引表的查找时间。,解决地址冲突的办法叫溢出处理技术,这是设计,Hash,文件需要考虑的主要内容,用的溢,出处理技术有:顺序探索法、二次散列法、拉链法、独立溢出区法等。,7.2.3,文件的存取方法,所谓文件的存取方法,是指读写文件存储器上的一个物理块的方法,通常有两类存取方法:顺序存取法和直接存取法。,1.,顺序存取法,在提供记录式文件结构的系统中,顺序存取法就是严格按物理记录排列的顺序依次存取。如果当前存取的记录为,R,i,,,则下次要存取的记录自动地确定为,R,i,+1,。,在只提供无结构的流式文件系统中,顺序存取法按读写位移,(offset),从当前位置开始读写,即每读写完一段信息后,读写位移自动加上这段的长度,然后再根据该位移读写下面的信,息。,如图,7.1,所示,对于顺序文件,如果知道了当前记录的地址,则很容易确定下一个要存取的记录的地址。例如,设置一个读指针,rptr,,,令它总是指向“下一次”要读出的记录首址。当该记录读出后,对,rptr,进行相应的修改。对于定长记录,,rptr,修改为,rptr,=,rptr+,L,其中,L,为文件的物理记录长。此时,rptr,指向下一次要读出的记录首址。对于变长记录文件,首先根据,rptr,读出存放记录长,L,i,的单元,然后根据记录长度读出当前记录。,此时对,rptr,作如下修改:,rptr,=,rptr+,L,i,+,l,其中,l,是存放记录长度,L,i,的字节数。例如用,2,个字节存放,L,i,,则,l,=2,。,类似地,设置写指针,则对定长记录文件的修改为,wptr,=,wptr+,L,对于变长记录文件的修改为,wptr,=,wptr+,L,i,+,l,2.,直接存取法,直接存取法允许用户随意存取文件中的任何一个物理记录,而不管上次存取了哪一个记录。在无结构的流式文件中,直接存取法必须事先用必要的命令把读写位移移到欲读写的信息开始处,然后再进行读写。,对于定长记录文件,这是很方便的。欲读写第,i,个记录,(,i,=0,1,2,),的首址为,rptr,=offset+,i,*,L,wptr,=offset+,i,*,L,其中,,offset,是该文件的首址,即,R,0,的首址,在逻辑上可认为,offset=0,;,L,为记,录长度。,3.,按键存取法,按键存取法,实质上也是直接存取法,它不是根据记录编号或地址来存取的,而是根据文件中各记录内容进行存取的。适用于这种存取方法的文件组织形式也与顺序文件不同,它是按逻辑记录中的某个数据项的内容来存放的,这种数据项通常称为“键”。,这种根据键而不是根据记录号进行存取的方法,称为按键存取法。,7.2.4,文件结构、文件存储设备和存取法的关系,表,7-1,文件结构、存储设备和存取方法之间的关系,存储设备,磁 盘,磁 带,文件结构,连续,串接,索引,连续,存取方法,顺序、直接,顺序,顺序、直接,顺序,7.3,文件目录,7.3.1,简单的文件目录,表,7-2,简单的文件目录,文件名,记录长,记录数,起始块号,其它,ALPHA,500,5,25,BETA,400,10,30,TEST,400,7,40,ASS,300,8,47,1.,文件说明及其所含信息,1),有关文件结构的信息,(1),文件的逻辑结构:记录是否为定长,记录长度,记录个数;,(2),文件的物理结构:如果是连续文件或串联文件,要指出该文件的第一个物理块号;,如果文件是索引文件,则应给出索引表所在的块号,或者把索引表包括在目录项中。,2),有关存取控制信息,(1),文件主本人所具有的存取权限,(,读写和执行,),;,(2),文件主同组用户的存取权限;,(3),其它用户的存取权限。,3),有关管理方面的信息,(1),文件建立的日期和时间;,(2),上次存取的日期和时间;,(3),文件要求保留时间。,2.,简单目录结构的缺陷,(1),存在“重名”问题。在简单的文件目录结构中,文件名和文件实体之间存在着一一对应关系,即它不允许两个文件具有相同的名字。在多道程序系统中,尤其是多用户的分时系统中,重名是很难避免的,这就很难准确地找到用户所需要的文件。显然,如果由人工来管理文件名注册,以避免命名冲突,则是很麻烦的。,(2),当系统文件数量过多时,目录项数就会很大,查找起来就要花费较长的时间。,解决上述问题的方法是建立二级或多级目录。,7.3.2,二级目录,图,7.8,二级目录结构,7.3.3,多级目录,1.,多级树型目录,图,7.9,多级树型目录结构,在根目录之下,包含如下子目录:,lib,库文件子目录,etc,附加的程序和数据文件子目录,dev,设备子目录,tmp,临时文件子目录,usr,用户子目录,bin,实用程序子目录,UNIX UNIX,子目录,(,包括操作系统核心程序,),include,基本数据子目录,根目录和子目录都是文件,称为目录文件。,2.,绝对路径和相对路径,在树型目录结构中,文件名有两种表示方法:绝对路径名和相对路径名。,从根开始到达文件的路径,称为绝对路径。例如,文件,prog.c,的绝对路径名为,/,usr/user/u/c/prog.c,它表示根目录中有子目录,usr,,,usr,中有子目录,user,,在,user,子目录下有一子目录,lu,,,lu,下的一个文件是,prog.c,。,绝对路径名总是从根目录开始,并且是唯一的。在,UNIX,中,路径各部分之间用“,/”,分隔。在,MS-DOS,中,其分隔符是“”,不管使用什么分隔,符,如果路径名的第一个字符是分隔符,那么这个路径就是绝对路径。,另一种文件名表示法称为相对路径名。它常和工作目录,(,也称当前目录,),的概念一起使用。用户可以指定一个目录作为当前的工作目录。这时,所有的路径名,如果不是从根目录开始,则都是相对于工作目录的。例如,如果当前的工作目录是,/,usr/user/lu,,,则绝对路径名为,/,usr/user/lu/prog.c,的文件可以简单地用,prog.c,来引用。,大多数支持树型结构的操作系统,在每个目录中有两个特殊的目录项“,”,和“,”,,通常读作“点”和“点点”。“点”指当前目录,“点点”指其父目录。在图,7.9,中,若某进程的工作目录为,/,usr/user/lu,,,它可以使用“,”,沿树向上到达其父目录,/user,。,该进程使用路径名,/,xu,/mailbox,访问子目录,xu,下的文件,mailbox,。,7.3.4,文件目录项的组织,1.CP/M,中的目录项,图,7.10 CP/M,目录项的内容,2.MS-DOS,中的目录项,图,7.11 MS-DOS,的目录项,3.UNIX,中的目录项,UNIX,中使用的目录结构非常简单,每个目录项仅包含一个文件名及其,i,节点号,即,图,7.12,查找,/,usr/ast/mbox,的过程,7.4,文件存储空间的管理,7.4.1,空白文件目录,表,7-3,空白文件目录例,序 号,第一个空白块号,空白块个数,物理块号,1,2,3,4,2,9,15,4,3,5,(,2,,,3,,,4,,,5,),(,9,,,10,,,11,),(,15,,,16,,,17,,,18,,,19,),7.4.2,空白块链,如果采用非连续结构,则可将所有空白块用链接指针或索引结构把它们组织成一个空白文件。采用链接结构时,释放和分配的空白块都可以在链首处进行,其主要问题是要修改几个有关的链接字。这种方法只要求在主存中保存一个指针,令它指向第一个空白块。当修改链接字时,要读几个盘块,工作量较大。如果采用索引表,则只需修改索引表中几个有关项,但是索引表占用的存储空间较大,对系统来说也是负担。,UNIX,文件系统,采用了一种改进的办法,即空白块成组链接法。,7.4.3,位示图,(Bit Map),图,7.13,位示图例,假定磁盘的块长,=1 KB,,,对于,200 MB,的磁盘需有,200 K,位来映射,即需要,2001024/8=5,1 200,字节,即,51 200/1024=25,个物理块来构成一个位示图。,7.4.4 MS-DOS,的盘空间的管理,图,7.14 MS-DOS,中的,FAT,表,7.4.5 UNIX,文件存储空间的管理,在,UNIX,系统中文件存储介质可采用磁盘或磁带。通常把每个磁盘或磁带视为一个文件卷,在每个文件卷上可以存放一个具有独立目录结构的文件系统。一个文件卷包含许多物理块。其中,,0,块为引导块,用于引导操作系统;,1,块为资源管理块,也称超级块,用于存放文件卷的资源管理信息,为便于管理在内存中有其副本。从,2,块起存放磁盘索引节点,(,inode,),块,其块数由文件系统的大小决定,在索引节点块之后是一般的数据块。,在资源管理块中用于一般数据块管理的项主要有:,s-nfree,:,当前在此登记的空闲盘块数,最多为,50,;,s-free,50,:,当前在此登记的空闲盘块号。,1.,空闲盘块的分组,UNIX,系统采用空闲块成组链接法对盘空间进行管理。该方法首先把文件存储器中的所有空闲块按固定数量,(,一般为,50,块,),划分为若干组。组的划分方法是从后往前顺序划分,每组,50,块。每组的第一块用来存放前一组中各块的块号和块数。由于第一组前面没有其它组存在,所以第一组的块数为,49,,最后一组可能不足,50,块,而且由于该组后面再也没有其它组,所以该组的物理块号和块数只能存放在资源管理块,(1,块,),中。系统在初启时把资源管理块复制到内存,从而使得空闲块的分配和释放可在内存中进行,参见,图,7.15,。,图,7.15,空闲块成组链接法,2.,空闲块的分配与释放,当申请者提出空闲块请求时,盘块分配程序从栈顶弹出一空闲盘块号,将其对应的盘块分配给它,然后栈顶指针下移一格,总块数减,1,。若该盘块处于栈底,则将该块中存放的下一组的各块号及块数读入内存,然后才将该盘块分配给它,并重置栈顶指针。,在系统释放空间盘块时,栈顶指针加,1,,把释放的空闲块号压入栈顶位置,空闲块数加,1,。如果栈顶指针等于,50,,表示该组已满,需把当前栈中的,50,个块号及块数,50,写入新释放的空闲块中,使栈顶指针置“,0”,,然后将新释放的空闲块号压入堆栈,栈顶指,针加,1,,空闲块数置,1,。,7.5,文 件 的 共 享,7.5.1,目录结构中的共享,图,7.16,目录结构中的文件共享,勾连有两种形式:一种是允许目录项链接到目录树中的任一节点上;另一种则只允许链接到数据文件的叶子节点上。前一种形式既可以链接到目录树中的叶子节点,也可以链接到子目录节点。如果链接到子目录节点,则表示可以共享该目录及其后继目录所包含的所有文件。这种勾连方式功能很强,其不足之处是允许共享的范围过宽,不易控制和管理,使用不当会造成循环勾连。例如图中的,/usr/user2/li,勾连到,/usr/user1/zhang,上,而,/usr/user1/zhang,又勾连到,/usr/user2,上,这样就形成了循环勾连。这种循环勾连造成了目录结构的混乱。后一种方式虽不如前一种方式功能强,但同样可以达到共享的目的,且实现,简,1.,基于索引节点的共享方法,UNIX,系统中,文件的目录结构由两部分构成:目录项和索引节点,(,也称,i,节点,),。其中目录项由文件名和索引节点号组成。索引节点中包含文件属性,文件共享目录数,与时间有关的文件管理参数以及文件存放的物理地址的索引区等。,文件在创建时,系统在目录项中填入其文件名和分配相应的索引节点号。当某用户希望共享该文件时,则在某目录的一个目录项中填入该文件的别名,而索引节点仍然填写创建时,的索引节点号。,这时,两个具有不同文件名的文件指向同一个索引节点,共享该文件的用户对文件的操作都将引起对同一索引节点的访问。从而提供了多用户对该文件的共享。在索引节点中包含一个链接计数,用于表示链接到该索引节点上目录项的个数。每当有一个用户要共享该文件时,则索引节点中的链接计数加,1,,当用户使用自己的文件名删除该文件时,链接计数减,1,,只要链接计数不为,0,,则该文件一直存在。仅当链接计数为,0,时,该文件才真正的被删除。这种基于索引节点的共享方法也称硬连接。,2.,基于符号链的共享方法,为共享一个文件,由系统创建一个,LINK,类型的新文件,将新文件写入用户目录中,以实现目录与文件的链接。在新文件中只包含被链接文件的路径名,称这样的链接方法为符号连接。新文件的路径名只是被看成是一个符号链。在利用符号连接方法实现文件共享时,只有文件主才拥有指向其索引节点的指针,(,索引节点号,),,而共享该文件的其它用户只有该文件的路径名,而没有指向索引节点的指针。,符号链实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引节点,也要,用一定的磁盘空间。这种方法有一个很大的优点,就是它能跨越文件系统共享。,7.5.2,打开文件结构中的共享,图,7.17,打开文件结构,(1),进程打开文件表。每个进程都有一个进程打开文件表,其中每一项是一个指针,指向系统打开文件表。,(2),系统打开文件表。其也叫打开文件控制块。一个进程每打开一个文件都有一个系统打开文件表,其中包含:,f-count,指向该系统打开文件表的进程数,f-inode,指向一个打开文件的内存,Inode,(3),内存,Inode,。,主要包括:,i-addr,12,文件在盘上的位置信息,i-count,与此内存,Inode,相连系统打开文件表的个数,1.,父、子进程打开文件的共享,父进程创建子进程时,除状态、标识以及与时间有关的少数控制项外,子进程基本上是复制父进程的所有信息。子进程被创建后将拥有自己的进程打开文件表,其中的内容是复制父进程的。这时对于父进程打开的所有文件,子进程都可以使用,也就是说,子进程与父进程共享父进程所打开的文件。至此以后,父、子进程可以并发运行,它们还可以,各自独立地打开文件,但这些各自独立打开的文件不能共享。,2.,同名或异名打开文件的共享,当文件首次被打开时,系统将在打开该文件的进程打开文件表中分配一个表项、一个系统打开文件表和一个内存索引节点,同时把外存索引节点中的一些内容拷贝到内存索引节点中并建立起打开文件结构。当其它进程使用同名或异名再次打开该文件时,发现其索引节点已在内存中,这时系统在该进程的进程打开文件表中分配一个表项,同时也分配一个系统打开文件表,但不再分配内存索引节点。而是与另一进程共享内存索引节点。在这种共享方式中,共享文件的各个进程拥有各自的文件读、写指针,可以独立地对文件进行,操作。,7.5.3,管道文件,(Pipe),1.,管道的构成,管道是一种特殊的文件,确切地说,它是一个特殊的打开文件。管道由以下部分组成:,(1),一个外存索引节点;,(2),相应的内存索引节点;,(3),两个系统打开文件表。,图,7.18,管道文件的结构,2.,进程使用管道的一般形式,图,7.19,两个进程使用一个通信管道,3.,管道文件的读写,1),管道文件读写的同步,作为一种通信方式,写入管道中的数据被读出后就没有存在的价值了。为了避免占用过多的存储资源,系统对管道文件的大小做了限制,通常取,1 KB,、,2 KB,或,4 KB,。,那么,如何实现任意长度信息的传递呢,?,其基本方法是,进程向管道中写入数据时,当写入的数据大于规定的长度时,就要使写进程挂起,等到数据被读进程取走后再唤醒写进程;在读进程从管道中读数据时,当管道中的数据被读完读进程也应挂,起,待写进程再次写管道写数据时唤醒读进程。,2),管道文件读写的互斥,为了防止几个进程同时对管道文件进行读写,在对管道文件实施读写时要先对其加锁,加,锁时如果发现管道文件已经被加锁,则要等待到其它进程释放该锁。,4.,举例,在下面的例子中,父子进程使用两个管道文件进行数据交换。其中一个用于父进程向其写,数据,子进程从中读数据;另一个用于子进程向其写数据,父进程从中读数据。,/*example for pipe channel*/,define MESSAGECD*2LEN 100;,char parent=A message from parent.n;,char child=A message from child.n;,main(),int,chanl,2,chan2,2,;,char,buf,MESSAGECD,*,2LEN,;,pipe(chan1);/*create the first pipe*/,pipe(chan2);/*create the second pipe*/,if(fork,(),),/*this is parent process*/,close(chan1,0,);/*close the read channel of the first pipe*/,close(chan2,1,);/*close the write channel of the second pipe*/,write(chan1,1,parent,sizeof(parent,);,close(chan1,1,);,read(chan2,0,buf,MESSAGECD,*,2LEN);,printf(Parent,process:%s,n,buf,),;,close(chan2,0,),;,else,/*this is child process */,close(chan1,1,),;,close(chan2,0,);,read(chan1,0,buf,MESSAGECD,*,2LEN);,printf(Child,process:%s,n,buf,);,write(chan2,1,child,sizeof(child,);,close(chan1,0,);,close(chan2,1,);,本程序的执行结果是:,Child process:A message from parent.,Parent process:A message from child.,7.6,文件的存取控制,7.6.1,文件存取控制法,1.,存取控制矩阵,存取控制矩阵是一个这样的二维矩阵:一维列出系统中的所有用户,另一维列出系统中的全部文件。矩阵中的每个元素用来表示某一用户对某一文件的存取权限。存取控制矩阵法就是通过查访矩阵来确定某一用户对某一文件的可访问性。例如,设计算机系统中有,n,个用户,U,1,U,2,U,n,;,系统中有,m,个文件,F,1,F,2,F,m,,,于是可列出存取控制矩阵,其中,,R,ij,(,i,=1,2,,,m,;,j,=1,2,,,n,),表示用户,U,i,对文件,F,i,的存取权限。取权限可以是读,(R),、,写,(W),、,执行,(E),以及它们的任意组合。,表,7-4,存取控制矩阵例,2.,存取控制表,对存取控制矩阵进行分析,可以发现某一文件只与少数几个用户有关。也就是说,这样的矩阵是一个稀疏矩阵,因而可以简化。对此,我们可以把对某一文件有存取要求的用户按某种关系分成几种类型,文件主、,A,组、,B,组和其它。同时规定每一类用户的存取权限,这样就得到了一个文件的存取控制表,如表,7-5,所示。,显然,系统中每一文件都应有一张存取控制表。实际上该表的项数较少,可以把它放在文件目录项中。当文件被打开时,它的目录项被复制到内存,供存取控制验证模块检验,存取要求的合法性。,表,7-5,文件,ALPHA,的存取控制表例,3.,用户权限表,表,7-,6,用户权限表例,4.,口令,使用口令,必须事先进行口令的登记。文件主在建立一个文件时,一方面进行口令登记,另一方面把口令告诉允许访问该文件的用户。文件的口令通常登记在该文件的目录中,或者登记在专门的口令文件上。在登记口令时,通常也把文件的保护信息登记进去。保护信息可以是:,(1),该文件要不要进行保护;,(2),该文件只进行写保护;,(3),该文件读、写均需保护。,口令的形式采用最多,8,个字符的字母数字串,同时,还可以规定文件的保护方式:,(1),无条件地允许读,口令正确时允许写;,(2),口令正确时允许读,也允许写;,(3),口令正确时允许读,不管口令正确与否均不能写;,(4),无条件地允许读,不管口令正确与否均不允许写。,口令、文件保护信息被登记后,系统在下述条件下进行口令核对,以实现对文件的保护:,(1),打开文件时;,(2),作业结束要删除文件时;,(3),文件改名时;,(4),系统要求删除该文件时。,图,7.20,口令核对过程,5.,密码,文件写入时的编码及读出时译码,都由系统存取控制验证模块承担。但是,要由发出存取请求的用户提供一个变元,代码键。一种简单的编码是,利用这个键作为生成一串相继随机数的起始码。编码程序把这些相继的随机数加到被编码文件的字节中去。译码时,用和编码时相同的代码键启动随机数发生器,并从存入的文件中的各字节依次减去所产生的随机数,这样就能恢复原来的数据。由于只有核准的用户才知道这个代码键,因而他,可以正确地存取该文件。,7.6.2,文件系统的安全性,形成文件拷贝的方法基本上有两种:一种是周期性的全量转存,(Massive Dump),另一种是增量转存,(Incremental Dump),。,周期性转存有如下缺点:,(1),在转存期间,应停止对文件系统进行其它操作,以免造成混乱。因此,全量转存影响系统对文件的操作,因而不应转存正在打开进行写操作的文件。,(2),转存时间长,如果使用磁带,一次转存可能长达几十分钟,因此不能经常进行,一般每周一次。这样,从转存介质上恢复的文件系统可能与被破坏前那一时刻的文件系统差,别较大。,一旦系统发生故障,文件系统的恢复过程大致如下:,(1),从最近一次全量转存中装入全部系统文件,使系统得以重新启动,并在其控制下进行后续的恢复工作。,(2),从近到远从增量转存盘上恢复文件。可能同一文件曾被转存过若干次,但只恢复最近一次转存的副本,其它则被略去。,(3),从最近一次全量转存盘中,恢复没有恢复过的文件。,7.7,文件系统和用户间的接口,7.7.1,文件的创建和删除,1.,创建文件,用户希望创建一个新文件时,可以使用系统调用,creat,其格式为,fd,=,creat(name,mode)HT5SS,其中,,name,是用户为该文件起的符号名;,mode,表示文件的工作方式。如果将,mode,用二,进制数形式表示,则其低,9,位规定为使用该文件的各种用户的存取权限,如下所示:,2.,删除文件,如果一个文件不再需要,则用户可用系统调用,unlink,来删除,以便释放该文件所占用的存储空间。,删除文件的系统调用格式为,unlink(namep)HT5SS,其中,namep,是指向要删除的文件名。,删除,(,或取消,或撤消,),文件,首先要删去给定路径名的目录项,所以也要进行目录搜索。如果找到了相应目录项,则将其清除,并将相应,inode,中的,i-nlink,值减,1,。如果,i-nlink,值已变为,0,,而且没有其它用户正打开使用这一文件,则释放该文件占用的全部存储资源。,该系统调用与,link,配合使用,可用来改换某文件的文件名。,如果要把文件,name1,再命名为,name2,,,则使用,link(“name1”,“name2”),如果要将一个名为,name1,的文件改为,name2,,,则可按下列顺序使用系统调用:,link(“name1”,“name2”),unlink(“name1”),7.7.2,文件的打开和关闭,一个新文件被创建后,有关进程就可以用它的打开标识数,fd,进行存取。而对于一个已经存在的文件,则必须先用系统调用,open,将其打开,然后才能进行读写操作。系统调用,open,的使用形式是,fd,=open(name,mode),其中,,name,是文件名字符串;,mode,是打开后对该文件进行操作的工作方式。,mode,规定如下:,0,;,打开后可进行读操作,1,;打开后可进行写操作,2,;打开后可进行读、写操作,mode=,一个文件在打开之后,如果当前不再使用,则可调用系统调用,close,将其关闭,以切断它与用户程序的联系。一个进程终止,系统将其所有打开的文件全部关闭。系统调用,close,的使用方式是,close(,fd,),fd,是欲关闭的打开文件标识数。,在文件系统中设置打开关闭结构的好处是:第一,它们建立或切断了用户程序和该文件的联系;第二,对文件的存取权限作了进一步的限制,有利于文件保护;第三,读、写,文件时不再使用文件名,而只使用打开文件号,因为文件名可能很长。,7.7.3,文件的读写,在,UNIX,操作系统控制下运行的所有程序,在需要对文件进行读写时,都要使用读写文件的系统调用,read,和,write,。,它的格式是:,n=,read(fd,buf,nbytes,),n=,write(fd,buf,nbytes,),文件读、写系统调用,read,:,write,是顺序进行的,即后一次读、写的起始位置总是跟着前一次读、写的结尾处。例如,打开文件后,第一次读,512,字节,(0511),,第二次读时就从,512,字节开始。如果希望进行直接,(,随机,),读、写,则可用系统调用,seek,调整读、写位置。其格式是:,seek(,fd,offset,ptrname,),
展开阅读全文