1. 有结构文件 文件内容由定长记录和可变长记录组成。定长记录存储文件的格式,文件编码,文件描述等结构化数据项;可变长记录用来存储文件的具体内容。 上图就是PNG图片的文件结构,分成了文件标记,文件结束标记和文件的数据块三个部分,在这个图中,定长记录就是PNG文件标记和文件结束标记,可变长记录就是PNG数据块。除了PNG,大多数文件都遵循如上图的文件结构格式分为定长记录和可变长记录。
2. 无结构文件 也被称为流式文件。文件内容以字节为单位,常见的如exe,dll,so文件都属于流式文件。
顺序文件指的是按照顺序存放在存储介质中的文件,比如磁带就是只能存储顺序文件的存储介质。由于顺序文件是按照顺序存储,在读和写的时候只需要按照顺序去读写就可以,因此顺序文件是所有逻辑文件中存储效率最高的
但是顺序文件在进行增删改的时候效率极低,由于可变长文件不适合使用顺序文件格式存储,就有了索引文件,它是解决可变长文件存储的文件格式。相对顺序文件,它需要配合索引表进行存储。
1.连续分配 如果一个文件存储的时候需要一系列扇区,会直接把连续的一片扇区分配给它。 顺序读取文件内容非常容易,且速度非常快 但是对存储的要求很高,需要满足文件容量大小的连续存储空间
2.链接分配 为了解决连续分配的缺点,它会把文件存储在离散的盘块里,需要额外的存储空间来存储文件盘块的链接顺序。 按照额外存储空间的不同,分为隐式链接和显式链接。
隐式分配的下一个链接的指向存储在当前盘块中。如果有一个文件需要使用4个盘块,分别是第2,9,7,16个。如果使用隐式链接,会在第2个盘块里面存储它的下一个盘块在哪里,同样第9个盘块也会存储指向第7个盘块。 隐式分配非常适合顺序访问,因为在数据访问的时候只需要知道第1个盘块就会查找到剩余的盘块。 但它的随机访问效率很低,假如需要访问文件的第16个盘块,由于它只能从头部开始,先要找到第2,在找到第9,第7,最后才能找到目标盘块。不管访问哪一个盘块都需要从文件的第一个盘块开始遍历。 同时隐式分配的可靠性很差,任何一个链接出了问题都会影响整个文件。
还是上面的文件例子,显式链接分配使用FAT表(File Allocation Table),这张表存储物理盘块以及下一盘块地址,这些存储的相关数据显示在一张表上。这里的FAT就是平时所说的FAT文件系统,显示链接分配是FAT文件系统的工作原理。 FAT不支持高效的直接存储,因为它的记录项非常多,磁盘越大,FAT记录越大。如果需要在FAT文件系统里面存储一个比较大的数据,就需要检索FAT表去找多很多空闲的盘块号。 检索时FAT表占用较大的存储空间,对某一个文件进行读取时,需要将整个FAT都加载到内存里面。
3.索引分配 索引分配会把一个文件所有的盘块集中存储,存储所有盘块的位置成为索引。当需要读取某一个文件的时候,只需要把文件的索引读取到内存就可以了。 还是使用链接分配中的例子,索引分配会使用一个额外的盘块存储它所需要的盘块,假如这个盘块是10。那么10就会存储2,9,7,16。在磁盘里10 是文件的索引,10指向第2,7,9,16。 每一个文件都拥有一个索引块,记录所有盘块信息。 索引分配方式支持直接访问盘块,在索引里可以直接找到文件对应的盘块。 文件较大时,索引分配具有明显优势。主流文件系统都是使用索引分配来进行磁盘分配的。
主要有三种方法:
1.空闲表 如图所示,空闲表存储两个重要内容,第一个空闲盘块号和空闲盘块数,结合两个信息,可以得知在磁盘的第2个盘块号开始有一段连续的空闲盘块,空闲盘块一共有四个。 使用空闲表,空闲盘区的分配与内存分配类似,也使用首次适应算法,循环适应算法、快速适应算法来分配空闲盘块。 回收过程也与内存回收类似。
2.空闲链表 把所有的空闲盘区组成一个空闲链表 链表的每一个节点存储空闲盘块以及空闲的数目,存储的数据和空闲表是一样的。
3.位示图 图片来源:慕课网《编程必备基础》 横向表示盘块,纵向表示磁道。每一个具体的盘块都会有0或1的标记,0表示这一盘块没有被使用,1则表示被使用。
位示图的优点
维护成本非常低,只需要维护一个表即可可以非常容易的找到空闲盘块使用0/1比特位,所占用的空间非常小实际辅存的分配方式主要使用位示图进行管理
使用目录树 图片来源:慕课网《编程必备基础》
如上图,方框表示目录,圆圈表示文件。上图是一个目录树。 根目录有三个目录A、B、C;A有三个子目录D、E、F;D有一个子文件M;E有两个子目录;F有一个子文件,其他目录同理。
目录树使得每一个文件或目录都有一个唯一的路径 比如M的路径为A/D/M,比如L目录的路径为C/I/L。