本次笔记内容:
12.12 打开文件的数据结构
12.13 文件的分配
12.14 空闲空间列表
12.15 多磁盘管理-RAID
12.16 磁盘调度
打开文件描述:
文件被打开后,放入打开文件表中。
打开文件表:
如上图,可能两个进程同时打开一个文件,用文件打开表可以管理。
比如,如果要写文件,文件增大,空间如何分配?
大多数文件很小:
一些文件非常大:
分配方式:
指标:
如上图,文件头指针会指定起始块位置和文件长度。
产生问题:如果A文件在B文件前,A增长了,则B需要后移。
对于CD-ROM来说,是一种好的分配方法。因其高效性、只读性。
如上图,链式存储很灵活,如果增大,则只需将尾指针后移。
但是问题是,访问必须是串行访问(假设访问链中第二个数据块,必须先找到第一个)。并且,不可靠,如果丢失一个,链就断了。
如上图,专门设置一个索引数据块,一般放在文件头里。文件大小变化时,大量的修改只需要在索引块中。
但是,如果文件本身很小,索引数据块冗余严重;如果文件本身很大,一个索引数据块不够装。
如上图,可以采用链式(线性扩展,不可靠、不推荐)或多级索引块(分层方式,推荐)对大文件数据块索引信息进行保存。
如上图,在早期Linux里,采用多级索引块方式。小文件直接放在一级索引块里,保证小文件不需要经过多级索引就可以访问。
空闲磁盘块,如何被文件系统组织?如何表示?
如上图,用位图代表空闲数据库。1代表磁盘扇区已经被使用。但是要定期扫描空间块,因为如果掉电,磁盘是否空闲的信息可能对不上。
如上图中,对于160GB的磁盘,一个数据库40MB,则内存中需要5MB的位图信息。
如上图,如果刚刚将bit[i]=1时突然掉电,则尽管误认为数据库i被写入了,但是没有丢失信息。如果先写信息,再将bit[i]赋为1,则有可能丢失信息。
如上图,有些文件系统使用链式列表或分组列表表示空闲块。
前置知识:
在RAID提出之前,磁盘经常坏。有没有可能通过并行、冗余(多个磁盘存一个内容)提高可靠性?
因此提高RAID(冗余磁盘阵列)。
RAID从RAID0发展到了RAID5、6…数字指磁盘阵列组织方式。
RAID分为软RAID和硬RAID。软RAID是在磁盘之上进行抽象,硬RAID是在芯片层面做处理,操作系统所见到的是一个被映射出的大磁盘。
如上图,RAID0中,把一个数据分成三部分存在三个硬盘上,进行并行读取,时间变为三分之一。
如上图,RAID1中,硬盘起到一个镜像作用。两个磁盘写一个内容。
如上图,RIAD4中,既能提升效率又能保证可靠性。Disk1-4中,某一个出现故障,可以通过Parity Disk进行奇偶校验。
但是,由此,Parity Disk的开销会比其他Disk大很多。
如上图,RAID5中,每个Disk都具有校验能力。则每个Disk开销差不多。RAID5是RAID4的升级。但是RAID4、RAID5只能纠正一个磁盘出错的情况(两个及以上不行)。
如上图,RAID0和RAID1可以分层或嵌套,来获得更多特性。RAID相关的技术还有很多。
在OS层面,重新组织I/O顺序,来有效减少访问的开销。
如上图,机械运动相比电路很慢,因此优化机械动作,很重要。
如上图,对于读或者写的表示,寻道时间+旋转延迟=磁盘访问时间。
如上图是访问时间的计算公式。
如上图,这种方法随机性很大,磁盘指针来回地条,移动距离很长,开销很大。
如上图,动态情况下规划,下次访问时与现在磁头最近的位置。
但是,原处的区域可能只需得不到服务,出现“饥饿”现象。
如上图,移到一头,再回来。
如上图,限制磁臂只能向一个方向移动。只能从高到低访问。
到达最后一个请求处反转,而非最高点。
如上图,还有许多算法,比如N-Step-SCAN。
如上图,FSCAN是对N-step-SCAN的简化,将N=2。
对于真实系统来讲,可能需要更复杂算法,或不需要设计算法,因为: