L4.3 生磁盘的使用
1、认识磁盘
- 选择磁道
- 旋转扇区
- 数据读写
- 哪一个柱面
C
- 哪一个磁头
H
- 哪一个扇区
S
2、第一层抽象:盘块号block
发送盘块号block,
磁盘驱动
根据 block 计算出 cyl、head、sec(CHS)
-
磁盘访问时间主要是寻道时间和旋转时间,因此增大每次读写磁盘的基本单位(扇区->盘块),可以增大读写速度,但会降低空间利用率。
-
block 反推 CHS过程:
- block对Sectors取余(即代码中
%4
第四个参数,即hd_info[dev].sect
),得到的余数即为S。(注:Sectors为一个盘的扇区数,Head为一个柱面的磁头数,都是提前知道的) - 上述取余商可知CHeads+H的值,对Heads再取余(即代码中
%4
第四个参数,即hd_info[dev].head
),商即为C,余数即为H
- block对Sectors取余(即代码中
代码显示,一个盘块左移一位即为扇区数,所以一个盘块对应两个扇区,而一个扇区512byte,所以linux0.11一个盘块1K
3、第二层抽象
多个进程将盘块号放在请求队列上,磁盘驱动从队列中取出。
磁盘调度算法:
- FCFS:先来先处理
- SSTF:短寻道优先
- 存在饥饿问题
- SSTF:电梯算法
- 直接复位到另一端(复位占时间少),这样子中间的队列就不占便宜了,对于所有请求都是公平的
4、生磁盘使用整理
L4.4 从生磁盘到文件
1、第三层抽象:引入文件,根据映射表可以找到字符流对应的盘块号,用户不用关心盘块号
FCB
中存储文件信息
2、顺序结构:不适合于动态生长,但适合于读写
3、链式结构:适合于动态生长,但不适合于读写
4、索引结构
文件的FCB即inode
,open把文件的inode
读入
实际系统是多级索引
L4.5 文件使用磁盘的实现
- inode存放文件的FCB
- file存放位置200
- count存放大小12