您的位置:首页 > 其它

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

2016-07-13 00:47 267 查看

4.4 文件系统管理和优化

4.4.1 磁盘空间管理

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

块大小

通常需要在空间利用率和磁盘数据率之间提供一定平衡,通常用4KB。

记录空闲块。

磁盘块链表,每个块包含尽可能多的空闲磁盘块号。如果空闲区域连续的话可以考虑添加空闲块的数量。

位图,但是不常用,只有在磁盘接近满的情况下才比较划算。

还有一个问题需要考虑的是如果保存一个快满的指针块,可能会在一系列短期临时的增删操作中占用大量的磁盘空间,解决方案是存入已满的空闲块,取出半满的空闲块。

磁盘配额

为了防止用户过度占用,需要系统管理员为每个用户分配最大的块和文件的最大数量等。

4.4.2 文件系统备份

从意外的灾难中恢复

从错误的操作中恢复

不需要备份所有文件,通常只是部分目录的文件

对前一次备份的没有更改的文件不需要备份,增量转储的概念

是否需要压缩是一个慎重考虑的问题。压缩可以降低数据量,但是如果出错难以恢复。

对活动文件系统做备份需要考虑一致性

非技术性

两种方案:

物理转储

从磁盘第0块开始备份到最后一个块。

对于未使用的磁盘块无需备份

对于坏块的转储需要考虑

优点是快速简单,缺点是没办法跳过指定目录,无法增量转储,无法恢复个人文件的请求

逻辑转储

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

需要提醒的是,对于修改文件的所有父目录也都需要转储,原因是:

为了将转储文件和目录恢复到另一台计算机的新文件系统中,这样转储文件就可以在计算机之间进行整体转义

为了可以对单个文件进行增量恢复。

逻辑转储具体算法:

从根目录开始检查所有的目录项

遍历所有目录,并去掉目录树中任何不包括被修改过的文件或目录的目录上的标记

以节点号为序,扫描这些i节点并转储所有的标记的目录

被标记的文件也被转储,由其文件属性作为前缀。

恢复步骤:

恢复到最近的一次的完整转储

由前到后的进行增量转储

其他问题:

空闲块列表并不是文件,需要在转储完成后自行构建

对于连接应该恢复一次文件

对于很多文件包含的空洞,不需要用0去一一填充。

无论是哪个目录,特殊文件、命名管道及类似的文件不该转储。

4.4.3 文件系统的一致性

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

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

块的一致性

程序构造两张表,每张表为每个块设立一个记录器,都初始化为0。第一个表中的计数器跟踪该块在文件中的出现次数,第二个表中的计数器跟踪该块的空闲表中出现的次数。

通常来说分为4中情况:

两个表互补——一致性通过

空闲表的块少——块丢失,文件系统检验程序把它们加到空闲表中即可

空闲表的块多——重新建立空闲表

使用表的块多——需要包括用户,由用户检测文件受损情况。

目录检测

文件可能存在硬连接,遇到符号文件时不计数的。不会对目标文件的计数器加1。

如果i节点中的连接计数大于目录项格式,可以把连接计数设成正确值

另一种错误是文件系统标识该i节点为未使用,并释放其全部块,会使其中一个目录指向一未使用的i节点,而很可能其块马上就被分配给其他文件。解决办法同样是把i节点中的连接计数设为目录项的实际个数。

目录检测通常和块检测放在一起。

4.4.4 文件系统性能

高速缓存

块高速缓存(block cache)或者缓冲区高速缓存(buffer cache),逻辑上属于块,但是基于性能考虑储存在内存中。

查找块是否存在,常用方法是将设备和磁盘地址进行删了操作,然后在散列表中查找结果。

如果高速缓存已满需要调入新的块,因此需要把原先的一部分块写入到硬盘中,与分页的情况类似所有算法均可行,与分页相比,高速缓存的好处在于对高速缓存的引用不用很频繁,所有按精确的LRU顺序存储在链表中是可行的。

除了散列表中的冲突链之外,还有一个双向链表把所有的块安装使用的时间先后链接起来,近来使用最少的块在最前面,使用最多的表在队尾。这样可以维护一个准确的LRU链表。

如果一个关键块读进了高速缓存并做过修改,但是没有写回磁盘。这是系统崩溃会导致文件系统的不一致。如果把i节点放在LRU链尾,如果等他到达链首,并写入磁盘需要相当长的时间。

另一个问题是有些块会在短时间内引用两次。

基于以上的两个问题在设计LRU时,需要注意两点:

这一块是否不久后会再次使用?

这一块是否关系到文件系统的一致性?

基于以上的两个问题,可以将块分为i节点块、间接快、目录块、满数据块、部分数据块。

对于部分数据块属于正在写入的块需要放在链尾。

对于关系一致性的问题需要尽快写入磁盘,对于满数据块需要尽快写入磁盘。

通常来说系统调用会有一个sync调用,它强制性地把全部修改过的块立即写回磁盘。两次调用之间休眠30s。UNIX采用的方案。Windows是在每次块有变动就写回磁盘,称为通用高速缓存。这样会占用更多的IO但是不会导致工作内容丢失。

块提前读

在需要用到块之前,试图提取将其写入高速缓存,从而提高命中率。

通常系统会跟踪读取文件的方式,如果是顺序读取则进行预读,但是对于随机访问则会降低效率。

减少磁盘臂运动

把顺序存取的快放在一起,当然最好实在同一个柱面上,从而减少磁盘臂的移动次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息