OS-5.1 磁盘
磁盘的结构
磁盘是由表面涂有磁性物质的盘片构成的存储设备。

磁盘 磁道 扇区
每个盘面分成一个个磁道,每个磁道分成一个个扇区。
每个扇区存放的数据量相同。因此内侧的扇区数据密度大。

盘面 柱面
磁盘不止一个盘面的。会有多个盘面。(甚至每个面还可能是双面的)
所有磁头都是连接在同一个磁臂。
柱面:所有盘面中相对位置相同的磁道组成柱面
磁盘的物理地址
(柱面号,盘面号,扇区号)

如何在磁盘中读写数据
- 根据柱面号移动磁臂。让磁头指向指定柱面(即磁道)。
- 激活指定盘面对应的磁头
- 磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样子就完成了对指定扇区的读写
磁盘的分类
活动头磁盘:磁头可以在不同磁道间移动的。
固定头磁盘:每一个磁道都有一个磁头。(磁头也就不需要移动了)

可换盘磁盘:盘片可以更换
固定盘磁盘:…
回顾

磁盘调度算法

一次磁盘读写操作需要的时间
==①寻道时间==:磁头移动寻找磁道的时间
- 启动磁头臂s
- 移动磁头跨越n条磁道,跨越一条m
- 总寻道时间 Ts = s+n*m
==②延迟时间==:旋转磁盘,使磁头定位到目标扇区所需要的时间
- 磁盘转速r(转/秒,/分)(转一圈时间就是1/r)
- 延迟时间(平均,即半圈就能找到)Tr = (1/2)*(1/r) = 1/(2r)
==③传输时间==:向磁盘读写数据的时间
- 磁盘转速r,读写字节数b,每个磁可存的字节数N
- 传输时间 Tt = (1/r)*(b/N) = b/(rN)
平均总时间 Ta = Ts + 1/(2r) + b/(rN)
- r,N,b都是固定的。所以能优化的只有①寻道时间。
磁盘调度算法
①FCFS
根据进程请求访问磁盘的先后顺序进行调度。
优点:公平。
缺点:当大量进程,或者访问的磁道分散,性能很差。

②最短寻找时间优先(SSTF)
选择眼前最优(磁道与当前磁道最近的),但不一定是总体最优。
优点:性能好,平均寻道时间短。
缺点:可能有“饥饿”现象。

③扫描算法(SCAN)
SSTF产生饥饿的原因是:磁头有可能在一个小区域内来回移动。SCAN解决了这个问题
只有磁头移动到最外侧磁道的时候才能往内移动。
只有磁头移动到最内侧磁道的时候才能往外移动。
(也叫电梯算法)
优点:性能好且没有“饥饿”
==缺点==:①只有到达边边的磁道才能改变方向。②算法对于各个位置磁道的响应频率不均匀,边上的相应时间短。

④LOOK调度算法
解决了SCAN的缺点①
如果在磁道移动方向没有别的请求了,就可以立即改变磁头移动方向了。
(边移动边观察,叫LOOK哈哈哈)
优点:平均寻道时间又短了点。

⑤循环扫描算法(C-SCAN)
解决了SCAN的缺点②
只有磁头朝某个特定方向移动时才处理磁道请求,
返回时直接快速移动至 起始端 而不处理任何请求。
优点:对于各个位置磁道的响应频率很平均,不会有偏爱。
缺点:①只有到达最边上的磁道才能改变磁头移动方向。②返回不用去起始端,去起始的第一个位置就行。③寻道时间比SCAN长。

⑥C-LOOK算法
解决了C-SCAN的缺点
如果磁头移动方向上已经没有磁道访问请求了,立即让磁头返回。
并且磁头只需要返回到有磁道访问请求的位置就行了。

回顾

其他算法:
NstepSCAN:
将磁盘请求队列划分为若干长度为N的子队列。调度器按FCFS原则依次处理各子队列。
在处理每个子队列内部时,采用SCAN算法进行扫描。
在处理每个子队列时,若有新请求到达,则系统将其放入尚未处理的其他子队列中,不插入当前的子队列。
FSCAN:
NstepSCAN的简化,队列划分为两个子队列:当前任务队列和新请求队列。
减少延迟时间的方法
读取连续逻辑扇区,所需要的延迟时间会比较大。
一般来说,连续存放的下一块存放在:同一个柱面,同一个通道,的下一个扇区中。
因为扇区数据的读写消耗时间,盘片继续旋转,需等到下一圈才能读取物理相邻的扇区。

解决方法①:交替编号
让逻辑上相邻的扇区有一定的物理间隔。
可以使连续读取逻辑扇区所需要的延迟时间更小。
磁盘地址结构的设计
磁盘的物理地址(柱面号,盘面号,扇区号)
为什么不是:(盘面号,柱面号,扇区号)
原因:在取地址连续的磁盘块时,(柱面号,盘面号,扇区号)不需要移动磁头。(相邻的柱面号相同,盘面号不同,转动磁盘就行了)


解决方法②:错位命名
若相邻的盘面相对位置相同处扇区编号相同:

若错位命名:

磁盘的管理

==磁盘初始化==
低级 / 物理格式化:将空白磁盘的各个磁道划分磁道,扇区。并将扇区号、磁道号等写入每个扇区的头部和尾部。
逻辑分区:将磁盘分区(C盘D盘)。每个分区由若干个柱面组成。每个分区的起始扇区和大小都记录在磁盘主引导记录的分区表中。
高级 / 逻辑格式化:在分区上建立文件系统。其中存储的数据结构包括:空闲和已分配的空间,以及一个初始为空的目录。

引导块/启动块/启动分区
计算机启动时需要运行初始化程序(自举程序)来完成初始化并加载OS。【初始化CPU,寄存器,内存等等】
ROM中存放很小的自举转入程序。完整的自举程序存放在初始块/引导块中。
ROM中的代码指示磁盘控制器,将引导块读入内存并执行。
引导块可以从指定位置加载操作系统内核并启动。

坏块的管理
属于硬件故障,系统无法修复。
坏块对操作系统是透明的。
所以应该标记出来,避免OS错误使用到。
简单的磁盘:逻辑格式化时将其标记出来。
复杂的磁盘:磁盘控制器维护一个坏块链,并管理备用扇区。

回顾

固态硬盘SSD

**==静态==**磨损均衡:
空闲期间自动迁移:
将低磨损块中:长期未更新的“冷数据”放到高磨损块。
将高磨损块中:有效数据迁移到低磨损块中。
使得高磨损块以只读为主,低磨损块以写为主。
静态方法比动态方法优秀!
性能对比:
连续读写 – 机械硬盘!(寻道方便)
随机读写 – 固态硬盘!
机械硬盘对比固态硬盘
闪存芯片替代了机械驱动器。
闪存翻译层替代了磁盘控制器。

SSD的结构
系统对SSD的读写是以==“页”==为单位的。
系统对SSD的擦除是以==“块”==为单位的。
SSD的一个页,相当于磁盘的一个扇区

Other
提高磁盘IO速度的方法:
- 改进文件的目录结构和检索目录的方法
- 选取好的文件存储结构
- 提高磁盘IO速度:采用磁盘高速缓存。调整磁盘io请求顺序。延迟写。优化物理块分布等等。
光盘能随机读写!
磁盘上的文件以块为单位进行读写?
旋转延迟的大小与 文件的结构有关:
- 连续分配的磁盘中,文件的物理地址连续。
- 链接分配的磁盘中,文件的物理地址不连续。
when簇+随机寻道: 读写一个通道的时间,包括寻道时间+读写磁道时间。即T+r
- 簇:一个磁道所有扇区归一,即以一个磁道为基本单位而不是扇区。
