操作系统之磁盘与文件

L28 生磁盘的使用



​raw disks​



使用磁盘从认知磁盘开始



读写磁盘的基本单位是扇区



移动磁头(到相应的磁道)--旋转磁盘(到相应的扇区)--和内存进行读写



清楚柱面,磁头,扇区,缓存位置的含义--直接使用磁盘



很多盘面形成柱头,移动磁臂到相应的柱面,磁头决定了哪个盘面



上面给出的信息太多,很麻烦,下面经过几层抽象



通过盘块号读写磁盘(一层抽象



将三维信息编址到一维信息



移动磁臂时间称为寻道时间,减少寻道时间,这样相邻block(盘块号),应该尽量放在同一磁道上



现在利用盘块号来访问磁盘,一个盘块号可能有几个扇区,这样用空间换磁盘的读写时间



三维信息编址到一维信息,线性关系



由block反推CHS:



多个进程通过队列使用磁盘(第二层抽象)



cyl柱面,head磁头,sec扇区



利用文件使用磁盘叫熟磁盘;利用盘块号使用磁盘叫生磁盘!



磁盘调度算法



FCFS磁盘调度算法



SSTF磁盘调度



​shortest seek time first​



一般请求在磁头中间部分的很多,这样磁臂都集中在中间移动,两边的磁盘请求存在饥饿



SCAN磁盘调用(电梯算法)



C-SCAN磁盘调度(电梯算法)



生磁盘的使用整理



L29 从生磁盘到文件


  • ​Files-cooked Disks​
  • 如何从文件得到盘块号?
  • 引入文件,对磁盘使用的第三层抽象!
  • 字符流和盘块集合之间的映射关系
  • 连续结构来实现文件,不适合动态增长,适合读写操作(数组操作)
  • 文件控制块FCB,每个块的大小是固定的
  • 链式结构也可以实现文件
  • 磁盘有很多盘块号,文件怎么存储在这些盘块号中呢?盘块号的大小是固定的
  • 关键是映射表怎么建立?
  • 文件实现的第三种结构,索引结构
  • 索引块来记录文件使用的盘块号
  • 实际系统是多级索引!
  • 学习数据结构的时候有学到用​​B+-​​树进行文件索引!

L30 文件使用磁盘的实现



​file implementation​​代码实现



​inode​​内容为映射表,有索引块


磁盘文件inode则记录映射表;设备文件inode,记录与设备相关的信息

文件视图



文件名-->inode-->盘块号----



C/C++基本语法学习 STL C++ primer