操作系统学习笔记(四)-文件系统

四、文件系统

1 文件系统的实现

(1)文件系统布局

磁盘的0号扇区称为主引导记录MBR,用来引导计算机。在MBR的结尾是分区表,该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。一个可能的文件系统布局。
在这里插入图片描述

(2)文件的实现

文件存储实现的关键问题是记录各个文件分别用到哪些磁盘块

连续分配

  优点

  • 实现简单,记录每个文件用到的磁盘块只需两个数据即可记录,第一块的磁盘地址和文件的块数;
  • 读操作性能好
    缺点
  • 随机读取性能低
  • 碎片问题

链表分配

为每个文件构造磁盘块链表,每个块的第一个字作为指向下一块的指针,块的其他部分存放数据

  • 解决了碎片问题
  • 随机访问性能提高
  • 每个磁盘块存储数据的字节数不再是2的整数次幂
    在这里插入图片描述

采用内存中的表进行链表分配

i节点

http://www.ruanyifeng.com/blog/2011/12/inode.html
目录文件记载了(文件名 ,inode)对,访问文件名时会访问到inode,inode与文件名的链接使用硬链接
inode中的内容

  • 文件数据block的位置
  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode

(3)目录的实现

目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息
加快大型目录的查找速度可以使用散列表,根据文件名进行散列
只需知道inode的方法即可

(4)共享文件

软链接与硬链接

https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
在这里插入图片描述
软链接更像windows的快捷方式,其中存储了被链接文件的绝对路径
硬链接则像是文件的别名

(5)日志文件系统

    基本想法是保存一个用于记录系统下一步将要做什么的日志,这样当系统在完成它们即将完成的任务前崩溃时,重新启动后,可以通过查看日志,获取崩溃前计划完成的任务,并完成他们
  对于要进行的文件操作,日志文件系统首先写一个日志项,列出要完成的动作。然后日志项被写入磁盘,只有当日志项已经被写入,对文件的操作才可以进行。当所有的操作成功完成后,擦除日志项。如果系统这时崩溃,系统恢复后,文件系统可以通过检查日志来查看是不是有未完成的操作。如果有,可以重新运行未完成的操作,直到对文件的操作完成。

  • 为了让日志文件系统工作,被写入日志的操作必须是幂等
  • 为了增加可靠性,一个文件系统可以引入数据库的原子事务的概念

(6)虚拟文件系统

所有和文件相关的系统调用都通过POSIX接口指向虚拟文件系统VFS。当一个文件系统注册时,需要提供一个包含VFS所需要的函数地址的列表。VFS通过这些函数去操作一个文件系统。

2 文件系统管理和优化

(1) 磁盘空间管理

  • 块大小
  • 记录空闲块 磁盘块链表 位图
  • 磁盘配额 对于多用户系统 软限制和硬限制

(2) 文件系统备份

要关注的问题:

  • 只备份特定目录及其下的全部文件,而不是备份整个文件系统,比如没必要备份/dev目录
  • 使用增量转储
  • 是否进行数据压缩

物理转储

从磁盘的第0块开始,将全部磁盘块按序输出到磁带上,直到最后一块复制完毕
优点 简单快速
缺点

  • 无法跳过特定目录
  • 无法增量转储
  • 不能满足恢复个人文件的请求

逻辑转储

从一个或几个指定的目录开始,递归地转储其自给定基准日期后有所更改的全部文件和目录

(3)文件系统的一致性

UNIX使用fsck,Windows使用scandisk进行一致性检查。
一致性检查分为块的一致性和文件的一致性检查。

块的一致性检查

在检查块的一致性时,程序构造两张表,每张表中为每个块设立一个计数器,都初始化为0。第一个表中的计数器跟踪该块在文件中的出现次数,第二个表中的计数器跟踪该块在空闲表或空闲位图中的出现次数。如果文件系统一致,则每一块或者再第一个计数器中为1,或者在第二个计数器中为1。

文件的一致性检查

检查目录系统,每个文件对应于一个计数器,程序从根目录开始,递归搜索每个目录,对于目录中的每个文件,将文件计数器加1。由于存在硬链接,一个文件可能出现在多个目录中,而对于符号链接不计数。程序完成后,与存储在文件i节点中的链接数比较是否一致。

(4)文件系统性能

高速缓存

高速缓存指的是一系列的块,它们在逻辑上属于磁盘,但实际上基于性能的考虑被放在内存中。检查全部读请求,如果需要读取的块在高速缓存中命中,则读取;否则从磁盘调入高速缓存。高速缓存的置换算法与页面置换算法相似,比如老化算法。

块提前读

在需要用到块之前,提前将其读入高速缓存,从而提高命中率,对于顺序读取特别有用。

减少磁盘臂运动

把有可能顺序访问的块放在一起,最好在同一柱面上,从而减少磁盘臂的移动次数。

(5)磁盘碎片整理

3 文件系统实例-UNIX v7

UNIX中根目录的i节点存放在磁盘上的固定位置,剩余的路径搜索依靠文件名和i节点号。通过i节点号来定位i节点是很方便的,因为每个i节点在磁盘上都有固定的位置。

猜你喜欢

转载自blog.csdn.net/u010069259/article/details/89843435