第12章 文件管理

第12章 文件管理算法

12.1文件系统基础数组

12.1.1文件的概念安全

计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。大多数应用程序的输入都是经过文件来实现的,其输出也都保存在文件中,以便信息的长期存储及未来的访问。当用户将文件用于应用程序的输入、输出时,还但愿能够访问文件、修改文件和保存文件等,实现对文件的维护管理,这就须要系统提供一个文件管理系统。服务器

用户经过文件系统创建文件,提供应用程序的输入输出,对资源进行管理。首先了解文件的结构,咱们经过自底向上的方式来定义。markdown

1)数据项:数据项是文件系统中最低级的数据组织形式。网络

2)记录:记录是一组相关的数据项集合,用于描述一个对象在某方面的属性。数据结构

3)文件:文件是指由建立者所定义的一组相关信息的集合,可分为有结构文件和无结构文件两种。在有结构文件中,文件由一组类似记录组成,如报考某学校的全部考生的报考信息记录;而无结构文件则被当作是一个字符流,好比一个二进制文件或字符文件。分布式

文件的属性:全部文件的信息都保存在目录结构中,而目录结构也保存在外存上。文件信息当须要时再调入内存。一般,目录条目包括文件名称及其惟一标示符,而标示符定位其余属性的信息。函数

12.1.2文件的基本操做性能

文件属于抽象数据类型。操做系统提供系统调用,对文件进行建立、写、读、定位和截断。

建立文件:建立文件有两个必要步骤。一是在文件系统中为文件找到空间;二是在目录中为新文件建立条目。此目录条目记录文件名称、在文件系统中的位置以及其余可能的信息。

写文件:为了写文件,执行一个系统调用,指明文件名称和要写入文件的内容。对于给定文件名称,系统搜索目录以查找文件位置。系统必须为该文件维护一个写位置的指针。每当发生写操做,便更新写指针。

读文件:为了读文件,执行一个系统调用,指明文件名称和要读入文件块的内存位置。一样,须要搜索目录以找到相关目录项,系统维护一个读位置的指针。每当发生读操做时,更新读指针。一个进程一般只对一个文件读或写,因此当前操做位置可做为每一个进程当前文件位置指针。因为读和写操做都是用同一指针,节省了空间也下降了系统复杂度。

文件重定位:(文件寻址)按某条件搜索目录,将当前文件位置设为给定值,而且不会读写文件。

删除文件:搜索到给定名称的文件并释放空间,找到相关目录并予以删除。

阶段文件:容许文件全部属性不变,并删除文件内容,即将其长度设为0并释放其空间。

这六个基本操做能够组成执行其余文件操做。例如,一个文件的复制,能够建立新文件;从旧文件读出并写入到新文件。

12.1.3文件的打开与关闭

由于许多文件操做都涉及为给定文件搜索相关目录条目,许多系统要求在首次使用文件时,有系统调用open。操做系统维护一个包含全部打开文件信息的表(打开文件表,open-filetable)。当须要一个文件操做时,可经过该表的一个索引指定文件,就省略了搜索环节。当文件再也不使用时,进程能够关闭它,操做系统从打开文件表中删除这一个条目。

12.1.4文件的逻辑结构

文件的逻辑结构是从用户观点出发看到的文件的组织形式。文件的物理结构是从实现观点出发,又称为文件的存储结构,是指文件在外存上的存储组织形式。文件的逻辑结构与存储介质特征无关,但文件的物理结构与存储介质的特性有很大关系。

按逻辑结构,文件有无结构文件和有结构文件两种类型:

1无结构文件:(流式文件)

无机构文件是最简单的文件组织形式。无结构文件将数据按顺序组织成记录并积累保存,它是有序相关信息项的集合,以字节(byte)为单位,对基本信息单位操做很少的文件比较适于采用字符流的无结构方式,如源程序文件、目标代码文件等。

2有结构文件(记录式文件)

有结构文件按记录的组织形式能够分为:

1)顺序文件。

记录是定长的且按关键字顺序排列。能够顺序存储或以链表形势存储,在访问时须要顺序搜索文件。顺序文件有如下两种结构:

第一种是串结构,各记录之间的顺序与关键字无关。一般的办法是由时间来决定,即按存入时间的前后排列,最早存入的记录做为第一个记录,其次存入的为第二个记录,以此类推。

第二种是顺序结构,指文件中全部记录按关键字顺序排列。

在对记录进行批量操做时,即每次要读或写一大批记录,对顺序文件的效率是全部逻辑文件中最高的;此外,也只有顺序文件才能存储在磁带上,并能有效的工做。但顺序文件对查找、修改、增长或删除单个记录的操做比较困难。

2)索引文件

对于可变长记录的文件只能顺序查找,系统开销较大,为此能够创建一张索引表以加快检索速度,索引表自己是顺序文件。在记录不少或是访问要求高的文件中,须要引入索引以提供有效的访问,实际中,经过索引能够成百上千倍的提升访问速度。

3)索引顺序表

索引顺序表是顺序和索引两种组织形式的结合。索引顺序文件将顺序文件中全部记录分为若干个组,为顺序文件创建一张索引表,在索引表中为每组中的第一个记录创建一个索引项,其中含有该记录的关键字值和指向该记录的指针。

4)直接文件或散列文件(哈希文件,Hash File)

给定记录的键值或经过Hash函数转换的键值直接决定记录的物理地址。这种映射结构不一样于顺序文件或索引文件,没有顺序的特性。散列文件有很高的存取速度,可是会引发冲突,即不一样关键字的散列函数值相同。

12.1.5目录结构

与文件管理系统和文件集合相关联的是文件目录,它包含有文件的信息,包括属性、位置和全部权等,目录存取的效率直接影响到系统的性能,因此要提升对目录的检索速度;在共享系统中,目录还须要提供用于控制访问文件的信息。此外,文件容许重名也是用户的合理和必然要求,目录管理经过树形结构来解决和实现。

(1)文件控制块和索引点

同进程管理同样,为实现目录管理,操做系统中引入了文件控制块的数据结构。

1)文件控制块。

文件控制块(FCB)是用来存放控制文件须要的各类信息的数据结构,以实现“按名存取”。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。为了建立一个新文件,系统将分配一个FCB并存放在文件目录中,称为目录项。

FCB主要包含如下信息:基本信息,存取控制信息,使用信息。

2)索引节点

在检索目录文件的过程当中,只用到了文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才须要从该目录项中独处该文件的物理地址。也就是说,在检索目录时,文件的其余描述信息不会用到,也不准调入内存。

一个FCB的大小时64B,盘块大小是1KB,则在每一个盘块中能够存放16个FCB。而在UNIX系统中一个目录仅占16B,其中14B是文件名,2B是i节点指针。在1KB的盘块中可存放64个目录项。这样但是查找文件时平均启动磁盘次数减小到原来的1/4,大大节省了系统开销。

(2)目录结构

在理解一个文件系统的需求前,咱们首先来了考虑在目录这个层次上所须要执行的操做,这有助于后面文件系统的总体理解。

搜索:当用户使用一个文件时,须要搜索目录,已找到该文件的对应目录项。

建立文件:当建立一个新文件时,须要在目录中增长一个目录项。

删除文件:当删除一个文件时,须要在目录中删除相应的目录项。

显示目录:用户能够请求显示目录的内容,如显示该用户目录中的全部文件及属性。

修改目录:某些文件属性保存在目录中,于是这些属性的变化须要改变相应的目录项。

操做时,考虑一下集中目录结构:

1)单级目录结构。

整个文件系统只创建一张目录表,每一个文件占一个目录项。

单级目录结构实现了按名存取,可是存在查找速度慢、文件不容许重名、不便于文件共享等缺点,并且对于多用户的操做系统显然是不适用的。

2)两级目录结构

单级目录很容易形成文件名称的混淆,能够考虑采用两级方案,将文件目录分红主文件目录MFD和用户文件目录UFD两级。

主文件目录项纪录用户名及相应用户文件所在的存储位置。用户文件目录项记录该用户文件的FCB信息。当某用户与对其文件进行访问时,只须要搜索该用户对应的UFD,这即解决了不一样用户文件的重名问题,也在必定程度上保证了文件的安全。可是两级结构对于用户结构内部结构没有任何帮助。用户若是须要在某个任务上进行合做和访问那其余文件时便会产生不少问题。

3)多级目录结构

也成为树形目录结构。用户要访问某个文件时用文件的路径名标识文件,文件路径名是一个字符串,由从根目录出发到所找文件的通路商的全部目录名与数据文件名用分隔符/链接起来而成。从根目录出发的路径称为绝对路径。当层次较多时,每次从根目录查询浪费时间,因而加入了当前目录,进程对各文件的访问都是相对于当前目录进行的。当用户要访问某个文件时,使用相对路径标识文件,相对路径由从当前目录出发到所找文件通路上全部目录名与数据文件名用分隔符/连接而成。

树形目录结构能够很方便的对文件进行分类,层次结构清晰,也可以更有效地进行文件的管理和保护。可是,在属性目录中查找一个文件,须要按路径名主机访问中间节点,这就增长了磁盘访问次数,无疑将影响查询速度。

4)无环图目录结构

树形目录结构可便于实现文件分类,但不便于实现文件共享,为此在树形目录结构的基础上增长了一些指向同一节点的有向边,使整个目录成为一个有向无环图。

引入无环图目录结构是为了实现文件共享,使的系统的管理变得更加复杂。

12.1.6文件共享

文件共享使多个用户进程共享同一份文件,系统中只需保留该文件的一份副本。若是系统不能提供共享功能,那么每一个须要该文件的用户都要有各自的副本,会形成对存储空间的极大浪费。

随着计算机技术的发展,文件共享的范围已由单机系统发展到多机系统,进而经过网络扩展到全球。这些文件的分享是经过分布式文件系统、远程文件系统、分布式信息系统实现的。这些系统容许多个客户经过c/s模型共享网络中的服务器文件。

现代经常使用的两种文件共享方法有:

1基于索引节点的共享方式(硬连接)

在树形结构的目录中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中,才能方便的找到该文件。

在这种共享方式中引用索引节点,即诸如文件的物理地址及其余的文件属性等信息,再也不放在目录项中,而是放在索引节点中。在文件目录中只设置文件名及指向相应索引节点的指针。在索引节点中还应有一个链接计数count,用于表示链接到本索引节点上的用户目录项的数目。当count=2时,表示有两个用户目录项链接到本文件上,或者说是有两个用户共享此文件。

2利用符号链实现文件共享(软链接)

在利用符号链方式实现文件共享时,只有文件的拥有者才拥有指向其索引节点的指针。而共享该文件的其余用户则只有该文件的路径名,并不拥有指向其索引节点的指针。这样,也就不会发生在文件主删除一个共享文件后留下一个悬空指针的状况。当文件的拥有者把一个共享文件删除后,其余用户经过符号链去访问它时,会出现访问失败,因而再将符号链删除,此时不会产生任何影响。此处咱们要注意一个问题:当一个文件删除,而在使用其符号连接以前,另外一个具备一样名称的文件被建立了。

上述两种链接方式都存在一个共同的问题,即每一个共享文件都有几个文件名。换言之,每增长一条连接,就增长一个文件名。这实质上就是每一个用户都是用本身的路径名去访问共享文件。当咱们试图去遍历整个文件系统时,将会屡次遍历到该共享文件。

硬连接和软连接都是文件系统中的静态共享方法,在文件系统中还存在着另外的共享需求,及两个进程同时对同一个文件进行操做。这样的共享能够称为动态共享。

五、文件保护

为了防止文件共享可能会致使文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取,即解决对文件的读、写、执行的许可问题。为此,必须在文件系统中创建相应的文件保护机制。

文件保护经过口令保护、加密保护和访问控制等方式实现。其中,口令保护和加密保护是为了方式用户文件被他人存取或盗取,而访问控制则用于控制用户对文件的访问方式。

1访问类型

对文件的保护能够从限制对文件的访问类型中出发。可加以控制的访问类型主要有如下几种:读:,写,执行,添加,删除,列表清单。

这些高层的功能能够经过系统程序调用低层系统调用来实现。保护能够只在底层提供。例如,复制文件可利用一系列的请求来完成。这样,具备读访问用户同时也具备复制和打印的权限了。

2访问控制

解决访问控制最经常使用的方法是根据用户身份进行控制。而实现基于身份访问的最为普通的方法是为每一个文件和目录增长一个访问控制列表(Access-Control List,ACL),以规定每一个用户名及其所容许访问的类型。

这种方法的优势是可使用复杂的访问方法。其缺点是长度没法预期而且可能致使复杂的空间管理,使用精简的访问列表能够解决这个问题。

精简的访问列表采用拥有者、组合其余三种用户类型。1)拥有者:建立文件的用户。2)组:一组须要共享文件且具备相似访问的用户。3)其余:系统内的全部其余用户。这样只需用三个域列出访问表中这三类用户的访问权相便可。

口令和密码是另外两种访问控制方法。

口令指用户在创建一个文件时提供一个口令,系统为其创建FCB时附上相应的口令,同时告诉容许共享该文件的其余用户。用户请求访问时必须提供相应的口令。这种方法时间和空间的开销很少,缺点是口令直接存在系统内部,不够安全。

密码纸用户对文件进行加密,文件被访问时须要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费必定时间。

口令和密码都是仿制用户文件被他人存取或盗取,并无控制用户对文件的访问类型。

注意两个问题:

1)现代操做系统经常使用的文件保护方法,是将访问控制列表与用户、组和其余成员访问控制方案一块儿组合使用。

2)对于多级目录结构而言,不只须要保护单个文件,并且还须要保护子目录内的文件,即须要提供目录保护机制。目录操做与文件操做并不相同,所以须要不一样的保护机制。

12.2文件系统实现

12.2.1文件系统层次结构

现代操做系统有多种文件系统类型,所以文件系统的层次结构也不尽相同。

1用户调用接口

文件系统为用户提供与文件及目录有关的调用,如新建、打开、读写、关闭、删除文件,创建、删除目录等。此层由若干程序模块组成,每一模块对应一条系统调用,用户发出系统调用时,控制即转入相应的模块。

2文件目录系统

文件目录系统的主要功能是管理文件目录。

3存取控制验证

实现文件保护主要由该级软件完成,它把用户的访问要求与FCB中指示的访问控制权限进行比较,以确认访问的合法性。

4逻辑文件系统与文件信息缓冲区

逻辑文件系统与文件信息缓冲区的主要功能是根据文件的逻辑结构将用户要读写的逻辑记录转换成文件的逻辑结构内的相应块号。

5物理文件系统

物理文件系统的主要功能是把逻辑记录所在的相对块号转换成实际的物理地址。

6分配模块

分配模块的主要功能是管理辅存空间,即2负责分配辅存空闲空间和回收辅存空间。

7设备管理程序模块

设备管理程序模块的主要功能是分配设备、分配设备读写缓冲区、磁盘调度、启动设备、处理设备中断、释放设备读写缓冲区、释放设备等。

12.2.2目录实现

在读文件前,必须先打开文件。打开文件时,操做系统利用路径名找到相应目录项,目录项中提供了查找文件磁盘块所须要的信息,目录实现的基本方法有线性列表和哈希表两种方法。

(1)线性列表

最简单的目录实现方法是使用存储文件名和数据块指针的线性表。

(2)哈希表

哈希表根据文件名获得一个值,并返回一个指向线性列表中元素的指针。这种方法的有点事查找很是迅速,插入和删除也较简单,不过须要一些预备措施来避免冲突。最大的困难是哈希表长度固定以及哈希函数对表长的依赖性。

目录查询必须经过在磁盘上反复搜索完成,须要不断的进行I/O操做,开销较大。因此如前面所述,为了减小I/O操做,把当前使用的文件目录复制到内存,之后要使用该文件时只要在内存中操做,从而见底了磁盘操做次数。

12.3文件实现

12.3.1文件分配方式

文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。经常使用的磁盘空间分配方式有三种:连续分配、连接分配和索引分配。

1)连续分配

连续分配方法要求每一个文件在磁盘上占有一组连续的块。磁盘地址定义了磁盘上的一个线性排序。这种排序使做业访问磁盘时须要的寻道数和寻道时间最小。

文件的连续分配能够用第一块的磁盘地址和连续块的数量来定义。一个文件的目录条目包括开始块的地址和该文件所分配区域的长度。

连续分配支持顺序访问和直接访问。其优势是实现简单、存取速度快。缺点在于,文件长度不宜动态增长,由于一个文件末尾后的盘块可能已经分配给其余文件,一旦须要增长,就须要大量移动盘块。此外,反复增删文件后会产生外部碎片(与内存管理分配方式中的碎片类似),而且很难肯定一个文件须要的空间大小,于是只适用于长度固定的文件。

2)连接分配(离散分配)

连接分配解决了连续分配的碎片和文件大小问题。采用连接分配,每一个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个盘块外,每一个盘块都有指向下一个盘块的指针,这些指针对用户是透明的。目录包括文件第一块的指针和最后一块的指针。

连接分配方式没有外部碎片,空闲空间列表上的任何块均可以用来知足请求。建立文件时并不须要说明文件大小。只要有空闲块文件就能够增大,也无需合并磁盘空间。

连接分配的缺点在于没法直接访问盘块,只能经过指针顺序访问文件,以及盘块指针消耗了必定的存储空间。连接分配方式的稳定性也是一个问题。

3)索引分配

链接分配解决了连续分配的外部碎片和文件大小管理的问题。可是,连接分配不能有效支持直接访问(FAT除外)。

每一个文件都有其索引块,这是一个磁盘块地址的数组。访问文件须要两次访问外存——首先要读取索引块的内容,而后在访问具体的磁盘块,于是下降了文件的存取速度。为了解决这一问题,一般将文件的索引块读入内存的缓冲区,以加快文件的访问速度。

12.3.2文件存储管理

1文件存储管理空间的划分与初始化。

一个文件存储在一个文件卷中。文件卷能够是物理盘的一部分,也能够是整个物理盘,支持超大型文件的文件卷也能够是有多个物理盘组成。

在一个文件卷中,文件数据信息的空间(文件区)和存放文件控制信息FCB的空间(目录区)是分离的。因为存在不少种类的文件表示和存放格式,因此现代操做系统中通常都有不少不一样的文件管理模块,经过他们能够访问不一样格式的逻辑卷中的文件。逻辑卷在提供文件服务前,必须由对应的文件程序进行初始化,划分好目录区和文件区,创建空闲空间管理表格及存放逻辑卷信息的超级块。

文件存储设备的管理实质上是对空闲块的组织和管理,它包括空闲块的组织,分配与回收等问题。

12.三、磁盘组织与管理

一、磁盘的结构

磁盘是由表面涂有磁性物质的金属或塑料构成的圆形盘片,经过一个称为磁头的到体系安全从磁盘中存取数据。因为扇区按固定圆心角划分,因此密度从最外道向里道增长,磁盘的存储能力受限于最内道的最大记录密度。

磁盘地址用“柱面号-盘面号-扇区号(或块号)”来表示。

二、磁盘调度算法

目前经常使用的磁盘调度算法有如下几种:

1)先来先服务(FCFS)算法

根据进程请求访问磁盘的前后顺序进行调度处理,这是一种最简单的调度算法。这种算法的优势是具备公平性。若是只有少许进程须要访问,且大部分请求都是访问簇聚的文件扇区,则会达到较好的性能;但若是有大量进程竞争使用磁盘,那么这种算法在性能上每每低于随即调度。因此,实际磁盘调度中考虑一些更为复杂的调度算法。

2)最短寻找时间优先(SSTF)算法

SSTF选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,一是每次的寻找时间最短。固然,老是选择最小寻找时间并不能保证平均寻找时间最小,可是能提供比FCFS算法更好的性能。这种算法会产生饥饿现象。

3)扫描(SCAN)算法又称为电梯算法

SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求做为下一次服务的对象。因为磁头移动规律与电梯运行类似,故又称为电梯调度算法。SCAN算法对最扫描过的区域不公平,所以,他在访问局部性方面不如FCFS算法和SSTF算法好。

4)循环扫描(C-SCAN)算法

在扫面算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。因为SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,因此使用改进型的C-SCAN算法来避免这个问题。

采用scan算法和c-scan算法时磁头老是严格地遵循从盘面的一端到另外一端,显然在实际使用时还能够改进,即磁头移动只须要到达最远端的一个请求便可返回,不须要到达磁盘端点这种形式的SCAN算法和C-SCAN算法成为LOOK和C-LOOK调度。这是由于它们在朝一个给定方向移动前会查看是否有请求。

对比以上几种磁盘调度算法,FCFS算法太简单,性能较差,仅在请求队列长度接近于1时才较为理想;SSTF算法较为通用和天然;SCAN算法和C-SCAN算法在磁盘负载较大时比较占优点。

除了减小寻找时间外,减小延迟时间也是提升磁盘传输效率的重要因素。

三、磁盘的管理

1磁盘初始化

一个新的磁盘只是一个含有磁性记录材料的空白盘。在磁盘能存储数据以前,它必须分红扇区以便磁盘控制器能进行读和写的操做,这个过程称为低级格式化(物理分区)。低级格式化为磁盘的每一个扇区采用特别的数据结构。

为了使用磁盘存储文件。操做系统还须要将本身的数据结构记录在磁盘上:第一步将磁盘分为一个或多个柱面组成分区;低而不对物理分区进行逻辑格式化,操做系统将出师的文件系统数据结构存储在磁盘上,这些数据结构包括空闲和已分配的空间以及一个初始为空的目录。

2引导块

计算机启动时须要运行一个初始化程序(自举程序),它初始化CPU、寄存器、设备控制器和内存等。

自举程序一般保存在ROM中,为了不改变自举代码须要改变ROM硬件的问题,故指在ROM中保留很小的自举装入程序,将完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位。拥有启动分区的磁盘称为启动磁盘或者系统磁盘。

3坏块

因为磁盘有移动部件且容错能力弱,因此容易致使一个或多个扇区损坏。

对于简单磁盘,坏扇可手工处理。对于复杂的磁盘,其控制器维护一个磁盘坏块链表。低级格式化将一些块保留做为备用,对操做系统透明。控制器可使用备用块来逻辑地代替坏块,这种方案称为扇区备用。

相关文章
相关标签/搜索