文件的属性
一个文件有以下属性:
- 文件名。由创建文件的用户决定文件名,主要为了方便用户找到文件,同一目录下不允许由重名文件
- 标识符:一个系统内的各文件的标识符唯一,标识符指示操作系统用于区分各个文件的内部名称。
- 类型:指明文件的类型。
- 位置:文件存放的路径、在外存中的地址。
- 大小:指明文件大小。
- 保护信息:对文件进行保护的访问控制信息。
文件结构
按结构分类
文件按结构可分为无结构文件和由结构文件。
无结构文件:文件内部的数据就是一系列二进制流或字符流组成,又称“流式文件”,如:windows操作系统中的.txt文件。
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录由若干个数据项组成。如数据库表文件。根据各条记录的长度是否相等,又可分为定长记录和可变长记录两种。
索引文件
由于可变长记录文件不能实现随机访问,每次访问文件都需从头遍历查找,因此可以通过建立一张索引表来加快文件检索速度。
索引表本身是定长记录的顺序文件,因此可以快速找到第i各记录对应的索引项。
缺点:由于每个记录对应一个索引表项,因此索引表可能会很大。
索引顺序文件
索引顺序文件时索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:一组记录对应一个索引表项。
文件的物理结构
操作系统需要通过一定的方法将文件的逻辑结构转换为文件物理结构,以此可以实现对外存的操作。
连续分配
连续分配方法要求每个文件在磁盘上占有一组连续的块。
在连续分配中,物理块号=起始块号+逻辑块号,下图起始块号为4。
由于可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问。
读取某个磁盘块时,需要移动磁头。因此访问的两个磁盘块相隔越远,移动磁头所需时间就越长。
连续分配因为在物理上需要采用连续的内存块,因此在文件拓展时很不方便。
物理上采取连续分配也可能会导致存储空间利用率低, 会产生难以利用的硬盘碎片。
链接分配
链接分配采取离散分配的方式,分为隐式链接和显式链接两种。
隐式链接。隐式链接会建立一个目录,目录中记录了文件存放的起始块号和结束块号。若想将用户给出访问的逻辑块号i,则会从该目录项中找到起始块号,将通过起始块号找到下一个块号,以此类推来找到逻辑块号i的物理块号。
因此隐式链接只支持顺序访问,不支持随机访问,查找效率低。
显式链接。该方式会将链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,该表会将某个新创建的文件的指针关系显式的表示在表中),由此目录中只需记录文件的起始块号,然后根据文件分配表即可找到相应的物理块号。注:一个磁盘仅设置一张文件分配表,开机时,将文件分配表读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每个表项长度相同,因此“物理块号”字段可以是隐含的。
采用显式链接方式的文件,支持顺序访问也支持随机访问。
索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。
假设某个新创建文件“aaa”的数据以此存放在磁盘块2->5->13->9中,7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容,如下图。
索引表是一个文件对应一张索引表。
由上可得索引发分配方式是支持随机访问,且文件拓展也很容易实现(只需给文件分配一个空闲块,并增加一个索引表项即可)。
当文件过大至于索引块无法支持文件使用索引表,因此可以采用以下机制来处理这种问题。
- 链接方案。如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
- 多层索引。建立多层索引。使第一层索引块指向第二层索引块,还可根据文件大小的要求再建立第三层、第四层索引块。若采用多层索引,则各层索引表大小不能超过一个磁盘块。
- 混合索引。多种索引分配方式的结合。例,一个文件的顶级索引表中,即包含直接地址索引)(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。
文件存储空间管理
空闲表法
属于连续分配方式,会为外存上的所有空闲区建立一张空闲表,包括第一个空闲盘块号和空闲盘块数。
分配磁盘块:可采用首次适应、最佳适应、最坏适应等算法来决定为文件分配哪个区间。
回收磁盘块:
回收某个存储区时有四种情况:
- 回收区的前后都没有相邻空闲区。
- 回收区的前后都是空闲区。
- 会收取前面是空闲区。
- 会收取后面是空闲区。
回收时需要注意表项合并问题。
空闲链表法
该法是将所有空闲盘区拉成一条空闲链,根据构成链所用基本元素不同,分为两种形式:
空闲盘块链
每个空闲盘中存储着下一个空闲盘块的指针
空闲盘区链
连续的空闲盘块组成一个空闲盘区,空闲盘区的第一个盘块内记录了盘区的长度、下一个盘区的指针。
位示图法
位示图法是利用二进制的一位来表示磁盘中的盘块使用情况,一般以“0”表示盘块空闲;为“1”时,表示已分配。
分配磁盘块:顺序扫描位示图,找到要分配个数的空闲磁盘块,然后根据字号、位号算出盘块号分配给文件,并将相应位置设置为“1”。
回收磁盘块:根据回收的盘块号计算出对应的字号、位号;再将相应的二进制位设为“0”。
成组链接法
成组链接法组合了空闲表和空闲链表两种方法,它将存放一组空闲盘块号的盘块称为组链块,然后将一定数列的空闲盘块号放在第一个成组链块中,组链块中第一位放着下一组空闲盘块数,再通过指针链接,从而克服了表太长的缺点。
分配盘块:分配盘块会根据组块链第一个位置所存放的盘块数,来比较与要分配的盘块数大小,若当前组块链空闲块号足够,则会将最后几位分配给文件,并修改空闲块数。
回收盘块:若超级块中空闲块没满,则回收盘块后会将组块链的空闲盘块数增加,若超级块中空闲块已满,则会新建一个组块链,然后使超级块链接新组块链,将收回的空闲块放入超级块中,并且新的组块链来连接剩余的分组。