技术是开源的,知识是共享的。
本篇主要介绍文件系统的调度算法及性能优化,关于文件系统的结构请参考上一篇【操作系统】文件系统(一):文件的存储介质及结构
创建文件:建立系统与文件的联系,实际是建立文件的FCB。
在目录中为新文件建立一个目录项,根据提供的参数及需要填写相关内容。
分配必要的存储空间
打开文件:根据文件名在文件目录中检索,并将该文件的目录项读入内存,建立相应的数据结构并返回文件描述符/文件句柄。
创建、打开文件流程如下图所示:
系统为每个进程打开的每个文件维护一个读写指针,即相对于文件开头的偏移地址。
读写指针指向每个文件读写的开始位置,在每次读写完成后,读写指针按照读写的数据量自动后移相应数值。
1、根据打开文件时返回的文件描述符(file descriptor),找到相应的文件控制块;
2、将文件的逻辑块号转换为物理块号;
3、申请缓冲区;
4、启动磁盘I/O操作,把磁盘中的信息读入缓冲区,再送到指定的内存区;
5、返回执行第3/4步直至读出所需数量的数据。
可靠性:抵御和预防各种物理性破坏和人为性破坏的能力。
1 问题的产生
磁盘块–>内存–>写回磁盘块,若在写回之前,系统崩溃,则文件系统出现不一致的情况。
**文件系统的不一致主要是指元数据的不一致,包括系统的卷信息、空闲的磁盘块信息、文件目录信息、分配给文件的块信息。**至于说Word文件在使用过程中由于系统崩溃没有保存导致数据丢失,这就不在文件系统的一致性讨论范畴。
2 磁盘块的一致性检查
这里以Unix系统为例,OS保存了两张表,每块对应一个表中的计数器,初值为0。
表一:记录了每块在文件中出现的次数;
表二:记录了每块在空闲块表中出现的次数。
块号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
表一:使用中的块 | 1 | 1 | 0 | 1 | 0 | 1 | 2 |
表二:空闲块 | 0 | 0 | 0 | 0 | 2 | 0 | 0 |
如上表所示,正常情况应该是:同一块号,在使用块中为1,在空闲块中就应该为0,反之在使用块中为0则在空闲块中就应该为1。但是表中块号为2、4、6的就是异常。下面依次就行说明。
块号2:该块在使用块和空闲块表中都不存在,丢失了,解决方案是在空闲块表中把该块的值标记为1。
块号4:磁盘在空闲块表中出现了两次,解决方案是将2修改为1。
块号6:磁盘块在两个文件当中都出现了,此时只能在空闲的磁盘块中找一个空闲的磁盘块,将两个文件中的其中之一的内容拷贝到该块中,另一个文件就用原来的磁盘块。
1 通写(write-through)
内存中的修改立即写到磁盘,性能较差,如FAT文件系统
2 延迟写(lazy-write)
利用回写(write back)缓存的方法实现
3 可恢复写(transaction log)
利用事务日志来实现文件系统的写入,既考虑了安全性又考虑了性能,如NTFS
用于提供安全性、特定的操作系统机制,对拥有权限的用户,应该让其进行相应操作,否则应禁止。
主动控制:访问控制表
每个文件一个
记录用户ID和访问权限
用户可以是一组用户
文件可以是一组文件
能力表(权限表)
每个用户一个
记录文件名及访问权限
用户可以是一组用户
文件可以是一组文件
采用二级存取控制:
第一级:对访问者的识别
对用户分类:文件主(owner)、文件主的同组用户(group)、其他用户(other)
第二级:对操作权限的识别
对操作分类:读操作(r)、写操作(w)、执行操作(x)、不能执行任何操作(-)
例如:rwx rwx rw-,表示对文件主可读可写可执行,对同组用户可读可写可执行,对其他用户可读可写不可执行。
chmod 731 file:将file的权限修改为对文件主可读可写可执行,对同组用户可读可写,对其他用户可读。
读操作对应数字1,写操作对应2,可执行对应数字4(7=1+2+4)
磁盘服务相对于内存读取速度差异巨大,成为系统性能的主要瓶颈之一。所以有必要对文件系统的性能进行优化提高。
1 概念
又称文件缓存、磁盘高速缓存、缓冲区高速缓存。是在内存中为磁盘块设置的一个缓冲区,保存了磁盘中某些块的副本。
检查所有的读请求,看所需块是否在块高速缓存中
如果在,则可直接进行读操作;否则先将数据读入块高速缓存,再拷贝到所需的地方
由于访问的局部性原理,当一数据块被读入块高速缓存以满足一个I/O请求时,很可能将来还会再次访问到这一数据块
2 实现
是通过哈希表组织,若是块高速缓存已满则需要通过LRU算法进行置换,当块中的数据二笔修改时,为保证数据一致性,需要写回磁盘(包括即时写和延迟回写两种方式)。
根据程序执行的局部性原理,每次访问磁盘时,多读入一些磁盘块。这样就节省了寻道时间等消耗。
分配磁盘块时,把有可能顺序存取的块放在一起,尽量分配在同一柱面上,从而减少磁盘臂的移动次数和距离。
当有多个访盘请求等待时,采用一定的策略,对这些请求的服务顺序调整安排,降低平均磁盘服务时间,达到公平、高效。
公平:一个I/O请求在有限的时间内满足
高效:减少设备机械运动带来的时间开销
一次访盘时间=寻道时间+旋转延迟时间+传输时间
假设有这样一个场景,磁盘访问序列是98,183,37,122,14,124,65,67,读写头起始位置是53,研究一下各种算法的效率。
1 先来先服务
按访问请求到达的先后次序服务。
上述场景的效率是:总移动640磁道
2 最短寻道时间优先(Shortest Seek Time First)
优先选择距离当前磁头最近的访问请求进行服务,缺点是容易造成某些访问请求长期等待得不到服务。
上述场景的效率是:总移动236磁道
3 扫描算法SCAN(电梯算法)
当设备无访问请求时,磁头不动;当有访问请求时,磁头按照一个方向移动,在移动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务。
上述场景的效率是:总移动218磁道
4 单向扫描调度算法C-SCAN
总是从0号柱面开始扫描,到达最后一个柱面后立即带动读写磁头快速返回到0号柱面,返回时不为任何的等待访问者服务,返回后可再次进行扫描。该算法的特点在于减少了新请求的最大延迟。
5 N-step-SCAN策略
把磁盘请求队列分成长度为N的子队列,每一次用SCAN处理一个子队列,在处理某一个队列时,新请求添加到其他子队列中。
6 FSCAN策略
使用两个子队列,扫描开始时,所有请求都在一个队列中,而另一个队列为空,扫描过程中所有新到的请求都放入另一个队列中,新请求需要等所有老请求处理完之后才能被服务。
7 旋转调度算法
根据延迟时间来决定执行次序。有三种情况,如下表所示:
情况 | 解决方案 |
---|---|
若干等待访问者请求访问同一磁头上的不同扇区 | 让先到达读写磁头位置下的扇区进行传送操作 |
若干等待访问者请求访问不同磁头上的不同扇区 | 让先到达读写磁头位置下的扇区进行传送操作 |
若干等待访问者请求访问不同磁头上的相同扇区 | 任选一个读写磁头进行传送操作,剩下的磁头在下一次扇区到达读写磁头位置时操作 |
独立磁盘冗余阵列(Redundant Arrays of Independent Disks),目标在于提高可靠性和性能。
1 基本思想
通过把多个磁盘组织在一起,作为一个逻辑卷提供磁盘跨越功能
通过把数据分成多个数据块,并行写入/读出多个磁盘,以提高数据传输率(数据分条stripe)
通过镜像或校验操作,提供容错能力(冗余)
2 RAID 0-条带化
数据分布在阵列的所有磁盘上,有数据请求时同时对多个磁盘并行操作,无冗余(即无差错控制),性能最佳。如下图所示:
3 RAID 1-镜像
所有数据同时存在于两块磁盘的相同位置,可最大限度的保证数据安全性及可恢复性。如下图所示:
4 RAID 4 交错块奇偶校验
以数据块为单位,另外还有一块盘专门存放奇偶校验信息,如下图所示: