文件的逻辑结构
1.无结构文件
又称“流式文件”。由二进制流或字符流组成,无明显逻辑结构。
2.有结构文件
①顺序文件 (默认各记录在物理上顺序存储)
串结构:记录顺序与关键字无关
顺序结构:记录按关键字顺序排列
可变长的顺序文件无法实现随机存取(可变长纪录得顺序文件在每次查询时只能从头依次查找),定长记录可以实现随机存取。
定长记录、顺序结构的顺序文件可以快速检索(根据关键字快速找到记录)。
缺点:不方便增删纪录
②索引文件
索引文件:建立一张索引表,每个记录对应一个表项。各记录不用保持顺序,方便增删记录
索引表本身就是定长记录的顺序文件,一个索引表项就是一条定长记录,因此索引文件支持随机存取。
若索引表按关键字顺序排列,则可支持快速检索。
评价:解决了顺序文件不方便增删记录的问题,同时让不定长记录的文件实现了随机存取,但索引表可能占用很多空间。
③索引顺序文件
索引顺序文件:将记录分组,每组对应一个索引表项
检索记录时先顺序检索索引表,找到分组,再顺序查询分组
当记录过多时,可建立多级表项。
会计算平均查找次数
文件目录
1.文件目录的实现
一个文件对应一个FCB(文件控制块),一个FCB就是一个目录项,多个FCB组成文件目录。
对目录的操作:搜索、创建、删除、显示、修改文件
2.目录结构
①单级目录结构:
一个系统只有一张目录表,不允许文件重名
②两级目录结构:不同用户文件可以重名,但不能对文件进行分类
③多级(树形)目录结构:
不同目录下的文件可以重名,可以对文件进行分类,不方便文件共享。系统根据“文件路径”找到目标文件。
从根目录出发的是绝对路径,从当前目录出发的是相对路径
④无环图目录结构:在树形目录结构基础上,增加一些指向同一结点的有向边,使整个目录成为一个有向无环图。
为共享结点设置一个共享计数器,计数器为0时才能真正删除结点
3.索引结点(对FCB的优化)
除了文件名之外的所有信息都放到索引结点中,每个文件对应一个索引结点。
目录项中只包含文件名,索引结点指针,因此每个目录项的长度大幅减小。目录项长度减小,每个磁盘块可以存放更多个目录项,因此检索文件时磁盘I/O的次数就减少了很多·a
4.文件的物理结构 (文件分配方式)
① 连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块。
优点:支持顺序访问和直接访问(随机访问);连续分配的文件在顺序访问时速度最快。
缺点:不方便文件扩展;存储空间利用率低,会产生磁盘碎片。
问:用户通过逻辑地址操作自己的文件,操作系统如何实现逻辑地址到物理地址的转换?
用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项,物理块号=起始块号+逻辑块号,注意检查逻辑块号的合法性(逻辑块号<长度)
②链接分配
链接分配采取离散分配方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接两种。
隐式链接:
隐式链接:除文件的最后一个盘块之外,每个盘块中都存有下一个盘块的指针,文件目录包括第一块和最后一块的指针。
优点:很方便文件扩展,不会有碎片问题,外存利用率高。
缺点:只支持顺序访问,不支持随机访问,查找效率低;指向下一盘块的指针会耗费少量存储空间。
显式链接:
显示存储:把用于链接文件各物理块的指针显式地存放在 一张表中,即文件分配表(FAT)。一个磁盘只会建立一张文件分配表,开机时文件分配表放入内存,并常驻内存。
优点:很方便进行文件扩展,不会有碎片问题,外存利用率高;支持随机访问;
缺点:FAT会占用一定的存储空间。
③索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件分配一张索引表,索引表中记录了文件每个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表--建立逻辑页到物理页之间的映射关系)索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。
若文件太大,索引表项太多,可以采取以下三种方法解决:
①链接方案:若果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
缺点:若文件太大,索引表很长,就需要将多个索引块链接起来。想要找到i号索引块,必须先依此读入0~i-1号索引块,这就导致磁盘I/O次数过多,查找效率低下。
②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层索引块。还可以根据文件大小要求建立第三层、第四层索引块。采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。
缺点:即使是很小的文件,访问一个数据块依然需要K+1次读磁盘操作。
③混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表),还包含两级间接索引(指向两层索引表)
优点:对于一个小文件来说,访问一个数据块所需的读磁盘次数更少。
超重要考点!!!!
①要会根据多层索引,混合索引的结构计算出文件的最大长度(各级索引表最大不能超过一个块);
②要能自己分析访问某个数据块所需要的读磁盘次数(FCB中会存有指向顶级索引块的指针,因此可以根据FCB读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。
另外,要注意题目条件----顶级索引块是否已调入内存)