现代操作系统之文件系统(下)

来源:互联网 发布:手机数据分析公交 编辑:程序博客网 时间:2024/05/20 17:41

文件系统的管理和优化

磁盘空间管理

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

性能和空间利用率是矛盾的。

跟踪空闲块有两种常用的方法——第一种方法是采用磁盘块链表,那个块中包含尽可能多的空闲磁盘号。通常情况下,次啊用空闲块存放空闲表,这样存储器基本上是空的。

另一种方法是采取位图,n个块的磁盘需要n位位图。

如果空闲块倾向于成为一个长的连续分割的块,则空心啊列表可以改成记录分块而不是单个的块。
另一方面,如果磁盘产生很严重的碎片,记录分块会比记录单独的块效率更低。


在空闲表方法中,只需要在内存中保存一个指针块。当文件创建时,所需的块从指针块中读出。现有的指针块用完时,从磁盘中读入新的指针跨。删除时则将指针写入内存的指针块中。当块满时,就把它写入磁盘。
当内存中指针块快慢的时候,就写入磁盘。这里的思路是保持磁盘上大多数之真快为满的状态(减少磁盘使用),但是在内存中保留一个半满的指针块。这样他可以及处理文件的创建同时又处理文件的删除莋,而不会为空闲表进行磁盘IO。

(自)也就是说,内存中最多有一个指针块,指针主要是在空闲块中的。


在处理磁盘配额时,有一种方案通过两张表实现。
当用户打开一个文件时,系统找到文件属性和磁盘地址,并把他们送入内存中的打开文件表。
第二张表包含每个用户当前打开文件的配额记录,即使其他人打开该文件一样。该表的内容是从被打开文件的所有者磁盘配额文件中提u去出来的。当所有文件关闭时,该记录被协会配额文件。

当在打开文件表中建立一新表项时(打开一文件),会产生一个指向所有者配额记录的指针,以便很容易找到不同的限制。可以超过软限制,但不可超过硬限制,硬限制会引发报错。

当用户试图登陆,系统喝茶配额文件,查看该用户文件数目或磁盘块数目是否超过软限制,若超过,则警告计数减一i,若计数为0,则不再允许用固话登陆。要想再次登陆,就必须和系统管理员协商,

该方法由一种性质,只要该用户在退出系统前消除超过部分,就可以在一次终端期间超过其软限制。

文件系统备份

合理的做法是只备份特定目录及其下全部文件,而不是备份整个文件系统(有些文件无需拷贝,有些包括会出问题)

更好一点的做法自最近一次转储以来更改过的文件。

对挥动文件系统做备份是很难的。因为在转出过程中添加,删除烦修改文件和目录可能会导致文件系统的不一致性。

人们修改了转储算法,记下文件系统的瞬时状态,即复制关键的数据结构(类似于store)


转储硬盘到磁带上有两种方案:物理转储和逻辑转你出。物理转储是从磁盘的第0块开始,将全部的磁盘块按序输出到磁带上,知道最后一块复制完毕。此程序很简单,可以保证万无一失,这是其它任何实用程序所不能比的。

P168

如果磁盘控制器将所有坏块重新映射,并对操作系统隐藏的话,物理转储工作还是能顺利进行的。

物理存储的有点是简单,极快。缺点是不能跳过选定目录,也无法增量转储,还不能满足回复个人文件的请求。

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

该算法还转储通向修改过的文件或目录的路径上的所有目录(包括未修改目录),原因有二——一是为了将这些转储的文件和目录恢复到另一套计算机新文件系统中,这样吗转出程序和回复程序可以进行文件系统之间的整体转移;第二个原因是可以对单个文件进行增量回复。

逻辑转出算法要维持一个一i节点号为索引的位图,每个i节点包含了几位。首先检查所有的目录项,对每一个修改过的文件,在位图中标记其i节点。算法还标记并递归检查每一个目录了第二阶段再次递归遍历目录树 ,斌去掉目录树中任何不包含被修改过的文件或目录的目录上的标记。第三阶段一节点号为序,扫描这些i节点并转储所有标记的目录,为了进行回复,每个目录都用目录属性作为前缀 最后,被标记的文件也被转储,同样由其文件属性作为前缀。

从转储磁带上回复文件系统很容易办到。首先要在磁盘上创建一个空的文件系统,然后回复最近一次的完整转储,由于磁带上最先出现目录嘛所以首先回复目录,给出文件系统的框架;然后回复文件本身。在完成转储之后的是增量转储,重复这一过程,以此类推。

UNIX文件实际上包含很多空洞(打开文件,写几个字节,进行便宜,在写入字节,偏移部分泵式文件的一部分,不应该被转储和恢复)


文件系统的一致性

影响文件系统可靠性的另一个问题是文件系统的一致性,很多文件系统读取磁盘块,进行修改后,再写回磁盘。如果在修改过的磁盘块全部写回之前系统崩溃,则文件系统可能处于一个不一致的状态,如果一些未被写回的块是i节点,目录块或是包含有空闲表的块,问题 会格外严重。

为了解决文件系统的不一致问题,很多计算机都带有一个使用该程序以检查文件系统的一致性。

一致性检查分两种,块的一致性检查和文件的一致性检查。程序构建两张表,第一张是计数器跟踪该块在文件中的出现次数,第二个表是计数器跟踪该块在空闲表中国年出现次数。

如果文件系统一致,则每一块或在第一张表中为1,或在第二张表中为1.
若某磁盘块两张表中都没出现,则文件系统检验程序把他们驾到空闲表中即可。
若在空闲表中出现多次,则重建空闲表即可。
最糟的情况是一个块出现在多个文件,那么一个文件删除该块会导致该块同时处于使用和空闲两种状态。所删除两个文件,则会在空闲表中出现两次。

文件系统检验程序的方法是:现分配一空闲块,把在空闲表出现多次的块复制到空闲块,然后把它插入其中一个文件之中。这些文件内容未改变(虽然内容几乎肯定不对),但至少保持来文件系统但一致性。这一错误应该报告,由用户检查文件受损情况。

由于存在硬连接,一个文件可能出现在多个目录。但是符号连接是不计数但。

如果文件系统计数完毕之后结果与i节点中计数一致,则无误。若i节点数不同于统计数,则将i节点置为统计数

在很多系统中文件但删除仅仅是在对应目录huoi节点上设置某一位,表示文件被删除,并没有把磁盘块返回空闲表中,知道确实需要时才这样做。


文件系统性能

高速缓存

最常用对减少磁盘访问次数计数是块高速缓存或者缓冲区高速缓存。高速缓存指的是一系列块,他们在逻辑上属于磁盘,但实际基于性能对考虑被保存在内存中。

高速缓存的一个常用方法是检查全部读请求,若高速缓存存在,则直接返回,若不存在,则首先把它读到高速婚车,在复制到需要的地方。

高速缓存提速的常用方法是将设备和磁盘地址进行散列操作。
高速缓存的好处在对于高速缓存的引用不很频繁,所以按精确的LRU顺序在链表中国年记录全部的块是可行的。


我们通常希望数据块不要在高速缓存中保留太久再存入,这样可能会导致信息丢失。

系统可以采用两种方法来解决这个问题:
第一种,在UNIX系统中国年有一个系统调用sync,它强制性地把全部修改过的块立刻写回磁盘。
第二种,windows只要数据被写进高速缓存,就把每个修改的块写进磁盘。这种方法称为通写高速缓存,这种方法需要更多的磁盘IO,

在UNIX系统中,若不调用sync就移动(软)磁盘,往往会导致数据丢失,在被毁坏的文件系统中也经常如此。而在通写高速缓存中,就不会出现这种情况。

有些操作系统将高速缓存和页缓存集成。这种方式在支持内存映射文件的时候很吸引人。同一个缓存可以同时用来存储文件块的和页。

块提前读

第二个明显提高文件系统性能的计数是:在需要块之前,试图提前将其写入高速缓存,从而提高命中率。

快提前读策略只适合顺序读取的五年级。


减少磁盘臂运动

该方法是把有可能顺序读取的块放在一起,当然最好是在同一个柱面上,从而减少磁盘臂的移动次数。

这里用到一个小技巧,即不用块二用连续块簇来跟踪磁盘存储区。但在一个空闲系统上读取文件,寻道的次数可以减少与。

在使用i节点或任何类似i节点的系统中,另一个性能瓶颈是读取一个很短的文件也需要两次磁盘访问——一次是访问i节点,另一次是访问块。

一个简单的改进方法是在磁盘中部,在磁盘中部而不是开始出存放i节点。这样i节点和第一块直接的距离和寻道时间就减少为一半。另一种做法是:将磁盘分成多个柱面组,每个柱面组由自己的i' 节点,数据块和空闲表

磁盘碎片整理

有些文件不能被移动,包括页文件,休眠文件以及日志,因为移动这些文件所需的管理成本大于移动他们的价值。若他们恰好在分区的末端附近并且用户想减少分区大小。解决的唯一方法就是将他们删除,改变分区大小,然后重新建立


文件系统实例

CD-ROM文件系统

ISO 9960文件系统

CD-ROM是沿着一个连续的螺旋线来顺序存储信息(当然,跨越螺旋线查找也是可能的),每个逻辑块的有效部分是2048字节。

接下来的一块存放基本卷描述符,基本卷描述符包括来CD)ROM的一些今本信息。包括系统标识符,卷标识符等。

基本卷标识符海包含三个文件的名字,这三个文件分别用来存储概述,版权声明和文献信息。

此外还有一个补充卷描述符。

根目录和所有的其它目录包含可变数目的目录项,目录总的最后一个目录项由一位用于标记该目录项是目录中的最后一个。目录项长度本身是可变的。

因为目录项是长度可变的,所有,第一个域就说明这一项的长度。这样字节被定义为高位在左。

目录项可能包含由扩展舒徐,若使用该特性。


见书P175

原创粉丝点击