概念
文件是一组有意义的新信息/数据集合,操作系统提供的文件管理功能应该包括:定义文件属性、解决文件内部和文件之间的组织问题。
文件属性由文件名、标识符(文件在不同路径下可能有相同的文件名,但对操作系统来说每个文件都只有唯一的标识符)、文件类型、文件位置、文件大小、创建时间、上次修改时间、文件所有者信息和保护信息。
文件内部组织形式有无结构文件,如文本文件、流式文件;和有结构文件,如excel和数据库这种由记录和数据项构成的文件。
文件之间的组织形式一般通过根目录—目录—文件的结构组织,目录或者文件夹本身也是一种特殊的有结构文件。
文件管理向上提供的功能有:创建,读写,删除,打开和关闭。
向下提供存储的具体方法,将外存分成大小相等的块,采取连续或者离散加记录的方式分配,以及空闲磁盘块的管理。
以及其他功能,比如文件共享和文件保护等。
文件的逻辑结构
即用户看来文件内部数据的组织形式,具体分类如下:
无结构文件
由二进制或字符组成,如txt
和流式文件
有结构文件
又称记录式文件,每条记录有一个数据作为关键字,记录有分为定长和可变长记录;根据逻辑结构可以分为顺序文件和串结构,二者区别在于记录顺序与关键字是否有关,顺序是记录按关键字顺序进行排序,而串结构记录之间的顺序与关键字无关。
顺序文件是指记录一个接一个的顺序排列,可连续的顺序排列或形成链式,对用户来说感受一致,区别在于物理上是否相邻。
顺序的可变长记录无法随机存取,定长的可实现,但增删记录困难,链式可变长查找记录只能一个个向下,查询效率慢。
索引文件
解决可变长记录查找速度慢的问题,索引是定长记录的顺序文件,增删记录需要修改索引表用于比对信息,该结构适用于对及时性要求较高的场合。
索引顺序文件
文件多时索引表可能很大,降低了磁盘利用率,该结构将一组记录对应一个索引表项,先对记录进行分组再加索引,当记录多检索速度慢时可建立多级索引表。
文件目录
目录本身就是一种有结构文件,存储在文件控制块FCB中,FCB中包含文件的基本信息,其中最重要的就是文件名和文件存放的物理地址,操作系统由目录找到对应的物理地址,操作系统借助该文件实现搜索、创建文件、删除文件、显示目录和修改目录功能。
目录结构
单级目录结构
只建立一张目录表,不允许文件重名,无法实现多用户操作。
两级目结构
主文件目录MFD:记录用户名及相应用户文件目录存放的位置。
用户文件目录UFD:用户文件FCB。
允许不同用户文件充满,可以实现访问控制,但缺乏灵活性,用户无法对自己目录下的文件进行分类。
多级目录结构
用户用文件路径名标识文件,各级目录用/
隔开,不同目录下的文件可以重名。
根目录出发的是绝对路径,操作系统逐层找下一级,外存读入目录时找下一级目录的存放位置,根据局部性原理,用户也往往会访问同目录下的多个文件,每次都从根目录出发会增大系统查找开销,故设置当前目录作为相对路径,可以减少访存次数。
该结构分类方便,层次清晰,但不便于实现文件共享。
无环图目录结构
在多级目录基础上,增加一个用户指向节点的有向边,使整个目录成为一个有向无环图,方便多用户间的文件共享,操作系统为文件设置共享计数器,用户删除文件时减一并删除用户FCB,当计数器为0时才删除文件,一方的修改对双方均可见。
索引节点FCB的改进
用户在查找时只需要文件名即可,其他信息放入索引节点,可以减少目录表大小。
文件物理结构
文件的物理存储方式,对用户透明,由操作系统完成,实现逻辑和物理地址的对应转换。
磁盘也分块管理,大小与内存卡和页面大小相同,文件的逻辑地址也分为块,逻辑地址=逻辑块号+块内地址。
连续分配
每个文件在磁盘上占有一个连续的块,操作系统进行地址转换时要检查逻辑块号是否合法,目录中只需记录块号和块内地址。
该方法支持顺序访问和随机访问,磁盘顺序读,磁头移动距离短,速度更快;但不方便扩展,新增数据需要迁移,且空间利用率低,容易产生磁盘碎片。
链接分配
为文件分配离散的磁盘块,具体可分为隐式链接和显式链接:
隐式链接是只记录起始块号和结束块号,每个块保存指向下一个盘块的指针,支持顺序读取,不支持随机读取,指向下一个盘块的指针需要占用空间,方便扩展但不产生碎片。
显式链接是将用于链接文件各物理块的指针显式存放在一张表中,即文件分配表FAT。
一个磁盘仅设置一张FAT,开机时读入内存并常驻,逻辑地址到物理地址的转换不需要磁盘操作,只需读取FAT的记录找到对应FCB即可,可以顺序读取也可以随机读取,方便扩展,但文件分配表需要占用一定存储空间。
索引分配
FAT整个磁盘一张表,索引分配是将FAT进行离散分配,为每个文件建立一张索引表,记录文件逻辑块对应的物理块,目录中记录索引,找到索引表即可实现地址转换。
支持随机访问,方便扩展,一个磁盘块装不下索引表时又如何解决呢?
链接法,将多个索引块链接存放,不能随机访问,查找低效。
多层索引,类似多级页表,底层指向高层,各层索引表大小不能超过一个磁盘块,文件小时仍采用多级索引会增加访存开销。
混合索引,既包含直接地址索引直接指向数据块,又包含一级间接索引指向单层索引表,还包含两级索引,可以灵活根据文件大小取用。
文件存储空间管理
该部分实现存储空间的划分与初始化功能,即将物理磁盘划分为文件卷,文件卷又划分为目录区和文件区,管理方法如下:
空闲表法
由第一个空闲盘块号和块数组成,用于连续分配方式,分配时可用首次适应,最佳适应,最坏适应等方法,回收需注意表项的合并问题。
空闲链表法
将空闲盘块组成一条空闲链,连续空闲盘块组成一个空闲盘区,第一个盘块记录盘区长度及下一个盘区的指针。
操作系统保存链头链尾的指针,分配时修改链头链尾,适用于离散分配,可用首次适应,最佳适应算法找到大小合适的空闲盘区;没有连续空闲块时将不同盘区的盘块分配给一个文件,修改相应指针和盘区大小等数据,回收时合并空闲分区,离散连续都适用,为一个文件分配多个盘块的效率较高。
位示图法
用表对应盘块,由字号和位号组成,类似二维数组,数值0表示空闲,1表示已分配,数量次序为盘块号,b=ni+j,分配时顺序扫描,找数值为0的未分配盘块,计算出盘块号并分配,将数值置为1;回收时计算字号位号,对应数值设置为0,连续和离散分配都适用。
成组链接法
在unix中适用的适用于大型文件系统的管理方法,文件卷目录区中专门用一个磁盘块作为超级块,系统启动时中读入内存,时刻保持内外一致,超级块记录下一组空闲盘块数和空闲块号。
分配时若一个分组足够则将分组中的空闲块分配并修改分组,将下一分组的信息复制到超级块中。
回收时空闲盘块号加1,若空闲盘块已满则复制内容到新块中,修改超级块的内容,让回收的块成为第一个分组及超级块。
文件基本操作
创建文件,create
系统调用,需要的参数有所需的外存空间大小、文件存放路径和文件名,操作系统首先在外存中找到存储文件所需的空间,再找到对应目录文件创建目录项。
删除文件,delete
系统调用
打开文件,open
系统调用
关闭文件,close
系统调用
读文件,read
系统调用
写文件,write
系统调用
文件共享
实现多个用户共享一个文件,系统中只有一份数据,用户修改该文件时其他用户均可见。
基于索引结点的共享方式—硬链接
不同用户的目录项指向同一个索引结点,一个用户删除断链接,索引结点计数器减一。
符号链的共享方式—软链接
创建link共享文件,类似快捷方式,用户访问时由link文件查找目的文件的位置,源文件删除则软连接失效。
文件保护
口令保护
为文件设置口令,用户请求访问时需要提供口令,口令一般存在FCB或索引节点中,保存口令和验证口令的开销较小,但口令存放在系统内部不安全。
加密保护
适用密码加密文件,用户访问时先解密才能读取。该方法保密性强,不需要在系统中存储密码,但加解密有时间开销。
访问控制
每个文件的FCB或索引节点增加一个访问控制表ACL,用于记录各用户可对文件进行的操作,如读写,执行,添加,删除,列表清单功能,但当用户多时记录复杂也有空间开销。
精简的访问表,以组为单位标记用户可以对用户执行的操作,用户检查用户所属的分组,该方法实现灵活,可以实现复杂的文件保护功能。
总结
该章学习了操作系统对文件的管理方法,对用户来说文件有无结构和有结构两种形式,文件的逻辑结构有顺序和索引两种方法;文件存储的位置由目录表记录,为了实现用户对自己文件的灵活管理和多用户共享文件,目前适用的是无环图目录结构,即文件多级目录用下划线/
区分,不同用户与文件的关系逻辑上表现为一条边;操作系统对文件的物理存储有连续、链接和索引三种方法;空闲分区的管理有主要空闲表和位示图,是顺序存储空闲分区和用二位列表记录此磁盘块适用状态的方法。