读书笔记-现代操作系统-4文件系统-4.4文件系统管理和优化

4.4 文件系统管理和优化

4.4.1 磁盘空间管理

几乎所有的文件系统都是把文件分割成固定大小的块来储存的(各块之间不一定相邻)

  • 块大小
    通常需要在空间利用率和磁盘数据率之间提供一定平衡,通常用4KB。
  • 记录空闲块。
    1. 磁盘块链表,每个块包含尽可能多的空闲磁盘块号。如果空闲区域连续的话可以考虑添加空闲块的数量。
    2. 位图,但是不常用,只有在磁盘接近满的情况下才比较划算。
      还有一个问题需要考虑的是如果保存一个快满的指针块,可能会在一系列短期临时的增删操作中占用大量的磁盘空间,解决方案是存入已满的空闲块,取出半满的空闲块。
  • 磁盘配额
    为了防止用户过度占用,需要系统管理员为每个用户分配最大的块和文件的最大数量等。

4.4.2 文件系统备份

  1. 从意外的灾难中恢复
  2. 从错误的操作中恢复

    • 不需要备份所有文件,通常只是部分目录的文件
    • 对前一次备份的没有更改的文件不需要备份,增量转储的概念
    • 是否需要压缩是一个慎重考虑的问题。压缩可以降低数据量,但是如果出错难以恢复。
    • 对活动文件系统做备份需要考虑一致性
    • 非技术性

两种方案:

  • 物理转储
    从磁盘第0块开始备份到最后一个块。
    1. 对于未使用的磁盘块无需备份
    2. 对于坏块的转储需要考虑
      优点是快速简单,缺点是没办法跳过指定目录,无法增量转储,无法恢复个人文件的请求
  • 逻辑转储
    从一个或几个指定的目录开始,递归的转储其自给定基准日期后有更改的所有文件和目录。
    需要提醒的是,对于修改文件的所有父目录也都需要转储,原因是:
    1. 为了将转储文件和目录恢复到另一台计算机的新文件系统中,这样转储文件就可以在计算机之间进行整体转义
    2. 为了可以对单个文件进行增量恢复。
  • 逻辑转储具体算法:
    1. 从根目录开始检查所有的目录项
    2. 遍历所有目录,并去掉目录树中任何不包括被修改过的文件或目录的目录上的标记
    3. 以节点号为序,扫描这些i节点并转储所有的标记的目录
    4. 被标记的文件也被转储,由其文件属性作为前缀。
  • 恢复步骤:
    1. 恢复到最近的一次的完整转储
    2. 由前到后的进行增量转储
  • 其他问题:
    1. 空闲块列表并不是文件,需要在转储完成后自行构建
    2. 对于连接应该恢复一次文件
    3. 对于很多文件包含的空洞,不需要用0去一一填充。
    4. 无论是哪个目录,特殊文件、命名管道及类似的文件不该转储。

4.4.3 文件系统的一致性

所有文件系统检验程序可以独立地检验每个文件系统的(磁盘分区的一致性)

一致性检测分两种:块的一致性和文件的一致性

  • 块的一致性
    程序构造两张表,每张表为每个块设立一个记录器,都初始化为0。第一个表中的计数器跟踪该块在文件中的出现次数,第二个表中的计数器跟踪该块的空闲表中出现的次数。
    通常来说分为4中情况:

    1. 两个表互补——一致性通过
    2. 空闲表的块少——块丢失,文件系统检验程序把它们加到空闲表中即可
    3. 空闲表的块多——重新建立空闲表
    4. 使用表的块多——需要包括用户,由用户检测文件受损情况。
  • 目录检测
    文件可能存在硬连接,遇到符号文件时不计数的。不会对目标文件的计数器加1。
    如果i节点中的连接计数大于目录项格式,可以把连接计数设成正确值
    另一种错误是文件系统标识该i节点为未使用,并释放其全部块,会使其中一个目录指向一未使用的i节点,而很可能其块马上就被分配给其他文件。解决办法同样是把i节点中的连接计数设为目录项的实际个数。
    目录检测通常和块检测放在一起。

4.4.4 文件系统性能

  1. 高速缓存
    块高速缓存(block cache)或者缓冲区高速缓存(buffer cache),逻辑上属于块,但是基于性能考虑储存在内存中。
    查找块是否存在,常用方法是将设备和磁盘地址进行删了操作,然后在散列表中查找结果。
    如果高速缓存已满需要调入新的块,因此需要把原先的一部分块写入到硬盘中,与分页的情况类似所有算法均可行,与分页相比,高速缓存的好处在于对高速缓存的引用不用很频繁,所有按精确的LRU顺序存储在链表中是可行的。
    除了散列表中的冲突链之外,还有一个双向链表把所有的块安装使用的时间先后链接起来,近来使用最少的块在最前面,使用最多的表在队尾。这样可以维护一个准确的LRU链表。
    如果一个关键块读进了高速缓存并做过修改,但是没有写回磁盘。这是系统崩溃会导致文件系统的不一致。如果把i节点放在LRU链尾,如果等他到达链首,并写入磁盘需要相当长的时间。
    另一个问题是有些块会在短时间内引用两次。
    基于以上的两个问题在设计LRU时,需要注意两点:
    这一块是否不久后会再次使用?
    这一块是否关系到文件系统的一致性?
    基于以上的两个问题,可以将块分为i节点块、间接快、目录块、满数据块、部分数据块。
    对于部分数据块属于正在写入的块需要放在链尾。
    对于关系一致性的问题需要尽快写入磁盘,对于满数据块需要尽快写入磁盘。
    通常来说系统调用会有一个sync调用,它强制性地把全部修改过的块立即写回磁盘。两次调用之间休眠30s。UNIX采用的方案。Windows是在每次块有变动就写回磁盘,称为通用高速缓存。这样会占用更多的IO但是不会导致工作内容丢失。

  2. 块提前读
    在需要用到块之前,试图提取将其写入高速缓存,从而提高命中率。
    通常系统会跟踪读取文件的方式,如果是顺序读取则进行预读,但是对于随机访问则会降低效率。

  3. 减少磁盘臂运动
    把顺序存取的快放在一起,当然最好实在同一个柱面上,从而减少磁盘臂的移动次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值