2021.11.13
IO
使用IO设备的流程
文件视图
显示器输出的过程
键盘
键盘的使用流程与显示器相似,不同点在于键盘是输入设备
生磁盘
根据盘块号来使用磁盘
磁盘的基本构造
磁道
每个磁盘面都由多个磁道组成,磁道是环状的
柱面
每个盘面都有多个磁道,也就是图中的圆圈,在每个盘面中相同编号的磁道就形成了柱面
找到需要的柱面后磁臂就移动到相应的柱面
磁头
每个磁盘都有一个磁头,正反读写每个盘,结合找到的柱面可以定位到需要的磁道位置
扇区
在找到的盘中找到需要的扇区
读写磁盘的基本单位是扇区
已经定位得到需要的磁道后,旋转磁盘就可以得到需要的扇区
磁盘容量计算
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
磁盘的读写过程
- 移动磁头到相应的磁道(寻道)
- 旋转磁盘到相应的扇区(旋转)
- 进行读写(数据传输)
通过盘块号读写磁盘(一层抽象)
磁盘驱动负责从block计算出cyl,head,sec(CHS)
磁盘访问时间
写入控制器时间+寻道时间+旋转时间+传输时间
由于传输时间相对极短,因此磁盘访问时间主要取决于访问磁盘的次数,因此每次访问磁盘尽量读取更多的数据
盘块
由于读写的数据大小不是很影响磁盘访问时间,因此操作系统将连续的扇区认定为盘块,每次读取盘块中的信息即可,读写的单位被操作系统从扇区变为了盘块,浪费一定的空间来换取了时间效率的提升
多个进程通过队列使用磁盘(第二层抽象)
每个磁盘在被多个进程访问时怎么处理
磁盘调度算法
FCFS
最公平的算法
但这样的做法导致磁头的移动范围巨大
总共移动了640磁道
SSTF算法
Shortest-seek-time First: 短寻道优先
由于磁盘的内容相对集中,就可能导致边缘的磁道很久都不被访问,存在饥饿问题
SCAN算法
先向一边进行移动,再折返
C-SCAN算法(电梯算法)
当达到一边时,从另一边开始从头调度(复位),复位移动很快,这样的做法可以防止两边的磁道饥饿
生磁盘的使用总结
文件
从文件到磁盘号
用户无法直接使用生磁盘,因为无法知道从哪里读取需要的数据,用户给到操作系统的都是文件
用户看到的都是字符序列(字符流),文件就是建立字符流到磁盘的映射
连续结构来实现文件
FCB
文件控制块
由于是连续结构,只需要给到起始块就可以根据文件相对位置计算出剩下的文件被存放在哪一个块中
缺点:当文件的大小不断被增大时,可能导致他需要使用到下一个文件已使用盘块,这样下一个文件就需要被整体移动,开销很大
链式结构实现文件
链表实现
FCB中只需要存储初始块
索引结构
专门采用一个块来存取索引,FCB当中只需要存储索引块的地址
多级索引
小文件索引直接用一级索引,大文件采取多个间接索引
2021.11.15
文件视图总览
目录与文件系统
文件系统,抽象整个磁盘(第四层抽象)
用户眼里的磁盘,一堆文件
目录树
每一层目录下可能有多个文件,每个文件下又有很多文件,可以以目录树的形式来看待
目录使用
那么就引出了下一个问题,目录当中要存放所有文件的FCB吗
树状目录的实现
在磁盘上存放FCB数组和磁盘块集合
每一个目录的FCB存放有他在数据盘块中的数据块,在这个数据块上存放着该目录下的子目录和文件的的信息,包含了一个文件名和他对应的FCB的地址,根据这个地址,可以在FCB数组中找到下一级目录的FCB,然后可以继续查找接下来的目录或者直接定位到这个文件。
根目录的信息放在数组的第一个位置,这样可以让操作系统直接从根目录开始读取
文件自举
为了让文件在不同系统上都能完成同样的读取,磁盘就需要被格式化成下图中所示的样子,
盘块位图:表示哪些盘块是空闲的
i节点位图:标识是否可以新建文件,即申请一个新的i节点
超级块:存放两个位图有多长
引导块:引导扇区,可能是固定的