点此链接可跳转到:操作系统笔记整理——目录索引页
参考书籍:《计算机操作系统》第四版 汤小丹等编著
外存的组织方式
外存的组织方式有
- 连续组织方式:为每个文件分配一片连续的磁盘空间,由此所形成的文件物理结构将是顺序式的文件结构
- 链接组织方式:可以为每个文件分配不连续的磁盘空间,通过链接指针将一个文件的所有盘块链接在一起,由此所形成的是链接式的文件结构
- 索引组织方式:索引式文件结构
连续组织方式
为每一个文件分配一片连续的磁盘块。例如,第一个盘块的地址为b,则第二个盘块的地址为b+1,第三个盘块的地址为b+2。通常它们都位于一条磁道上,在进行读/写时不必移动磁头,仅当访问到磁道的最后一个盘块后才需要移到下一条磁道。
这样所形成的文件结构称为顺序文件结构,此时的物理文件称为顺序文件。
文件目录项中只需要保存文件的起始块号和长度(连续的块数)。
连续组织方式会形成外部碎片。可以通过紧凑 (compact) 技术把外存空闲空间合并成连续的区域。但对外存空间的一次紧凑所花费的时间远比内存紧凑一次的时间多。
优点:
- 顺序访问容易
- 访问速度快,磁头移动距离少(换磁道时才移动)。
- 保证了逻辑文件中的记录顺序与存储器中文件占用盘块的顺序的一致性。 从逻辑地址映射到物理地址较简单。
缺点:
- 要求有连续的存储空间。
- 存在外部碎片
- 必须事先知道文件的长度。有时需要估计(预留空间问题)。
- 不能灵活地插入删除
链接组织方式
将文件装到多个离散的盘块中,通过每个盘块上的链接指针,将同属于一个文件的多个盘块链接成一个链表,由此所形成的的物理文件称为链接文件。
链接分配分为隐式链接和显式链接两种。
隐式链接
采用隐式链接分配方式时,在文件目录的每个目录项中,保存指向链接文件第一个盘块和最后一个盘块的指针。
缺点:
- 只适合于顺序访问,对随机访问极其低效。如果要访问文件所在的第 i 个盘块,则必须先读出文件的第一个盘块,· · · ,顺序地查找直至第 i 块(访问第 i 盘块,需要启动 i 次磁盘)。
- 可靠性差,任何一个指针出现问题,都会导致整个链的断开。
- 指针占存储空间。如果指针占用 4 个字节,对于盘块大小为 512 字节的磁盘,则每个盘块中只有 508 个字节可供用户使用。
显示链接
把用于链接的指针显式地存放在内存的一张表中,查找在内存中进行。
文件分配表 FAT (File Allocation Table)
- 文件分配表在整个逻辑磁盘分区仅设置一张。 表序号为整个磁盘的物理块号。
- 表项中存放链接指针,即下一个块号。
- 文件的首块号存入相应文件的 FCB 中。
特点:FAT 表在内存中,查找记录的过程是在内存中进行的,不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。
缺点:
- FAT表需占用较大的内存空间
FAT(File Allocation Table)技术
在FAT中引入了“卷”的概念,支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘就是一个卷(也称为分区),每个卷都是一个能被单独格式化和使用的逻辑单元,供文件系统分配空间时使用。
一个卷中包含了文件系统信息,一组文件以及空闲空间。每个卷都有专门区域存放自己的目录和FAT表,以及自己的逻辑驱动器字母。(通常对仅有一个硬盘的计算机,最多将其硬盘划分为"C:"、“D:”、“E:”、"F:"四个卷)。在现代OS中,一个物理磁盘可以划分成多个卷,一个卷也可以由多个物理磁盘组成。
FAT 文件系统共三个版本:FAT12,FAT16 和 FAT32。
簇的概念
若干个连续的扇区 (sector) 或盘块称为一簇,簇的大小一般是 2n 个扇区或盘块。比如,一个簇可包含4个盘块,在进行盘块分配时,是以簇为单位进行的。在链接文件中的每个元素也是以簇为单位的。FAT文件系统把簇作为一个虚拟扇区。文件的存储空间通常由多个簇组成。
如何选择簇的大小
两个极端:大到能容纳整个文件,小到一个扇区。
如果簇较大:可提高 I/O 访问性能,减少访问时间,但簇内碎片浪费问题 较严重。
如果簇较小:簇内的碎片浪费较小,但可能存在簇编号空间不够的问题(如 FAT12、16)。
FAT12文件系统
每个 FAT 表的表项数占 12 位,即 FAT 表最多允许4096(212)个表项。
如果采用盘块作为基本分配单位,每个盘块(扇区)的大小一般是 512 字节,则每个磁盘分区的容量为 2MB(4096×512 B)。一个物理磁盘最多支持 4 个逻辑磁盘分区,所以可管理的磁盘最大容量为 8MB。
如果采用簇(cluster)作为基本分配单位,当一个簇包含 8 个扇区时, 磁盘容量可以达到 64MB。
磁盘分区容量与簇大小的关系
- 如果磁盘分区容量增加,而簇的总数保持不变即簇编号所需位数保持不变,则簇就变大。缺点是簇内碎片浪费增加。
- 如果磁盘分区容量增加,而簇的大小不变,则簇的总数就会增加,相应地簇的编号所需要的位数增加。
以簇作为基本分配单位的优点:
- 可以管理较大容量磁盘。
- 在相同的磁盘容量条件下,可以减少 FAT 表的表项数,使 FAT 表占用更少的存储空间,减少了访问 FAT 表的存取开销,提高了文件系统的效率。
FAT16文件系统
每个 FAT 表的表项数占 16 位,即 FAT 表最多允许65536(216)个表项。
一个磁盘分区可以管理 65536 个簇。在 FAT16 的每个簇中可以有的盘块数为 4、8、16、32、64。如果每个簇中最大的盘块或扇区数为 64,FAT16可以管理的最大分区空间为 65536× 64×512 = 2048 MB。(不引入簇为 32MB)
优点:可以管理更大的容量磁盘。
缺点:当磁盘容量迅速增加时,FAT16 文件系统簇内碎片所造成的浪费 比较严重。
FAT32文件系统
每个 FAT 表的表项数占 32 位,即 FAT 表最多允许 232=4,294,967,296 个表项。
FAT32 可以管理更多的簇,这样就允许采用较小的簇(较少簇内碎片),通常FAT32 的每个簇都固定为 4 KB(如果盘块大小为 512B,则每簇包括 8 个扇区)。
缺点
- FAT表很大,运行速度慢
- 有最小管理空间的限制,FAT32卷至少要有65537个簇,不支持容量小于512MB的分区
NTFS(New Technology File System)文件系统
NTFS是目前的主流文件系统
NTFS 具有很多新特征:
- NTFS 文件系统使用了 64 位磁盘地址,理论上可以支持 264 字节的磁盘分区(实际支持最大分区容量为 2TB)。
- 支持长文件名,单个文件名限制在 255 个字符以内,全路径名为 32767 个 字符。
- 具有系统容错功能。
- 提供了数据的一致性功能(日志文件和检查点)。
- 提供了文件加密、文件压缩等功能。
磁盘的组织
NTFS 也是以簇作为磁盘空间分配和回收的基本单位。一个文件占用若 干个簇,一个簇只属于一个文件。
NTFS 通过簇来间接管理磁盘,不需要知道盘块的大小,使 NTFS 具有了与磁盘物理盘块大小无关的独立性,很容易支持盘块大小不是 512 字节的非标准磁盘。
在 NTFS 文件系统中,把卷上簇的大小称为“卷因子”,一个簇包含 2n(n为整数) 个盘块。
簇的大小可由格式化命令按磁盘容量和应用需求来确定,可以为 512B、1KB、…,最大可达64KB。为了在传输效率和簇内碎片之间进行折中,NTFS 在大多数情况下簇的大小 4KB。
NTFS 使用逻辑簇号(LCN)和虚拟簇号(VCN)来进行簇的定位。
LCN是以卷为单位,把整个卷中所有的簇从头到尾进行简单的编号。NTFS 在进行地址映射时,可以通过卷因子与 LCN 的乘积,便可算出卷上的物理字节偏移量,从而得到文件数据所在的物理磁盘地址。
VCN是以文件为单位,把某个文件的簇按顺序编号。
只要知道了文件开始的簇地址,就可以把 VCN 映射到 LCN。
文件的组织
在 NTFS 中,以卷为单位,把一个卷中的所有文件信息都以文件记录的方式记录在一张主控文件表 MFT (Master File Table) 中。
MFT 为每一个文件保存着一组称为“属性”的记录,在 MFT 中占有一行。每行大小固定为 1 KB,每行称为所对应文件的元数据 (metadata),也称为文件控制字。
当文件较小时,可以把文件的所有属性直接记录在元数据中。
当文件较大时,元数据仅记录该文件的一部分属性,文件的 data 属性(文件内容)等记录到卷中的其它簇中,并将这些簇按其所记录文件的属性进行分类,分别链接成多个队列,并将指向这些队列的指针保存在元数据中。
索引组织方式
链接分配方式解决了连续分配方式存在的问题(要求连续空间、外部碎 片等),但又出现了另外两个问题:
不能支持高效的直接存取。隐式链接分配方式查找某一个块必须从第一块开始沿指针进行。显式链接分配方式要对一个较大的文件进行直接存取, 必须首先在 FAT 中顺序地查找许多盘块号。
FAT 需占用较大的内存空间。由于一个文件所占用盘块的盘块号是随机地分布在 FAT 表中的,因而只有将整个 FAT 表调入内存,才能保证在 FAT 表中找到一个文件的所有盘块号。当磁盘容量较大时,FAT 表可能要占用数兆字节的内存空间,这是令人难以接受的。
事实上在打开某个文件时,只需把该文件占用的盘块编号调入内存即可, 没有必要把整个 FAT 表调入内存。
改进:把每个文件所对应的盘块号集中地放在一起,在访问到某个文件时,将该文件所对应的盘块号一起调入内存。
索引分配:为每一个文件分配一个索引块(表),再把分配给该文件的所有块号,都记录在该索引块中。索引块就是一个含有许多块号地址的数组。
单级索引分配
单级索引分配为每个文件分配一个索引块 (表),把分配给该文件的所有盘块号都记录在该索引块中。
在建立一个文件时,只需在该文件的目录项中填上指向索引块的指针
多级索引分配
多级索引分配为这些索引块再建立一级索引,即系统再分配一个(目录)索引块,作为第一级索引的索引块(两级索引)。
如果每个盘块的大小为 1 KB,每个盘块号占 4 个字节,则在一个索引块 中可存放 256 个盘块号。在两级索引时,最多可存放的盘块号总数 N = 256×256 = 64 K 个,即所允许的文件最大长度为 64 MB。
如果每个盘块的大小为 4 KB,每个盘块号占 4 个字节,单级索引时所允 许的文件最大长度为 1024×4 KB =4MB
如果采用两级级索引时最大文件长度为 1024×1024×4 KB =4GB
优点:大大加快了对文件的查找速度
缺点:启动磁盘的次数随着索引级数的增加而增多
增量式索引组织方式
在采用混合索引分配方式的文件系统中,索引结点中设置了 13 个地址项,前10 个是直接地址项,后 3 个是间接地址项。
直接地址:在索引结点中设置 10 个直接地址项,用来存放直接地址。假如每个 盘块的大小为 4KB,当文件不大于 40KB 时,便可直接从索引结点中读出该文件的全部盘块号。
一次间接地址:利用索引结点中的一次间接地址项来提供一次间址。一次间址块中可存放 1K 个盘块号,允许文件长达 4MB。事实上就是一级索引分配方式
多次间接地址:利用二次间接地址项提供二次间接地址。在采用二次间址方式 时,文件最大长度可达 4GB。同理在采用三次间地方式时,所允许的文件最大长度可达 4TB。实质上就是二级索引分配方式。
文件存储空间的管理
文件存储空间的管理可采用连续分配和离散分配方式。
内存分配基本不采用连续分配方式。外存管理中,小文件经常采用连续分配方式,大文件采用离散分配方式。
存储空间的常用管理方法
- 空闲表法和空闲链法
- 位示图法
- 成组链接法
空闲表法和空闲链法
空闲表法
空闲表也叫空闲文件目录,是将文件存储器上一个个连续的未分配区域(称作空闲文件)按第一个空闲块号,连续空闲的块数,具体的位置信息(物理块号)等信息记在空闲表中。
这种方法适合于建立连续文件,适合少量的空闲区。
如果存取空间中有着大量的小的空白区,则空闲表变得很大,因而效率大为降低。
当请求分配存储空间时,系统依次扫描空闲文件目录的表目,直到找到一个合适的空闲文件为止(首次适应算法),分配给用户进程,修改空闲表。
当用户撤消一个文件时,系统回收该文件所占用的空间。扫描空闲表目录,寻找一个空表目,并将释放空间的第一个物理块号及它所占的物理 块数填到这个表目中。考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并。
空闲链法
空闲盘块链:把所有“空闲块”(即未分配使用的物理块,也称“自由块”)链接起来。当创建一个文件需要存储块时,就从链头上依次取下若干块来,而撤销文件时则将回收空间又依次链接到链尾上。
空闲盘区链:把磁盘上的所有空闲盘区(每个盘区可包含若干个盘块) 拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外, 还有指明本盘区大小(盘块数)的信息。
优点:分配和回收的过程非常简单。
缺点:为一个文件分配盘块时,可能要多次重复操作。
位示图法
位示图(二维):利用二进制的一位(bit)来表示磁盘中一个盘块的使用情况。
每个字节的每一位都对应了一个物理块的状态。当该位取 1 时,表示对应的物理块已分配;取 0 时表示该物理块未分配。
特点:占空间少,可放入内存,易于访问。
盘块的分配:
- 顺序扫描,找一个或一组值为 0 的块。
- 把找到的二进制位转换成与之相应的盘块号。假定找到的“0”的二进制位在, 第 i 行、第 j 列, 每行位数为 n,则相应的盘块号:b=n(i-1)+j。(根据实际题目的起始编号计算)
- 修改位示图:map[i,j]=1。
盘块的回收:
- 由盘块号 b 得行列号 (i,j)
i = (b-1) div n +1
j = (b-1) mod n +1
div 取整 mod 取余 - 修改位示图:map[i,j]=0
成组链接法
成组链接法是结合了空闲表和空闲链优点的一种空闲盘块管理方法,并克服了空闲表过大或空闲链过长的缺点。
- 空闲盘块号栈:存放一组空闲盘块的盘块号(最多 100 个),以及栈中尚有的空闲盘块号数 N(兼作栈顶指针,当N=100时,它指向S.free(99))。s.free(0) 是栈底,栈满时的栈顶为S.free(99)。
- 所有空闲盘块被分成若干组(每组 100 个)。
- 把每组的盘块数 N 和该组所有的盘块号记入其前一组盘块的第一个盘块。
- 把第一组的盘块数和所有盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
- 最末一组只有99个可用盘块,其盘块号分别记入前一组的S.free(1)~S.free(99)中,而在S.free(0)中则存放“0”作为空闲盘块链的结束标志。(注:最后一组的盘块数仍为100,但实际可供使用的空闲盘块数却是99,对应的编号为(1~99),0号盘中放空闲盘块链的结束标志,而不再是空闲盘块号)
空闲盘块的分配与回收
分配:
从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后 将栈顶指针下移一格。到s.free(0)时,所分配的磁盘块号是栈中最后一个可用盘块号,由于该块内容为下一组的所有盘块号,因此要先将该块的内容读入栈中,然后才能将该块分配出去。
回收:
将回收盘块的盘块号压入空闲盘块号栈的顶部,并执行空闲盘块数 N加1 操作。到栈满时,将现有栈中的 100 个盘块弹出栈,组成新的一组空闲盘块组。它们的盘块号被记入新回收的盘块中,再将其盘块号作为新栈底(记录了前一组的 100 个盘块号)。
提高磁盘I/O速度的途径
提高文件的访问速度可从三方面着手:
1 改进文件的目录结构以及检索目录的方法以减少对目录的查找时间。
2 选用好的文件存储结构
3 提高磁盘 I/O 速度
- 设置磁盘高速缓存(Disk Cache)
- 其它方法(提前读、延迟写、虚拟盘)
- 采用高度可靠、快速的磁盘系统:独立磁盘冗余阵列(RAID)
磁盘高速缓存
磁盘高速缓存是指内存中的一部分存储空间,用来暂存从磁盘读出的一系列盘块中的信息,所以它是一组在逻辑上属于磁盘,而物理上是驻留在内存中的盘块。
当出现一个访问磁盘的请求时,由核心先去查看磁盘高速缓冲器,若请求的盘块内容已在缓存中,便可从高速缓存中直接读取,省去了启动磁盘的时间,如果不在,才需要启动磁盘将所需要的盘块内容读入,并把盘块内容送给磁盘高速缓存。
数据交付方式
数据交付是指将磁盘高速缓存中的数据传送给请求者进程。
步骤:请求访问磁盘时先查缓存、后查磁盘并更新缓存。
系统采取两种方式把数据交付给请求进程:
数据交付:系统直接将磁盘高速缓存中的数据传送到请求者进程的内存工 作区。
指针交付:只将指向磁盘高速缓存中该数据的指针,交付给请求者进程。
后一种方式由于所传送的数据量少,节省了数据从磁盘高速缓存到进程的内存工作区的时间。
置换算法
在将磁盘中的盘块读入到磁盘高速缓存中时,若因磁盘高速缓存已满,则采用常用的算法进行置换:
最近最久未使用算法 LRU
最近未使用算法 NRU
最少使用算法 LFU
请求调页与磁盘 I/O 中的工作情况不同,在置换算法中所应考虑的问题 也有所差异。磁盘高速缓存置换时除上述算法外还应考虑的问题:
访问频率:请求调页 > 磁盘 I/O
可预见性:请求调页 < 磁盘 I/O
数据的一致性:一旦系统发生故障,高速缓存中的数据将会丢失,如果未 拷回磁盘,会造成数据的不一致。
周期性地写回磁盘
数据的一致性解决方法:将系统中所有盘块数据拉成一条 LRU(最近最 久未使用算法)链,需要一致性的块放在LRU 队列的头部,优先回写。 可能在不久之后再使用的盘块数据,挂在 LRU 链的尾部。
系统中所有盘块数据拉成一条 LRU 链,经常访问的数据被挂在链尾,一 直保留磁盘高速缓存中,可能长期不会被写回磁盘。若系统出故障,则存在磁盘高速缓存中的数据将丢失。
在UNIX系统中专门增设一个修改程序,使之在后台运行,该程序周期性地调用一个系统调动SYNC,其主要功能就是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。一般是把两次调用SYNC的时间间隔定位30s。这样,因系统故障所造成的工作损失不会超过30s的工作量
提高磁盘I/O速度的其他方法
提前读
由于用户对文件的访问常用顺序方式,所以可采用预先读方式,即在读当 前块的同时,连同将下一块提前读入缓冲。当访问下一块数据时,其已在 缓冲中,而不需去启动磁盘 I/O。
延迟写
在缓存中的数据,本应立即写回磁盘,考虑不久可能再用,故不立即写回磁盘,挂在空闲缓冲区队列末尾。
当该缓冲区仍在队列中时,任何访问该数据的进程,都可直接读出其中的数据而不必去访问磁盘。
随着空闲缓冲区的使用,缓冲区也缓缓往前移动,直至移到空闲缓冲队列之首。当再有进程申请到该缓冲区时,才将该缓冲区的数据写入磁盘,而把该缓冲区作为空闲缓冲区分配出去。
优化物理块的分布
使磁头移动的距离最小。
多个连续的块组成一簇,以簇为单位进行分配。
虚拟盘
虚拟盘是利用内存去仿真磁盘,又称为 RAM 盘。
虚拟盘对用户是透明的,仅是感觉略微快些而已。
虚拟盘是易失性存储器(内存),关机或重新启动计算机时,虚拟盘上的信息将丢失,所以在关机或重新启动计算机前,一定要及时把在虚拟盘上的 重要的数据存放到真正的硬盘中。
虚拟盘与磁盘高速缓存的区别:RAM 盘中的内容由用户控制,而缓存中的 内容则由 OS 控制。
廉价磁盘冗余阵列(RAID)
RAID是利用一台磁盘阵列控制器来统一管理和控制一组磁盘驱动器,组成一个高度可靠的、快速的大容量磁盘系统。
并行交叉存取(条带化存取)、 冗余存取、校验存取
并行交叉存取
在该系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上。以后当要将一个盘块的数据传送到内存时,采取并行传输方式,将各个盘块中的子盘块数据同时向内存中传输,从而使传输时间大大减少
RAID的分级
-
RAID0:仅提供了并行交叉存取
仅提供了并行交叉存取,没有数据冗余;无容错功能,不增强可靠性。 -
RAID1:具有磁盘镜像功能
完全相同的数据重复存 于多个盘上。注意:数据读取时可选任一独立磁盘,但修改时必须对所 有镜像同时进行,以保证数据一致性。
具有高可靠性,分布存放;镜像冗余,空间利用率 50%,代价很高,需 要 2n 个独立磁盘;不校验。 -
RAID2:Hamming Code ECC(汉明码错误检测与修正)
-
RAID3:Parallel transfer with parity(并行传输及校验)
-
RAID4:Independent Data disks with shared Parity disk(独立的数据硬盘与共享的校验硬盘)
-
RAID5:Independent Data disks with distributed parity blocks(独立的数据磁盘 与分布式校验块)
-
RAID6:Independent Data disks with two independent distributed parity schemes(独立的数据硬盘与两个独立分布式校验方案)
-
RAID7:Optimized Asynchrony for High I/O Rates as well as High Data Transfer Rates(最优化的异步高 I/O 速率和高数据传输率)
-
RAID10:此级别是 RAID 0 与 RAID 1 的结合(stripping+mirroring)
各级RAID的比较