首页 > 系统 > 其他 >

[OS复习]文件管理2

2016-08-29

基本信息:文件名、文件类型、文件组织等; 地址信息:卷(存储文件的设备)、起始地址,(起始物理地址)、文件长度(以字节、字或块为单位)等。 访问控制信息:文件所有者、访问信息(用户名和口令等)、合法操作等;

1.文件目录

1.1文件目录的内容

基本信息:文件名、文件类型、文件组织等;
地址信息:卷(存储文件的设备)、起始地址,(起始物理地址)、文件长度(以字节、字或块为单位)等。
访问控制信息:文件所有者、访问信息(用户名和口令等)、合法操作等;
使用信息:创建时间、创建者身份、当前状态、最近修改时间、最近访问时间等。

1.2目录内容的组织方式及分析

目录项:全部目录内容
目录项:部分目录信息,如文件名、文件大小、外存中的存储位置等,其余部分保存在文件头部。

1.3目录文件及操作

目录文件:多个文件的目录项构成的一种特殊文件。
其操作包括:搜索目录、创建目录、删除目录、显示目录、修改目录。

1.4目录结构

单级目录结构:所有用户的全部文件目录保存在一张目录表中,每个文件的目录项占用一个表项。
\
实现简单,易于维护。
问题:重名问题;存放文件数量受限;当目录文件很大时,检索时间长;不便于实现文件共享。两级目录结构:主文件目录、用户文件目录
\
一定程度解决了重名问题,提高了文件目录检索效率,简单的文件共享。
问题:不便用户文件的逻辑分类;需要进一步解决重名、共享、检索效率等问题。

层次目录结构 :

树形目录:\
无循环图结构:\

2.文件的逻辑组织与访问

2.1有结构文件与文件系统

大多数的文件系统是无结构文件系统。实际应用却需要处理各种数据结构,这些数据结构一般不依赖文件系统,而是由相应的应用程序提供。例如,UNIX的文件系统,它本身不含任何数据结构。但是,UNIX却能支持使用有结构文件的应用程序,如各种基于UNIX操作系统的数据库管理系统、电子邮件系统等。这类应用程序必须能定义自己的数据结构,并能实现记录与字节流之间的转换。一种电子邮件的格式定义:
type message = record
to    :  array [ ] of address ;
from  :  array [ ] of address ;
subject :  array [ ] of line ;
cc    :  array [ ] of address;
body  :  array [ ] of string ;

Procedure getRecord (void) ;
var msg : message ;
begin
msg = allocate(sizeof(message));
msg . to = getAddress(…); 
msg . from = getAddress(…);
msg . cc = getAddress(…);
msg . subject = getLine(…);
msg . body = getString(…);
return(msg);
end.    
Procedure putRecord (void) ;
var msg : message ;
begin
putAddress(msg . to);
putAddress(msg . from); 
putAddress(msg . cc); 
putLine(msg . subject);   
putString(msg . body);    
end; 

配置在某些大型计算机中的操作系统,如IBM MVS 、Macintosh的文件系统自身就能提供若干数据结构。
文件系统直接控制管理有结构文件,称为有结构文件系统,或高级文件系统。

2.2文件的组织一般原则

有利于快速访问文件记录。该原则适用于访问单条记录。若以批量方式访问文件,该原则不太重要。
易于更新。更新文件内容时,可能需要首先查找源数据,再进行修改。但是,对于 CD-ROM 文件,该原则这并不重要。
存储代价小,无冗余信息。但是,有时候必须牺牲适量的存储空间,以提高文件访问速度。
维护简单 ,可靠性高。

2.3有结构文件

有结构文件包括:堆文件、顺序文件、索引顺序文件、索引文件、直接(哈希)文件。堆文件:最简单的文件组织方式。可以是无结构的字节流文件,也可以是由记录构成的有结构文件。组成堆文件的记录可以有不同的字段、不同的长度。因此,严格地说,堆文件应该属于无结构文件。记录按到达先后次序存放,最开始存入的记录为第一条记录,接着存入第二条记录,第三条记录,其余依次类推。\有利于累计并保存大批量数据。常用于存放刚采集到的、未被处理的数据,或存储后较少访问的数据,或者不便于组织的数据。堆文件易于更新,因为更新数据直接追加到文件尾,无须插入到某个中间位置。但是,堆文件的记录访问效率极低。因此,大多数应用程序都不采用该文件类型。顺序文件:由若干条逻辑记录按照其关键字的某种顺序排列而构成的文件,是最常用的文件组织方式。每条记录都包含固定的字段,具有相同的长度。每条记录都包含一个特殊字段关键字,不同记录的关键字是不同的。记录按关键字排序,若关键字字段的类型是字符型,则按字母排序;若关键字字段是数值型,则按数字排序。\

常用于批量数据处理,这时文件的访问效率最高。是唯一、同时适合在磁盘和磁带中存储的文件。访问效率比堆文件高。当文件较小,可以将文件全部装入内存,利用某种快速的查找算法,如折半查找法、插值查找法等快速查找指定的记录。但是,访问一个大型顺序文件时,效率将会大大降低。更新效率较低。因为记录必须插入到按关键字排序的某个位置,其后的各记录必须进行物理上的位移,效率非常低。解决方法:单独建立一个日志文件,或事务文件。新记录首先放在日志文件中,通过周期性地执行批量更新操作,把日志文件合并到主文件中,并按原有的关键字顺序排列全部记录。索引顺序文件:将主文件(顺序文件)的所有记录按照某种标准分组,例如,首字母相同的记录为一组;或按每小时或某固定长度的时间将记录分组;或者按固定条数的记录为一组,为主文件建立一张索引表。索引表记载每一组的第一条记录的关键字值和指向该记录的指针。索引表和主文件(顺序文件)一起形成索引顺序文件。\向索引顺序文件插入记录:将记录直接插入顺序文件中,效率非常低。建立备份文件。新记录首先插入备份文件中,系统再周期性地批量合并主文件和备份文件。为主文件的每条记录增加一个指针域,指向备份文件的某一条记录,该指针域对应用程序透明。插入新记录到备份文件时,修改新记录逻辑前序记录的指针:前序记录可能在主文件中,可能在在备份文件中。直接(哈希)文件利用Hash函数,根据记录的关键字计算记录的存储位置,并按关键字访问记录,能提高记录的访问效率。常用于访问速率要求高、一次存取一条记录且记录为定长的文件。如文件目录、价格表、名单等文件记录的存取。

3.文件的物理组织—存储空间的管理

文件存储空间分配的有关问题:从逻辑组织的角度看,文件由若干记录构成;从物理组织的角度看,文件由若干数据块组成。操作系统或文件管理系统负责为文件分配和管理数据块。那么,如何划分磁盘空间?如何为一个新建文件分配空间?如何为一个已存在的文件增加存储空间?用什么数据结构记载文件已分配到的数据块和空闲数据块?

3.1预分配与动态分配

创建新文件时,需要分配存储空间。一次性地为新文件分配足够的存储空间,这是预分配的思想。先为文件分配一部分存储空间,以后再根据需要增加存储空间,该方法称为动态分配。要求文件创建时必须申明需要的最大空间。编译程序,拷贝文件,通过网络传输文件等,可以预先知道文件的大小;很多应用都不可能预先知道文件需要的最大空间。预先准确估计文件大小是不可能的。如果估计的空间太小,无法满足文件的存储需要和存储空间的增长需要;如果估计太大,会浪费存储空间。动态分配方法能满足文件存储空间的增长需要。

3.2分区大小

外存空间被分成若干大小相同的数据块,类似于内存空间的分页管理技术。分区 = 数据块,该方法有利于提高外存空间的利用率,但I/O性能较低。也可以采用可变大小的分区 ,此时分区 = 若干连续数据块。与分区大小有关的因素:文件中的数据相邻存储有利于提高性能;若分区太小,文件分配到的分区数目将会很多。用于管理分区(已分配和未分配的)的数据结构如表格等将会很大,增加管理复杂度;若分区大小固定,将会简化空间的分配和回收;若分区大小可变,或分区大小固定且较小,可以减少存储空间的浪费。确定分区大小时,需要综合考虑以上若干因素。可变大小的分区 vs.固定小分区 :对于预分配方法,若采用小分区,预先分配给文件足够数量的小分区,可能使文件分配表很大。但由于文件空间不再增加,文件分配表将保持固定大小,不会改变。若采用可变大小的连续分区模式。无须设置文件分配表,只需要记住文件存储空间的第一个数据块的地址和分区大小,就能定位一个文件。

3.3文件存储空间的分配技术

该技术可以分为连续分配和非连续分配。其中,非连续分配可以进一步分为链接分配和索引分配。连续分配:采用可变大小的连续分区、预分配技术。把逻辑文件中的数据顺序地存储到物理上邻接的各个数据块中,这样形成的物理文件可以进行顺序存取。优点:简单、容易实现。文件分配表中为每个文件建立一个表项,其中记载文件的第一个数据块地址及文件长度。对于顺序文件,连续读/写多个数据块内容时,性能较好。能很快检索文件中的一个数据块。例如,如果一个文件的第一个数据块的序号为x,需要检索文件的第y块,则该数据块在外存中的位置为x+y-1。连续分配存在的问题:不利于文件尺寸的动态增长。空间利用率不高:对于需要很长时间才能完成增长的文件,预先分配的较大存储空间也会在较长时间得不到有效利用。该分配方案可能会导致磁盘碎片,严重降低外存空间的利用率。解决方法之一,系统定期或不定期采用紧凑技术,将小分区合并为大的、连续分区,将文件占用空间合并在一起。链接分配:连续分配的文件分区太大,不利于存储空间的有效利用。非连续分配可以将文件分区划小,最小的文件分区基于一个数据块。能显著提高存储空间的利用率。链接分配方法可以按基于数据块的文件分区进行分配,为文件分配非连续的若干数据块,数据块之间用指针相连。链接分配消除连续分配引起的外部碎片,提高了外存空间的利用率。能适应文件尺寸的动态增长。文件分配表中的目录项也非常简单,只需记载文件的第一个数据块地址和文件长度。链接分配适合于文件的顺序存取,但对于随机存取却相当低效。如果要访问文件的第i 个数据块,必须首先从文件分配表的相应目录项中找到该文件的第一个数据块地址,读出第一个数据块中包含的第二个数据块的指针。然后,从第二个数据块中读出指向第三个数据块的指针。依次类推,直到找到第 i –1个数据块,从中读出指向第i 个数据块的指针。最后,读取第 i 个数据块的内容。如果一个文件包含成百上千个数据块,则需要花费很长的时间来访问接近链表尾的数据块。大量数据块依靠块内指针逐一相连,其可靠性较差。每个数据块必须包含指针信息,这将占用额外存储空间。

索引分配:

索引分配能解决连续分配和链接分配存在的诸多问题。不需要在每个分区中花费额外存储空间存储链接指针,而是利用专门的索引结点存储索引信息。索引分配可以基于大小固定的分区。基于数据块的分区能消除外部碎片,但索引项较多,可能使一个数据块容纳不了一个文件的所有分区的索引。基于可变分区的索引分配可以保证文件存储空间的局部连续性,有利于提高文件访问性能,减少文件的索引项。索引分配的优点:支持文件的直接存取。当需要存取文件的第i号分区时,可以直接从索引表中找到第i个分区的数据块号或可变分区的起始数据块号。能满足文件的动态增长需要,只需要更新索引结点的内容,就可以把新增加的分区记录下来。利用多级索引,可以支持大型文件的存取。索引分配存在的问题:对于一些较小的文件,例如,仅需要几个数据块的文件,采用索引分配方案也必须为之建立一个索引表,索引节点的利用率较低。如果文件太大,建立多级索引会花费很长时间,而且需要海量存储空间。对于一些较小的文件,例如,仅需要几个数据块的文件,采用索引分配方案也必须为之建立一个索引表,索引节点的利用率较低。如果文件太大,建立多级索引会花费很长时间,而且需要海量存储空间。

相关文章
最新文章
热点推荐