文件系统管理和优化
磁盘空间管理
文件通常存放在磁盘上,所以磁盘空间的管理是系统设计者需要考虑的一个主要问题
存储n个字节的我呢见可以有两种策略:分配n个字节的连续磁盘空间,或者把文件分成很多连续的块
在存储器管理中,单纯段式和分页也要进行同样的权衡
块尺寸
一旦决定把文件按固定大小的块来存储,就会有一个问题:块的大小应该是多少?
按照磁盘组织方式,扇区、磁道和柱面明显都可以作为分配单位。页式系统中,页面大小也是主要选项之一。
- 块很大,比如以柱面为分配单位,这时每个文件,甚至是1个字节的文件,都要占用整个一个柱面。磁盘空间利用率低
- 块很小,则每读一块都有寻道和旋转时间,数据传输速率低
读取磁盘块的时间由以下三个因素决定:
- 寻道时间
- 旋转延迟
- 数据传送时间
磁盘驱动器的结构
http://linux.vbird.org/linux_basic/0105computers.php#pc_hd
由於磁碟盤是圓的,並且透過機器手臂去讀寫資料,磁碟盤要轉動才能夠讓機器手臂讀寫。因此,通常資料寫入當然就是以圓圈轉圈的方式讀寫囉!所以,當初設計就是在類似磁碟盤同心圓上面切出一個一個的小區塊,這些小區塊整合成一個圓形,讓機器手臂上的讀寫頭去存取。這個小區塊就是磁碟的最小物理儲存單位,稱之為磁區 (sector),那同一個同心圓的磁區組合成的圓就是所謂的磁軌(track)。由於磁碟裡面可能會有多個磁碟盤,因此在所有磁碟盤上面的同一個磁軌可以組合成所謂的磁柱 (cylinder)。
我們知道同心圓外圈的圓比較大,佔用的面積比內圈多啊!所以,為了善用這些空間,因此外圍的圓會具有更多的磁區!就如同圖 0.2.5 的示意一般。此外,當磁碟盤轉一圈時,外圈的磁區數量比較多,因此如果資料寫入在外圈,轉一圈能夠讀寫的資料量當然比內圈還要多!因此通常資料的讀寫會由外圈開始往內寫的喔!這是預設值啊!
另外,原本硬碟的磁區都是設計成 512byte 的容量,但因為近期以來硬碟的容量越來越大,為了減少資料量的拆解,所以新的高容量硬碟已經有 4Kbyte 的磁區設計!購買的時候也需要注意一下。也因為這個磁區的設計不同了,因此在磁碟的分割方面,目前有舊式的 MSDOS 相容模式,以及較新的 GPT 模式喔!在較新的 GPT 模式下,磁碟的分割通常使用磁區號碼來設計,跟過去舊的 MSDOS 是透過磁柱號碼來分割的情況不同喔!
实线(左边刻度)给出一个磁盘的数据速率
虚线(右边刻度)给出磁盘空间效率
- 所有文件都是2KB
块大小于磁盘数据率的关系
设磁盘每道有1MB,旋转时间是8.33毫秒,平均寻道时间是5毫秒,若块大小是X字节,则数据传输率是多少?
解:读取一块所需时间为:
数据率为:
X=512的数据率是:
X=1K,数据率是:
空闲块的记录
一旦选定了块的大小,下一个问题就是如何记录空闲块
广泛采用的是两种方法:
- 第一种方法采用磁盘块链表。每个块中包含尽有可能多的空闲磁盘块号
- 另一种空闲磁盘空间管理的方法是采用位映像。n个块的磁盘需要n位位映像。在位映像中,空闲块用1表示,分配块用0表示(或者反之)
a. 用链表保存空闲列表
b. 位映像
磁盘配额(Disk Quotas)
为了防止人们贪心占有太多的磁盘空间,多用户操作系统,像UNIX ,常常提供一种强行的磁盘配额机制。
其思想是系统管理员分给每个用户拥有文件和块的最大数量,操作系统确保每个用户不超过分给他们的配额。
当用户打开文件时,系统找到文件属性和磁盘地址,并把它们送人内存中的打开文件表。
其中一个属性告诉文件所有者是谁。任何该文件大小的增长都记到所有者的配额上。
在配额表中记录每个用户的配额
文件系统备份
即使有再好的处理坏块的策略,经常地备份文 件也是很重要的。
毕竟,在一些关键的数据块损坏之后,自动切换到备用块,无异于亡羊补牢。
备份软盘上的文件系统很简单,只需把整个磁 盘复制到一张空软盘上。
物理转储(physical dump):转储所有的磁盘块
逻辑转储(logical dump):只转储自某个时间以来被修改的文件和目录
被转储的文件系统,方框表示目录,圆圈表示文件。灰色的项表示上次转出后被修改过。每个目录和文件都使用其i-节点号标记
算法:
- Step1:所有的目录和已修改的文件相应的I节点号在位图中被标记,如下图a
- Step2:其下没有包含被修改的子冃录和文件的目录其I节点标记被删除,如下图b
- Step3:扫描位图,转储所存被标记的目录
- Step4:扫描位图,转储所有被标记的文件
逻辑转储使用的位映像
文件系统的一致性
影响文件系统可靠性的另一个问题是文件系统的一致性。
很多文件系统读取磁盘块,进行修改后,再写回磁盘。
如果在修改过的磁盘块全部写回之前,系统崩溃,则文件系统有可能会处于不一致状态。
如果未被写回的块是i-节点块、目录块或者包含空闲表的磁盘块时,这个问题尤为严重。
系统启动时运行一个实用程序检查一致性,包括块一致性检查和文件一致性检查。
块一致性检查
检查程序构造两张表,每个表为每个块设 立一个计数器(初始化为0)。第一张表中计 数器跟踪块在文件屮的出现次数;第二张表中计数器跟踪块在空闲链表中出现次数。
检查程序读取全部的I节点,建立相应文件 所使用的全部块的块号表。每读到一个块号, 第1张表中该块对应计数器增1;检查程序检查 链表(或位图),查找全部未使用的块,每找 到一个,第二张表中该块对应计数器增1。
文件系统一致:每个块要么在第一个计数器中为 1,要么在第二个计数器中为 1
文件系统不一致:
- 两个计数器值都为0——丢失块
- 第一个计数器值超过1——分配空闲块,将文件中内容写入空闲块
- 第二个计数器值超过1——重建空闲表
- 两个计数器中值都等于1——把块从空闲表中删除
文件系统状态
- 一致的
- 缺少的块
- 在空闲列表中复制块
- 复制数据块
文件一致性检查
方法:
使用一张计数器链表,以I节点号索引,每个文件 一个计数器。检查程序从根目录开始,沿目录树搜索, 遇到一个文件,则相应汁数器加1 (符号链接不计)。搜索完毕,表中每个计数器表示此文件被多少目录所包含,并把此值与实际I节点中的链接数比较(文件创建时,链接数等于1)
不以致
- 实际链接数 > 计数器
- 实际链接数 < 计数器
文件系统性能
对磁盘的存取比对内存的存取要慢。
读一个内存字可能花10纳秒。从硬盘读可能以10 MB/sec进行,每32位的字要慢 40倍,不过,还必须加上 5-10毫秒的寻道时间,并且等待扇区旋转到磁头下。
如果只需要一个字,内存存取要比磁盘存取快上 100万倍。
由于存取时间的这种区别,许多文件系统设计了各种优化方法来改进性能。
缓存
用于减少磁盘访问的最通常的技术就是块缓存(block cache)或者缓冲区缓存(buffer cache)。
Cache的发音为“Cash”,源自于法语的 cacher, 意即隐藏。
在这里的上下文中, Cache是块的一个集合,逻辑上属于磁盘,不过由于性能的原因保存在内存中。
高速缓存的管理:对于读操作,检查要读的块是否在高速缓存中,如果在,直接进行读操作不需访问磁盘;如果不在则首先将该块从磁盘读入缓存,再拷贝给用户。
缓存中的块置换:如果缓存已满,要调入新块,则必须把某一块调出缓存。分页系统中的页面置换算法也适用于缓存。
缓存的组织:为提高查找速度,建立一个哈希表,根据(设备号+磁盘地址)为哈希值索引,具有相同哈希值的块链接在一起。如下图:
缓冲区的cache结构
提前读块策略
第二种改进文件系统性能的技术就是试图在其需要前将块读入Cache中,以提高命中率。特别的,许多文件是顺序读取的。
当请求文件系统在文件中产生块 k时,它完成该请求,不过,当它完成时,它顺便检查Cache看块k+ 1是否在那里。
如果不在,它设定读取块k + 1, 这样当需要它时,它已经在Cache中了。至少它将在途中了。
减少磁盘臂移动
另一种增强文件系统性能的方法是通过把可能被顺序访问的块相互临近地放置,尽可能放在相同的柱面上,这样就可以减少磁盘臂的移动。
当写入输出文件时,文件系统必须每次定位一块。
- 如果空闲块记录在位映像中,而且整个位映像在主存中,那么就很容易选择一个与前一块尽可能接近的空闲块。
- 如果使用空闲链表,其部份是在磁盘上,要定位接近的块就比较困难了。
文件系统实例
ISO 9660文件系统
最经常被采用的 CD-ROM文件系统的标准是1988年发布的国际标准ISO 9660。
事实上,目前市场上的每个CD-ROM都兼容该标准,某些可能具有下面将提到的扩展。
该标准的目标之一就是所有 CD-ROM可以在每台计算机上读出来,与其使用的字节次序以及操作系统无关。
因此,在该文件系统上加入了某些限制,使得可以在最弱的操作系统上(例如 MS-DOS)使用。
CD-ROM
CD-ROM又件系统为一个国际标准(ISO 9660)。它共有三层。
Level 1使用8.3的文件名。文件名只可能包含大写字母、 数字和下划线。目录最多可以深达8层,但是目录命名 不能包含扩充名。Level 1需耍所有文件是连续存储的, 这对于只能写一次的媒介不是问题。MS-DOS、Apple 计算机、UNIX计算机或者儿乎所有其他的计算机都可 以读任何遵循IS 9660 level 1的CD-ROM。
level 2允许长达32个字符的名字
level 3允许非连续的文件。The Rock Ridge扩展允许非 常长的名字、UID、GID和符号链接,但是不遵循level 1的CD-ROM+能在所有计算机上读出
ISO 9660文件系统的目录项
MS-DOS文件系统
第一印象认为, MS-DOS就是一个更大、更好的 CP/M。
它只能在 Intel平台上运行,不支持多道程序,而且只能以 PC的实模式运行(起初是其唯一的模式)。
其外壳有更多特性以及更多的系统调用,但是,其基本的操作系统仍旧是载入程序、操作键盘和屏幕以及管理文件系统。
MS-DOS文件系统
不同块尺寸的最大分区大小
- 空格表示禁止的组合
UNIX V7文件系统
该文件系统是以根目录为起始的树的形式,加上附加的连接,形成了一个有向无环图。文件名字长达14个字符,可以包含任何除/以外的ASCII字符以及NUL。NUL的数字值为0。
UNIX目录项包含该目录中每个文件的一个项。由于UNIX使用i-节点,因此每个项都非常简单。
目录项只包含两个域:文件名(14个字节)以及该文件的i-节点号(2个字节)。这些参数限制了每个文件系统的文件数目为64K。
UNIX V7的目录项
UNIX的i节点
查找/usr/ast/mbox的步骤
小结
从外部观察,文件系统是文件和目录的集合,加上其上的操作。
文件可以被读和写,目录可以被创建和 销毁,而且文件可以从一个目录移到另 一个目录。
大部分现代文件系统都支持层次目录系 统,这种系统的冃录可能包含子冃录, 而且可能无限地子目录下去。
从内部观察,文件系统看起来就区别很大了。文件系统的设计者必须考虑如何分配存储器,以及系统如何记录哪一块 用于哪个文件。
其可能的办法包括:连续文件、链表、 文件分配表以及I-节点。不同的系统有不 同的目录结构。
属性可以保存在目录中,也可以保存在 其他地方(例如,i-节点中)。
磁盘空间的管理可以使用链表或者位映像。
通过增加转储以及使用程序修复坏的文 件系统,可以增强文件系统的可靠性。
文件系统的性能非常,有多种方法可以提高其性能,包括:caching、提前读取以及将文件块相互临近地放置。
日志结构的文件系统也可以通过在大的单元中写入来改进性能。
文件系统的例子包括ISO 9660、MS-DOS、 以及UNIX等。
它们在很多方而都有区別,包括其记录文件块的方式、目录结构以及空闲磁盘空间的管理。