4、文件管理 磁盘
FCB (file control block)文件控制块 对于操作系统而言,当任何一个文件存储在本地后,会为了方便后续读取管理,而为每个文件建立专门的用以收集必要属性信息的数据结构,
文件的物理结构 (文件分配方式)
文件数据应该怎 样存放在外存中?
文件的物理结构(文件分配方式)
- 连续分配
- 链接分配
- 隐式链接
- 显式链接
- 索引分配
文件块、磁盘块
类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理 块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同。内存与磁盘之间的数据交换(即 读/写操作、磁盘I/O)都是以 “块”为单位进行的。即每次读 入一块,或每次写出一块
连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块。
若此时文件A要拓展,但后面紧接着的一段已经满了,再往后一段才有空闲磁盘。 因此只能将文件A全部“迁 移”到最后的空闲区域。 结论:物理上采用连续分 配的文件不方便拓展。
优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快
缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片
链接分配
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种
显式链接
把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)
假设某个新创建的文件“aaa”依次存放在磁盘块2→5→0→1
假设某个新创建的文件“bbb”依次存放在磁盘块4→23→3
注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项 (FCB)… 从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT, 往后找到 i 号逻辑块对应的物理块号。逻辑块号转换成物理块号的过 程不需要读磁盘操作。
结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支 持随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0 ~ i-1 号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式 链接来说,访问速度快很多。 显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓 展。
索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文 件的各个逻辑块对应的物理块
(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间 的映射关系)。
索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
索引表
若每个磁盘块1KB,一个索 引表项4B,则一个磁盘块只 能存放 256 个索引项
如果一个文件的大小超过了256 块,那么一个磁盘块是装不下 文件的整张索引表的,如何解 决这个问题?
①链接方案 ②多层索引 ③混合索引
①链接方案
如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
②多层索引
建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据 文件大小的要求再建立第三层、第四层索引块。
③混合索引:
多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接 指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)
文件系统例题
存放在某个磁盘上的文件系统,对于采用混合索引分配方式,其FCB中共有13项地址项,第0~9个地址项为直接地址,第10个地址项为一次间接地址,第11个地址项为二次间接地址,第12个地址项为三次间接地址。如果每个盘块的大小为512字节,盘块号需要3个字节来描述,则每个盘块最多存放170个盘块地址:
(1) 该文件系统允许的最大长度是多少?
(2) 将文件的字节偏移量5000、15000、150000转换为物理块号和块内偏移量。
(3) 假设某文件的索引结点已在内存中,但其他信息均在外存,为了访问该文件中某个位置的内容,最多需要几次访问磁盘?
(1) 文件的最大长度为:10+170+1702+1703=4942080块=2471040KB
(2)
- 5000/512得商9,余数为392。即逻辑块号为9,块内偏移为392。故可直接从该文件的FCB的第9个地址处得到物理盘块号,块内偏移为392。
- 15000/512得商为29,余数为152。即逻辑块号为29,块内偏移为152。由于10≤29<10+170,而29-10=19,故可从FCB的第10个地址项,即一次间址项中得到一次间址块;并从一次间址块的19项中获得对应的物理盘块号,块内偏移为152。
- 150000/512得商为292,余数为496。即逻辑块号为292,块内偏移为496。由于10+170≤292,故可从FCB的第11个地址项,即二次间址项中获得第1个一次间址块;并从该一次间址块的112项中获得对应的物理盘块号,块内偏移为496。
(3) 由于文件的索引结点已在内存,为了访问文件中的某个位置的内容,最少需要1次访问磁盘(即通过直接地址直接读文件盘块),最多需要4次访问磁盘(第一次是读三次间址块,第二次读二次间址块,第三次读一次间址块,第四次是读文件盘块)
文件例题
1、Unix文件系统采用 流式文件
2、文件系统采用两级索引分配方式,如果每个磁盘块的大小为1KB,每个盘块号占4B,则该系统中,单个文件的最大长度是( )
设备盘块的大小为1KB,每个盘块号占4B,则一个索引块可含 1KB/4B=2^8B个盘块号
于是两级索引最多可以包含2^8 * 2^8 = 2^16 B 盘块号,因此允许的最大文件长度为1KB* 2^16 =64MB
例1
有一个计算机系统利用下图所示的位示图(行号、列号都从0开始编号)来管理空闲盘块。
如果盘块从1开始编号,每个盘块的大小为1KB。
(1)现要从文件分配两盘块,试具体说明分配过程。
(2)若要释放磁盘的第300块,应如何处理?
(1)分配过程
线形检索(肉眼扫描)得:i1=2,j1=2; i2=3,j2=6。
计算空闲盘块号:
b1=i1×16+j1+1=2×16+2+1=35
b2=i2×16+j2+1=3×16+6+1=55
修改位示图:
令map[2,2]=map[3,6]=1,并将对应块35,55分配出去。
(2)释放过程
计算出第300块所对应的二进制行号i和j
i=(300-1)/16=18
j= (300-1)% 16=11
修改位示图:
令map[18,11]=0。
例2
假定盘块的大小为1KB,硬盘的大小为500MB,采用显示链接分配方式时,其FAT需占用多少存储空间(FAT表项占2.5个字节)?如果文件A占用硬盘的11, 12 , 16, 14四个盘块,试画出文件A中各盘块在FAT表中的链接情况.
解:此时硬盘共有500M/1K=500K个盘块,
FAT表项共有500K* 2.5B=1250KB
很多例题
磁盘
磁盘的记录功能:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据
每一个圈都是一个磁道,然后又分为多个扇区,不过每个扇区的数据量大小相同;最内侧磁道上的扇区面积最小,因此数据密度最大
盘面、柱面
一个磁盘可能会有两个盘面都记录了数据
一个个圆柱体!
可用(柱面号,盘面号,扇区号)来定 位任意一个“磁盘块”。也就是经常提到文件数据存放在外存中的几号块。
可根据该地址读取一个“块”
①根据“柱面号”移动磁臂,让磁头指 向指定柱面;
②激活指定盘面对应的磁头;
③磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。
磁盘的分类
- 固定头磁盘、活动头磁盘
- 盘片可以更换?可换盘磁盘、固定盘磁盘
一次磁盘读/写操作需要的时间
寻找时间(寻道时间)T1:在读/写数据前,将磁头移动到指 定磁道所花的时间。 ①启动磁头臂是需要时间的。假设耗时为 s; ②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一 个磁道耗时为 m,总共需要跨越 n 条磁道。
则: 寻道时间 T1 = s + m*n
延迟时间T2:通过旋转磁盘,使磁头定位到目标扇区所需要的 时间。设磁盘转速为 r (单位:转/秒,或 转/分,记得转化为转/秒的时候➗60),则 平均所需的延迟时间 T2 = (1/2)*(1/r) = 1/2r【1/r 就是转一圈需要的时间。找到目标 扇区平均需要转半圈,因此再乘以 1/2】
传输时间T3:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为 r,此次读/写的字节数为 b,每个磁道上的字节数为 N。
则: 传输时间T3= (1/r) * (b/N) = b/(rN)【每个磁道要可存 N 字节的数据,因此 b 字节的数据需要 b/N 个磁道才能存储。而读/写一个磁道所需的时间 刚好又是转一圈所需要的时间 1/r】
磁盘调度算法
- 先来先服务(FCFS)
- 最短寻找时间优先(SSTF)
- 扫描算法(SCAN)
- 循环扫描算法(c-SCAN)
如何提升性能?
操作系统的磁盘调度算法会直接影响寻道时间T1,延迟时间和传输时间都与磁盘转速相关,且为 线性相关。而转速是硬 件的固有属性,因此操 作系统也无法优化延迟 时间和传输时间。
例子:假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问 55、58、39、18、90、160、 150、38、184 号磁道
先来先服务算法(FCFS)
优点:公平、简单;
缺点:寻道时间长,相当于随机访问模式。如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。
仅适用于请求磁盘I/O的进程数目较少的场合
最短寻找时间优先(SSTF)
优先处理的磁道是与当前磁头最近的磁道。
可以保证每次的寻道时间最短,比FCFS有更好的寻道性能,但是并不能保证总的寻道时间最短,可能饥饿。
(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)
扫描算法(SCAN)
为了防止饥饿, 可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移 动。这就是扫描算法,由于磁头移动的方式很像电梯,因此也叫电梯算法。
假设某磁盘的磁道为 0~200号,磁头的初始位置是100号磁道,且此时磁头正在往磁道号增大的方向 移动,有多个进程先后陆续地请求访问 55、58、39、18、90、160、150、38、184 号磁道
优点:性能较好,平均寻道时间较短,不会产生饥饿现象
缺点:①只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请 求之后就不需要再往右移动磁头了。 ②SCAN算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过 90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道 的请求之后,很快又可以再次响应 184 号磁道的请求了)
LOOK 调度算法
扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁 道的访问请求之后就不需要再往右移动磁头了。LOOK 调度算法就是为了解决这个问题,如果在磁 头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫 LOOK)
优点:比起 SCAN 算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短
循环扫描算法(C-SCAN)
SCAN算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请 求。
优点:比起SCAN 来,对于各个位置磁道的响应频率很平均。 缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求 之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返 回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。
C-LOOK 调度算法
C-SCAN 算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定 需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向上已经没有 磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。
优点:比起 C-SCAN 算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间 进一步缩短
【若题目中无特别说明, 则SCAN 就是 LOOK, C-SCAN 就是C-LOOK】