【操作系统】文件系统(二):文件系统的管理及性能

·  阅读 403

技术是开源的,知识是共享的。

本篇主要介绍文件系统的调度算法及性能优化,关于文件系统的结构请参考上一篇【操作系统】文件系统(一):文件的存储介质及结构

1 文件操作的实现

1.1 创建文件和打开文件

创建文件:建立系统与文件的联系,实际是建立文件的FCB。

在目录中为新文件建立一个目录项,根据提供的参数及需要填写相关内容。
分配必要的存储空间

打开文件:根据文件名在文件目录中检索,并将该文件的目录项读入内存,建立相应的数据结构并返回文件描述符/文件句柄
创建、打开文件流程如下图所示:
在这里插入图片描述

1.2 指针定位

系统为每个进程打开的每个文件维护一个读写指针,即相对于文件开头的偏移地址

读写指针指向每个文件读写的开始位置,在每次读写完成后,读写指针按照读写的数据量自动后移相应数值。

1.3 读文件

1、根据打开文件时返回的文件描述符(file descriptor),找到相应的文件控制块;
2、将文件的逻辑块号转换为物理块号;
3、申请缓冲区;
4、启动磁盘I/O操作,把磁盘中的信息读入缓冲区,再送到指定的内存区;
5、返回执行第3/4步直至读出所需数量的数据。

2 文件系统的管理

2.1 文件系统的可靠性

可靠性:抵御和预防各种物理性破坏和人为性破坏的能力。

2.2 文件系统的一致性

1 问题的产生
磁盘块–>内存–>写回磁盘块,若在写回之前,系统崩溃,则文件系统出现不一致的情况。
**文件系统的不一致主要是指元数据的不一致,包括系统的卷信息、空闲的磁盘块信息、文件目录信息、分配给文件的块信息。**至于说Word文件在使用过程中由于系统崩溃没有保存导致数据丢失,这就不在文件系统的一致性讨论范畴。
2 磁盘块的一致性检查
这里以Unix系统为例,OS保存了两张表,每块对应一个表中的计数器,初值为0。
表一:记录了每块在文件中出现的次数;
表二:记录了每块在空闲块表中出现的次数。

块号0123456
表一:使用中的块1101012
表二:空闲块0000200

如上表所示,正常情况应该是:同一块号,在使用块中为1,在空闲块中就应该为0,反之在使用块中为0则在空闲块中就应该为1。但是表中块号为2、4、6的就是异常。下面依次就行说明。
块号2:该块在使用块和空闲块表中都不存在,丢失了,解决方案是在空闲块表中把该块的值标记为1。
块号4:磁盘在空闲块表中出现了两次,解决方案是将2修改为1。
块号6:磁盘块在两个文件当中都出现了,此时只能在空闲的磁盘块中找一个空闲的磁盘块,将两个文件中的其中之一的内容拷贝到该块中,另一个文件就用原来的磁盘块。

2.3 文件系统的写入策略

1 通写(write-through)
内存中的修改立即写到磁盘,性能较差,如FAT文件系统
2 延迟写(lazy-write)
利用回写(write back)缓存的方法实现
3 可恢复写(transaction log)
利用事务日志来实现文件系统的写入,既考虑了安全性又考虑了性能,如NTFS

3 文件系统的安全性

3.1 文件保护机制

用于提供安全性、特定的操作系统机制,对拥有权限的用户,应该让其进行相应操作,否则应禁止。

3.2 文件的访问控制

主动控制:访问控制表

每个文件一个
记录用户ID和访问权限
用户可以是一组用户
文件可以是一组文件

能力表(权限表)

每个用户一个
记录文件名及访问权限
用户可以是一组用户
文件可以是一组文件

3.3Unix的文件访问控制

采用二级存取控制:
第一级:对访问者的识别
对用户分类:文件主(owner)、文件主的同组用户(group)、其他用户(other)
第二级:对操作权限的识别
对操作分类:读操作(r)、写操作(w)、执行操作(x)、不能执行任何操作(-)

例如:rwx rwx rw-,表示对文件主可读可写可执行,对同组用户可读可写可执行,对其他用户可读可写不可执行。
chmod 731 file:将file的权限修改为对文件主可读可写可执行,对同组用户可读可写,对其他用户可读。

读操作对应数字1,写操作对应2,可执行对应数字4(7=1+2+4)

4 提高文件系统的性能

磁盘服务相对于内存读取速度差异巨大,成为系统性能的主要瓶颈之一。所以有必要对文件系统的性能进行优化提高。

4.1 块高速缓存(Block Cache)

1 概念
又称文件缓存、磁盘高速缓存、缓冲区高速缓存。是在内存中为磁盘块设置的一个缓冲区,保存了磁盘中某些块的副本

检查所有的读请求,看所需块是否在块高速缓存中
如果在,则可直接进行读操作;否则先将数据读入块高速缓存,再拷贝到所需的地方
由于访问的局部性原理,当一数据块被读入块高速缓存以满足一个I/O请求时,很可能将来还会再次访问到这一数据块

2 实现
是通过哈希表组织,若是块高速缓存已满则需要通过LRU算法进行置换,当块中的数据二笔修改时,为保证数据一致性,需要写回磁盘(包括即时写和延迟回写两种方式)。

4.2 提前读取

根据程序执行的局部性原理,每次访问磁盘时,多读入一些磁盘块。这样就节省了寻道时间等消耗。

4.3 合理分配磁盘空间

分配磁盘块时,把有可能顺序存取的块放在一起,尽量分配在同一柱面上,从而减少磁盘臂的移动次数和距离。

4.4 磁盘调度

4.4.1 相关概念

当有多个访盘请求等待时,采用一定的策略,对这些请求的服务顺序调整安排,降低平均磁盘服务时间,达到公平、高效。

公平:一个I/O请求在有限的时间内满足
高效:减少设备机械运动带来的时间开销

一次访盘时间=寻道时间+旋转延迟时间+传输时间

4.4.2 磁盘调度算法

假设有这样一个场景,磁盘访问序列是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 旋转调度算法
根据延迟时间来决定执行次序。有三种情况,如下表所示:

情况解决方案
若干等待访问者请求访问同一磁头上的不同扇区让先到达读写磁头位置下的扇区进行传送操作
若干等待访问者请求访问不同磁头上的不同扇区让先到达读写磁头位置下的扇区进行传送操作
若干等待访问者请求访问不同磁头上的相同扇区任选一个读写磁头进行传送操作,剩下的磁头在下一次扇区到达读写磁头位置时操作

4.5 RAID技术

独立磁盘冗余阵列(Redundant Arrays of Independent Disks),目标在于提高可靠性和性能。
1 基本思想
通过把多个磁盘组织在一起,作为一个逻辑卷提供磁盘跨越功能
通过把数据分成多个数据块,并行写入/读出多个磁盘,以提高数据传输率(数据分条stripe)
通过镜像或校验操作,提供容错能力(冗余)
2 RAID 0-条带化
数据分布在阵列的所有磁盘上,有数据请求时同时对多个磁盘并行操作,无冗余(即无差错控制),性能最佳。如下图所示:
在这里插入图片描述
3 RAID 1-镜像
所有数据同时存在于两块磁盘的相同位置,可最大限度的保证数据安全性及可恢复性。如下图所示:
在这里插入图片描述
4 RAID 4 交错块奇偶校验
以数据块为单位,另外还有一块盘专门存放奇偶校验信息,如下图所示:
在这里插入图片描述

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改