文件管理
文件的属性
- 文件名:一个目录下不能有重名的文件
- 标识符:操作系统用于区分文件的唯一性
- 类型:如txt、xls等
- 位置:文件的存放位置
- 文件大小
- 上次修改时间
- 文件所有者信息
- 保护信息:对文件进行保护的访问控制信息,例如权限信息
文件如何被放到外存:
操作系统以块(物理地址从xxx到yyy之间)为单位为文件分配存储空间,因此即使一个文件大小小于一个磁盘块的大小,它还是会占据一个完整的磁盘块。同样文件的逻辑地址也要转化为外存的物理地址
文件的逻辑结构
- 无结构文件(流式文件,比如txt文件)
- 有结构文件:由一组相似的记录组成,又称“记录式文件”。分为顺序文件、索引文件、索引顺序文件
文件目录
文件控制块:即文件目录项,简称FCB,FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等)、存取权限、使用信息等,FCB的有序集合称为文件目录。
目录结构:
- 单级目录结构:一个系统中只有一张目录表,不允许文件重名
- 两级目录结构:分为主文件目录和用户文件目录。主文件目录负责记录用户信息,用户目录负责记录每个用户对应的文件。允许不同用户创建的文件可以重名
- 多级文件目录:也叫树形文件目录。从根目录出发的路径称为绝对路径,从当前目录出发的路径称为相对路径。树形结构目录不方便文件共享
- 无环图目录结构:在树形目录的基础上,增加了一些指向同一节点的有向边,使整个目录成为一个有向无环图(可以理解为同一文件可以在不同文件目录下存在),并且在这个基础上给文件设立共享计数器,可以查看被共享目录的数目,删除文件时,会将该计数器减1,只有其减为0时才会被彻底删除。
索引节点:这是对文件控制块的改进,因为检索文件只用文件名即可,而FCB包含了很多其他的信息。因此引入了索引节点,索引节点中包含了除了文件名之外的其他信息,因此目录表就变为文件名+索引节点指针
的结构。当根据文件名找到目录项时,才将索引节点调入内存,存在外存的索引节点称为磁盘索引节点
,存在内存的索引节点称为内存索引节点
这种结构比文件控制块更优秀的原因是:一个磁盘块可以存的文件项要更多,而每次磁盘IO只能读入一块,所以磁盘块的减少可以减少IO的时间。
文件的物理结构
文件的逻辑地址也被分为一个个的文件块,于是文件的逻辑地址可以表示为(逻辑块号+块内地址)的形式
文件数据怎样被存在外存
-
连续分配:在逻辑上相邻的块在物理上也是相邻的,因此文件目录结构如下,可以计算得出
起始块号+逻辑块号=物理块号
。优点就是可以直接访问某个块号,访问速度快;缺点就是不方便文件拓展,会产生磁盘碎片
-
链接分配:可以为文件分配离散的磁盘块。分为隐式链接、显示链接。
隐式链接:目录中记载了存放的起始块号和结束块号,除了最后一个磁盘块,每个磁盘块都会保存指向下一个盘块的指针,优点是方便拓展文件,但是仍然只支持顺序查找。
显示链接:将链接各个物理块的指针放到一张文件分配表(FAT)里,原理即静态链表。优点是方便拓展文件,但缺点是文件分配表需要占用一定存储空间。
- 索引分配:允许文件离散的分布在各个磁盘中,每个文件会对应一张索引表,索引表记录了该文件各个逻辑块对应的物理块。索引表存放的磁盘称为索引块,文件数据存放的磁盘块称为数据块。因此文件目录中保存了每个文件的索引块号的物理地址,找到索引块号后根据索引表找每个逻辑块号的物理块号。优点是支持随机访问,也容易实现文件的拓展;但是缺点是索引表需要占用一定的时间。
当一个物理块装不下一个索引表时有以下三种解决方案- 链接方案:分配多个索引块,每个索引块存储指向下一个索引块的指针。缺点是如果要访问的索引块是最后一个时,需要过多的查找
- 多层索引:类似于多级页表,设置多级索引表。优点是读磁盘次数少,采用K层索引结构只需要K+1次就能访问到一个数据块
- 混合索引:在顶级索引中既包含直接索引、一级索引还有二级索引
文件存储空间管理
存储空间的划分:将物理磁盘划分为一个个的文件卷(或叫逻辑卷、物理卷),比如windows系统的C盘、D盘。每个文件卷又被分为了目录区和文件区。
- 目录区:主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
- 文件区:存放文件数据
存储空间管理
-
空闲表法:为一个文件分配连续的存储空间,适用于连续分配方式,回收空间时要注意空间的合并
-
空闲链表法:将空闲区域链接起来,分为空闲盘块法和空闲盘区法(连续的空闲盘块为盘区,并且盘区的第一个盘块记录了盘区的长度和下一盘区的指针),回收空间时也要注意空闲空间的合并
-
位示图法:用位示图表示磁盘块,若已使用则为1,未使用则为0
-
成组链接法:UNIX采用的策略,是对空闲盘区法的改进,使得不相邻的块也可以归为一组。文件卷的目录区专门用一个磁盘作为超级块,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的超级块数据一致。
如图所示,1号块为超级块,指向后面的空闲块,其中2、3、4为一组,5、6为一组、7、8、9、10为一组.将超级块读入内存后,其结构如图所示
可见每组的第一个块都保存了改组的空闲块数量以及指向下一个组的指针。在内存分配时,会先从第一个超级块开始分配,首先将4、3号分配并且每分配一个超级块中的N就减1,如果该分组仍然不够的话,会将第二个超级块替换到内存中,然后继续分配。
文件的基本操作
操作系统向上提供的功能:创建文件(create系统调用)、删除文件(delete系统调用)、读文件(read系统调用)、写文件(write系统调用)、打开文件(open系统调用)、关闭文件(close系统调用)
- 创建文件:首先申请文件所需的空间,然后创建该文件对应的目录项
- 删除文件:删除对应的目录项,释放对应的空间
- 打开文件:根据文件路径找到目录表,在目录表中找到对应的目录项,并检查该用户是否有该权限。接着将目录项复制到内存中的打开文件表中,并将打开文件表的索引号给用户
- 关闭文件:奖进程的打开文件表对应表项删除,回收对应的内存空间,系统文件打开表计数器减1,如果count减为0,则删除对应的表项
- 读文件:根据打开文件表的索引号去读取
- 写文件:根据打开文件表的索引号去写
文件共享
多个用户共享一个文件,意味着系统中只有一份文件数据,并且某个用户修改了文件数据,其他用户也看得到文件数据的变化。
-
基于索引结点的共享方式(硬链接):即不同文件的目录项指向同一个索引节点,每有一个文件项
-
基于符号链的共享方式(软链接):只是保存了目标文件的路径,比如快捷方式。
文件保护
- 口令保护:为文件设置一个口令,访问时必须提供口令,一般正确的口令放在文件的FCB中,因此不太安全
- 加密保护:使用某个密码对文件加密,访问文件时需要提供密码。只有密码正确才能得到原有的内容,如果密码错误则得到乱码
- 访问控制:在每个文件的FCB中增加一个访问控制列表,该列表中记录了各个用户可以对该文件执行哪些操作
文件系统的层次结构
磁盘的结构
磁盘调度算法
一次读写操作所需时间:
- 寻道时间:启动磁头臂+移动磁头臂
- 延迟时间:磁头定位到目标扇区所需时间
- 传输时间:向磁盘读数据、写数据的时间
磁盘调度算法:
- 先来先服务算法:根据请求的先后顺序依次移动到各个磁道上
- 最短寻找时间有限:保证寻道时间最短,缺点是有可能产生饥饿现象
- 扫描算法:只有磁头移动到最内侧时才能往外移,只有移到最内测时才能往内移
- LOOK调度算法:扫描算法的改进,如果在磁头移动方向上没有别的请求,那么会立即回头
- 循环扫描算法:针对扫描算法对各个磁道响应频率不平均产生,规定磁头朝着某方向移动,移动到边缘后立即回到起点
- C-LOOK算法:对循环扫描算法的改进,如果移动过程中后续没有请求,那么磁头可以立即回头,回头到第一个有请求的位置,而不用回到开头
减少磁盘延迟时间的方法:
- 交替编号:在处理当前扇区时磁头已经转入下一扇区,那么磁头来不及立刻处理下一扇区的数据,因此,必须下一圈才能读取相邻的扇区,因此可以采用给扇区交替编号的方式可以实现处理完1号扇区还能来得及处理2号扇区。
- 错位命名:让相邻的盘面编号错位,原理同交替编号相似