哈工大李志军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
磁盘与文件系统就是由4层抽象组成!!!
总结一下磁盘的使用:多进程需要读写→通过文件系统(第四层抽象)目录解析找到test.c文件,根据文件(第三层抽象)的FCB得到所需位置的盘块号→盘块号写入请求队列排队(第二层抽象)进行电梯算法→磁盘驱动根据盘块号(第一层抽象)算出C H S→相应扇区读写。下面开始一层一层的抽象开始讲解。
总结:用户删除文件的某一段字符→最终对应磁盘删除的全过程
用户需要删去文件里面的200-212字符,于是编程写write(fd),多进程切换中对应PCB也开始切换调度,轮到删200-212的进程执行时,开始找对应文件名fd的fcb(多级索引inode信息)查该文件存在哪些盘块上的,把盘块号放入请求队列执行电梯算法,在磁盘控制器上算出C H S,最后开始删除。
L28 生磁盘的使用
原理一样:文件视图、out、中断,但是比前面显示器和键盘复杂很多。包装(抽象)层次复杂。
让磁盘工作起来,就是生磁盘
扇区的大小是传输时间和碎片浪费的折中
磁盘数据读写过程:移动磁头到相应的磁道上,旋转磁盘到相应的扇区上,和内存缓存配合进行读写。(控制器—>寻道—>旋转—>传输)
raw disks
- 使用磁盘从认知磁盘开始
- 读写磁盘的基本单位是扇区
- 移动磁头(到相应的磁道,不同半径的圆圈就是一个磁道)--旋转磁盘(到相应的扇区)--和内存进行读写
- 清楚柱面,磁头,扇区,缓存位置的含义--直接使用磁盘
- 很多盘面形成柱头,移动磁臂到相应的柱面,然后再移动磁头H(head)到哪一个磁道C(cyl),然后旋转磁盘到相应扇区S(sec)。所以对磁盘写和读只需要计算出C H S就可以对应到磁盘的相应位置
- 上面给出的信息太多,很麻烦,下面经过几层抽象
- 通过盘块号读写磁盘(一层抽象),也就是根据盘块号block计算出C H S
- 将三维信息编址到一维信息
- 移动磁臂时间称为寻道时间,减少寻道时间,这样相邻block(盘块号),应该尽量放在同一磁道上
- 现在利用盘块号来访问磁盘,一个盘块号可能有几个扇区,这样用空间换磁盘的读写时间
三维信息编址到一维信息,线性关系
扇区越大,读写速度就越快,但是空间利用率就越小,所以工程中无处不在折中。
由block反推CHS:
但是现在的操作系统是多进程的,所以每个进程给出需要访问的盘块号后需要进入队列中等待!!!于是盘块号磁盘访问的队列调度算法就出现了
- 多个进程通过队列使用磁盘(第二层抽象)
- cyl柱面,head磁头,sec扇区
-
利用文件使用磁盘叫熟磁盘;利用盘块号使用磁盘叫生磁盘!
磁盘调度算法
- FCFS磁盘调度算法
- SSTF磁盘调度
shortest seek time first
- 一般请求在磁头中间部分的很多,这样磁臂都集中在中间移动,两边的磁盘请求存在饥饿
- SCAN磁盘调用(电梯算法)
-
C-SCAN磁盘调度(电梯算法)
总结一下:生磁盘的使用整理
OS的核心就是向控制器中写柱面、磁头、扇区、缓存位置
out指令写这些数据,首先要知道这些数据,下面要把这一过程封装一下
通过盘块号读写磁盘(一层抽象)
磁盘驱动负责从block(一维地址)计算出cyl、head、sec(CHS)
OS内部实现一维地址到三维地址到编址,我们希望相邻的盘块可以快速读出。
L29 从生磁盘到文件
Files-cooked Disks
- 进程直接读盘块号行得通么?那么考虑进程→文件→盘块号?
引入文件,对磁盘使用的第三层抽象!
- 字符流和盘块集合之间的映射关系
- 连续结构来实现文件,不适合动态增长,适合读写操作(数组操作)
FCB文件名与盘块号映射表,每个块的大小是固定的
- 链式结构也可以实现文件
- 磁盘有很多盘块号,文件怎么存储在这些盘块号中呢?盘块号的大小是固定的
关键是映射表怎么建立?
- 文件实现的第三种结构,索引结构
索引块来记录文件使用的盘块号
实际系统是多级索引!
- 学习数据结构的时候有学到用
B+-
树进行文件索引!
总结一下磁盘的使用:多进程需要读写→通过文件(第三层抽象)的FCB得到所需位置的盘块号→请求队列排队(第二层抽象)进行电梯算法→磁盘驱动根据盘块号(第一层抽象)算出C H S→相应扇区读写
L30 文件使用磁盘的实现
-
file implementation
代码实现 -
inode
内容为映射表,有索引块 -
磁盘文件inode则记录映射表;设备文件inode,记录与设备相关的信息
- 文件视图
-
文件名-->inode-->盘块号----