操作系统 文件系统实现
文件系统实现
1.文件系统结构
分层设计的文件系统
应用程序:利用系统调用的请求文件操作 open() read()
逻辑文件系统:管理元数据,管理目录结构。元数据包括文件系统的所有结构数据,而不包括内容数据。逻辑文件系统通过给定的文件符号名,来管理目录结构,通过文件控制块(FCB),来维护文件结构。
文件组织模块:指导文件的逻辑块和物理块。将逻辑块地址转换为物理块地址。
基本文件系统:只需要向合适的设备驱动程序发送一般命令就可以对磁盘上的物理块进行读写。每个块由数值磁盘地址决定(驱动器,柱面号,磁道,扇区)
I/O控制 :由设备驱动程序和中断处理程序组成。
采用分层的结构实现文件系统吗,最大限度减少重复的代码。相同的I/O控制可以被多个的文件系统使用。每个文件系统有自己的逻辑文件系统和文件组织模块。

2.文件系统实现
实现文件系统需要多个磁盘结构和内存结构。
在磁盘上文件系统可能包含如下信息:
- 如何启动所存储的操作系统
- 总的块数
- 空闲块的数目和位置
- 目录结构
- 各个具体的文件
卷控制引导块: 从该卷引导操作系统所需要的信息。如果该磁盘没有操作系统,那么这块为空。通常为第一块,也被称为引导块,引导扇区。
卷控制块:包括卷的详细信息。分区的块数、块的大小、空闲块的数量和指针、空闲FCB的数量和指针。UFS称之为超级快。
目录结构:UFS中包含文件名和相关的索引节点号
FCB:每个文件一个索引节点 ,文件权限,大小,数据块位置等
虚拟文件系统 VFS
操作系统同时支持多个文件系统。支持无缝的把文件在文件系统类型之间移动。
文件系统的实现主要包括三个层次
- 第一层为文件系统接口,包括open()、read() 、write()、close()
- 第二层 虚拟文件系统层 VFS有两个目的:
- 1.VFS通过定义一个清晰的vfs接口,将文件系统的通用操作与具体实现分开.多个vfs的实现可以共存在一条主机上,允许访问装在本地的多个类型的文件
- 2.VFS提供了网络上唯一标识一个文件的机制,
- 第三层实现文件系统类型或远程文件系统协议
虚拟文件系统是物理系统和文件系统之间的一个接口层,他对每一个物理文件系统的所有细节进行抽象,并为这些不同的文件系统提供了一个统一的系统调用接口。
VFS
- 并不是一种文件系统,只是系统核心的一个管理模块
- 他只存在云内存中,并不存在于任何外存空间
- VFS在系统启动时建立,在系统关闭时消亡

3.目录实现
可以使用线性表实现目录结构,或者hash表和各种树结构。
4.分配方法
一个磁盘可以存储多个文件,如何为这些文件分配空间以便有效地使用磁盘空间和快速访问文件。常用的磁盘空间分配方法由:来纳许、连接和索引。
几个评价标准:
- 有效利用外存空间(是否需要额外的磁盘空间、外碎片)
- 提高对文件的访问速度(随机存取)
- 保证可靠性(是否容易导致文件的损坏)
- 易于文件拓展
- 实现难度
4.1连续分配
文件连续分配:用第一块磁盘块地址和连续块地数量来定义。

- 可以实现随即存取,存取速度快,效率高
- 连续分配支持顺序访问和直接访问
- 适用于文件内容不进行变动的情况
- NTFS :尽量地把一个文件放到一些连续的磁盘块中
- 会产生外碎片,浪费磁盘空间 (将小空间合并成一个大的连续的空间)
- 在创建文件时就要知道文件的大小,为他分配连续的空间。在一组空闲的孔中寻找一个大小合适的孔的策略,之前也提到过(best fit 、first fit 、worst fit 、next fit)
- 文件不能扩展(或不便于扩展),提前预测文件大小
连续分配–将逻辑地址映射到物理地址
1、假设每个磁盘块的大小为512字节
2、给定要访问的逻辑地址LA(文件指针,或偏移量,要访问的文件中的位置)
LA/512 = Q 商 R 余数
3、FCB中给出了文件的第一个磁盘块号 start address
Block address = start address + Q
块内偏移 = R
扩展
在分配一块连续的空间,空间不够时,另一块被称为扩展的连续空间会添加到原来的分配中。文件块的位置就成了开始地址块、块数加上1个指向下一个拓展的指针。
4.2 链接分配
采用链接分配,每个文件是磁盘块的链表,磁盘块分布在磁盘的任何地方
文件目录包含,文件第一块和最后一块的指针。

- 简单-只需要起始地址
- 没有外碎片
- 不需要在创建文件时声明文件的大小,利于文件增长
- 缺点是需要额外的空间存储指针
- 不能随机访问
- 可靠性低 。文件通过指针链接,指针分布在整个磁盘上。操作系统或者磁盘硬件的bug会使得指针错误,访问空闲块或其他文件。
一个不彻底的解决方案,双向链表,或者每个块中存上文件名和相对块数。
如果文件指针需要4B,那么整个文件中有0.78%被占用。可以将多个块组成,文件按簇分配,比如4块一簇,但代价是增加了内碎片。簇可以改善磁盘访问时间。
链接分配–地址映射
1、假设每个磁盘块的大小是512字节,其中1字节作为指针地址空间,其余511字节存数据
LA/511 = Q商 R余数
FCB 给出第一块的块号 链接的第Q块是要访问的文件块
块内偏移为 R
文件分配表 FAT
链接分配的变种,应用于MS-DOS、windows、OS/2
实际上是将链接分配,linked域独立出来,构成一个FAT标,专门勇于实践磁盘块之间的链接,又称显示链接,支持随机存取

- 为磁盘的每一个磁盘块建立一个表项,称为FAT表。
- 对于每一个文件,其FCB存储该文件的第一个磁盘块的块号
- 每个FAT表项存储该文件的下一个磁盘块的块号
- 每个文件的最后一个磁盘块的FAT表项中存储一个特殊的结尾符。
- FAT中通常称一个磁盘块为一个cluster簇
- FAT会导致大量的磁头寻道时间,除非FAT表被缓存
FAT 12 16 32 指的是FAT有多少2次幂的目录项, 2 12 、 2 16 、 2 32 2^{12}、2^{16}、2^{32} 212、216、232个目录项,目录项少,磁盘大那么每个磁盘块就大,内碎片多。

FAT 地址映射
欲访问文件的偏移量LA(逻辑地址),每个磁盘512B
LA/512 = Q R
FCB:给出文件的第一个块号,在FAT表中间址Q次
块内偏移 R
4.3索引分配
如果不用FAT,链接分配无法直接访问。
索引分配,将所有指针放在一起,通过索引块解决问题。
每个文件都有其索引块,这是磁盘块地址的数组,索引块的第i个条目只想文件的第i个块。目录条目包括索引块的地址。读取第 i 块,就要通过索引块的第 i 个条目来查找。

- 支持随机访问
- 创建文件时,无需声明文件的大小
- 没有外碎片
- 索引块具有开销,索引块的开销比链接分配指针开销大。
索引分配 – 地址映射
LA/ 512 = Q R
FCB中给出索引块的块好,其内容是索引表
Q 索引表的第Q项
R 块内偏移
索引块的管理方案
并且由于每个文件件都有索引块,索引块应该多大,太小的索引块不能为大文件提供足够多的指针。
链接方案(linked scheme)
为了处理大文件,将多个索引块链起来。
多层索引
链接的变种,第一层索引块指向一组第二层索引块,第二层索引块只想更多文件块。


组合方案
在UFS中,将索引块的15个指针存在inode中。
头12个指针指向直接块,直接块存放数据。
第一个间接块指针,为一级间接块的地址。
第二个间接块指针,为二级间接块的地址。
第三个间接块指针,为三级间接块的地址。

上图显示了一个UNIX的inode
5.空闲空间的管理
为了记录空闲磁盘空间,采用多用方式。
- 位向量
- 链表
- 组
- 计数
评价标准:
- 是否需要额外空间,需要多少
- 是否容易找到连续块
- 效率:空间分配和回收的效率
不管使用那种文件分配方式,操作系统总是尽量为文件分配连续的磁盘块
5.1位向量
位图、位向量 。每一块用1位表示,一块为空闲为1,已分配为0.
定位第一个空闲块;
(值为0的字数)×(一个字的位数)+(第一个值为1的偏移)
- 除非整个位向量内保存到内存中,否则位向量的效率不高。
- 查找第一个空闲块和n个连续空闲块,相对容易。
- 实现 位图存储在磁盘上,检索时装入主存,位图在磁盘上的位置装入超级块中。
5.2链表
- 将爱嗯所有空闲块用链表链表连起来
- 将第一个空闲块的头指针保存在磁盘的特殊位置(如超级块中),同时也缓存到内存中
- 不能高效的获取连续块
- 没有磁盘空间的浪费

5.3组
对于链式分配的改进方案
- 专门设置一些磁盘块临时存储多个空闲磁盘块的块号
- 磁盘块号保存在同一个磁盘块的中的空闲块构成一组
- 承租链接法
UNIX使用的成组链接法
- 将n个空闲块分成一组,每中的第一块或最后一块保存下一组的空闲块地址,以此类推
- 第一组的块地址保存在一个特殊块中
- 不占用额外的存储空间
- 当前课分配的物理块号存放在空闲盘块栈,因此绝大部分的分配和回收工作在主存中运行,与位图相比占用内存少
- 不容易找到连续空间
- 与标准链接的方法比,容易找到大量的空闲块。

空闲磁盘块的回收
- 空闲盘块号栈在超级块中
- 假定空闲盘块号栈向下生长的
- 当最左边的空闲块未达到规定的数目,新回收的空闲块的块号入栈
- 当最左边的空闲磁盘块数大袋规定次数后,再回收一块空闲块,先将空闲块号栈的空闲块号信息复制到该块中,同时将空闲盘快好战清空;然后作为新的一组空闲块的第一块,并将该块号入栈。
空闲盘块的分配
- 依次分配空闲盘块号栈栈顶的空闲块
- 当要分配空闲盘块号栈栈底所示的块号时,先将该块中所保存的空闲此盘块号信息写入栈,再将该空闲块分配出去。
回收与分配,均在空闲盘块号栈中进行(内存中)
5.4 计数
建立空闲表项,每个条目包括第一个空闲块的块号和连续空闲块的数量。
容易找到连续空间
需要额外的空间

6.效率与性能
效率
效率主要取决于磁盘分配算法和目录管理算法。
FCB中项越多,访问存储效率越低,但是方便。有的系统记录了最近访问日期,每当读文件是,目录结构的一个域就要进行更新,将对应快写入磁盘,修改后,再写回。
Ext文件系统中,FCB预选创建,即使占有一定的空闲空间,但是分配效率高。如果FCB都之中存放磁盘起始的位置,可能与文件距离较远,增大磁头的寻道时间。如果将FCB预先散列分配在整个磁盘空间中,可以是文件数据与对应的索引节点存放在一起,降低寻道时间。该方案要求尽量将文件内容放在联讯村春的磁盘块中,不适用于磁盘块不连续的文件。
性能
原则:访问文件时,尽量减少磁盘的访问时间。
disk cahce:磁盘缓存 。主存中的一块,用于频繁访问的一块
足够大,可以将磁道储存起来。寻道后,就可以将整个磁道,从磁头所处的扇区开始,读到磁盘缓存中。
- 延迟释放(free-behind)
- 提前预读(read-ahead)
文件大部分是顺序访问,因此已经读入的磁盘块可能还要访问,并且继续访问其后的几个磁盘块,因此采用延迟释放和提前预读。
让磁盘块,在内存中,尽量驻留更长时间
7.恢复
- 一致性检查:将目录结构数据和磁盘数据块比肩,纠正不一致。
- 备份
- 恢复

被折叠的 条评论
为什么被折叠?



