哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

磁盘与文件系统就是由4层抽象组成!!!

总结一下磁盘的使用:多进程需要读写→通过文件系统(第四层抽象)目录解析找到test.c文件,根据文件(第三层抽象)的FCB得到所需位置的盘块号→盘块号写入请求队列排队(第二层抽象)进行电梯算法→磁盘驱动根据盘块号(第一层抽象)算出C H S→相应扇区读写。下面开始一层一层的抽象开始讲解。

哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

 

总结:用户删除文件的某一段字符→最终对应磁盘删除的全过程
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

用户需要删去文件里面的200-212字符,于是编程写write(fd),多进程切换中对应PCB也开始切换调度,轮到删200-212的进程执行时,开始找对应文件名fd的fcb(多级索引inode信息)查该文件存在哪些盘块上的,把盘块号放入请求队列执行电梯算法,在磁盘控制器上算出C H S,最后开始删除。

 

L28 生磁盘的使用

原理一样:文件视图、out、中断,但是比前面显示器和键盘复杂很多。包装(抽象)层次复杂。

让磁盘工作起来,就是生磁盘

扇区的大小是传输时间和碎片浪费的折中

磁盘数据读写过程:移动磁头到相应的磁道上,旋转磁盘到相应的扇区上,和内存缓存配合进行读写。(控制器—>寻道—>旋转—>传输)

  • raw disks
  • 使用磁盘从认知磁盘开始
  • 读写磁盘的基本单位是扇区
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
  • 移动磁头(到相应的磁道,不同半径的圆圈就是一个磁道)--旋转磁盘(到相应的扇区)--和内存进行读写

 

哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 清楚柱面,磁头,扇区,缓存位置的含义--直接使用磁盘
  • 很多盘面形成柱头,移动磁臂到相应的柱面,然后再移动磁头H(head)到哪一个磁道C(cyl),然后旋转磁盘到相应扇区S(sec)。所以对磁盘写和读只需要计算出C H S就可以对应到磁盘的相应位置


哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 上面给出的信息太多,很麻烦,下面经过几层抽象
  • 通过盘块号读写磁盘(一层抽象),也就是根据盘块号block计算出C H S
  • 将三维信息编址到一维信息
  • 移动磁臂时间称为寻道时间,减少寻道时间,这样相邻block(盘块号),应该尽量放在同一磁道上
  • 现在利用盘块号来访问磁盘,一个盘块号可能有几个扇区,这样用空间换磁盘的读写时间
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

三维信息编址到一维信息,线性关系
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

扇区越大,读写速度就越快,但是空间利用率就越小,所以工程中无处不在折中。

由block反推CHS:
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

 

但是现在的操作系统是多进程的,所以每个进程给出需要访问的盘块号后需要进入队列中等待!!!于是盘块号磁盘访问的队列调度算法就出现了

  • 多个进程通过队列使用磁盘(第二层抽象
  • cyl柱面,head磁头,sec扇区
  • 利用文件使用磁盘叫熟磁盘;利用盘块号使用磁盘叫生磁盘!
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

磁盘调度算法

  • FCFS磁盘调度算法
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
  • SSTF磁盘调度
  • shortest seek time first
  • 一般请求在磁头中间部分的很多,这样磁臂都集中在中间移动,两边的磁盘请求存在饥饿
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
  • SCAN磁盘调用电梯算法
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
  • C-SCAN磁盘调度(电梯算法)
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

总结一下:生磁盘的使用整理
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

OS的核心就是向控制器中写柱面、磁头、扇区、缓存位置

out指令写这些数据,首先要知道这些数据,下面要把这一过程封装一下

通过盘块号读写磁盘(一层抽象)
磁盘驱动负责从block(一维地址)计算出cyl、head、sec(CHS)

OS内部实现一维地址到三维地址到编址,我们希望相邻的盘块可以快速读出。

 

L29 从生磁盘到文件

  • Files-cooked Disks
  • 进程直接读盘块号行得通么?那么考虑进程→文件→盘块号?

引入文件,对磁盘使用的第三层抽象
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 字符流和盘块集合之间的映射关系
  • 连续结构来实现文件,不适合动态增长,适合读写操作(数组操作)

FCB文件名与盘块号映射表,每个块的大小是固定的
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 链式结构也可以实现文件
  • 磁盘有很多盘块号,文件怎么存储在这些盘块号中呢?盘块号的大小是固定的

关键是映射表怎么建立?
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 文件实现的第三种结构,索引结构

索引块来记录文件使用的盘块号
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

实际系统是多级索引!
哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 学习数据结构的时候有学到用B+-树进行文件索引!

总结一下磁盘的使用:多进程需要读写→通过文件(第三层抽象)的FCB得到所需位置的盘块号→请求队列排队(第二层抽象)进行电梯算法→磁盘驱动根据盘块号(第一层抽象)算出C H S→相应扇区读写

 

L30 文件使用磁盘的实现

  • file implementation代码实现
  • inode内容为映射表,有索引块
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30
  • 磁盘文件inode则记录映射表;设备文件inode,记录与设备相关的信息
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

  • 文件视图
  • 文件名-->inode-->盘块号----
    哈工大*军操作系统 —(四)设备驱动与文件系统—生磁盘与文件使用磁盘L28.L29.L30

用户需要删去文件里面的200-212字符,于是编程写write(fd),多进程切换中对应PCB也开始切换调度,轮到删200-212的进程执行时,开始找对应文件名fd的fcb(多级索引inode信息)查该文件存在哪些盘块上的,把盘块号放入请求队列执行电梯算法,在磁盘控制器上算出C H S,最后开始删除。