- 磁盘空间管理
几乎所有文件系统都把文件分割成固定大小的块来存储,各块之间不一定相邻。
块大小
拥有大的块尺寸意味着小的文件会浪费大量磁盘空间。小的块尺寸意味着大多数文件会跨越多个块,即需要多次寻道与旋转延迟才能读出它们,浪费了时间。
记录空闲块
有两种方法被广泛采用。
磁盘块链表
每个块中包含尽可能多的空闲磁盘块号,对于1KB大小的块和32位的磁盘块号,空闲表中每个块包含有255个空闲块的块号(32位 = 4字节,1KB = 1024字节,1024/4 = 256,还需要一个位置存放指向下一个块的指针,所以是255)。对于一个500G的磁盘,需要190万个块才能存放这些地址。所以通常情况下,将这些空闲表存放在空闲块中,该方法比较适合磁盘快满时使用。
位图
n个块的磁盘需要n位位图,每一位用1表示该块空闲,0表示已分配。对于500G硬盘,只需要60000个1KB的块。
无结构文件(流式文件)
无结构文件是最简单的文件组织形式。无结构文件将数据按顺序组织成记录并积累保存,它是有序相关信息项的集合,以字节(Byte)为单位。由于无结构文件没有结构,因而对记录的访问只能通过穷举搜索的方式,故这种文件形式对大多数应用不适用。但字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于釆用字符流的无结构方式,如源程序文件、目标代码文件等。
有结构文件(记录式文件)
- 顺序文件。
文件中的记录一个接一个地顺序排列,记录可以是定长的或变长的,可以顺序存储或以链表形式存储,在访问时需要顺序搜索文件。顺序文件有以下两种结构:
第一种是串结构,记录之间的顺序与关键字无关。通常的办法是由时间决定,即按存入时间的先后排列,最先存入的记录作为第1个记录,其次存入的为第2个记录,依此类推。
第二种是顺序结构,指文件中的所有记录按关键字顺序排列。
在对记录进行批量操作时,即每次要读或写一大批记录,对顺序文件的效率是所有逻辑文件中最高的;此外,也只有顺序文件才能存储在磁带上,并能有效地工作,但顺序文件对查找、修改、增加或删除单个记录的操作比较困难。 - 索引文件。
对于定长记录文件,如果要查找第i个记录,可直接根据下式计算来获得第i个记录相对于第一个记录的地址:
然而,对于可变长记录的文件,要查找第i个记录时,必须顺序地查找前i-1个记录,从而获得相应记录的长度L。 - 索引顺序文件。
索引顺序文件是顺序和索引两种组织形式的结合。索引顺序文件将顺序文件中的所有记录分为若干个组,为顺序文件建立一张索引表,在索引表中为每组中的第一个记录建立一个索引项,其中含有该记录的关键字值和指向该记录的指针。
主文件名包含姓名和其他数据项。姓名为关键字,索引表中为每组的第一个记录(不是每个记录)的关键字值,用指计指向主文件中该记录的起始位置。索引表只包含关键字和指计两个数据项,所有姓名关键字递增排列。主文件中记录分组排列,同一个组中关键字可以无序,但组与组之间关键字必须有序。查找一个记录时,通过索引表找到其所在的组,然后在该组中使用顺序查找就能很快地找到记录。
文件控制块和索引结点
同进程管理一样,为实现目录管理,操作系统中引入了文件控制块的数据结构。 - 文件控制块。
文件控制块(FCB)是用来存放控制文件需要的各种信息的数据结构,以实现“按名存取”。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。为了创建一个新文件,系统将分配一个FCB并存放在文件目录中,成为目录项。
FCB主要包含以下信息:
基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
存取控制信息,如文件存取权限等。
使用信息,如文件建立时间、修改时间等。 - 索引结点。
在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读出该文件的物理地址。也就是说,在检索目录时,文件的其他描述信息不会用到,也不需调入内存。因此,有的系统(釆用了文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,简称为 i 结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针构成。