操作系统 4. 外设与文件系统 2021-04-13 浏览量 612 暂无评论 [TOC] ## 4.1 IO系统 显示器与键盘为终端设备。 ### 4.1.1 IO与显示器 给外设的控制器/存储器写入指令,让其操控设备,操控完向CPU发出中断。 形成**文件视图**;发出OUT指令;形成中断处理。 每个设备都有自己的访问方式(格式),为了使用方便,将它们写成文件,形成文件视图。 无论什么设备,系统的调用接口都是`open(), read(), write(), close()`。 每个接口下面都有好多分支,根据信息一步步找到需要操作的设备并操作。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408222924337.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ### 4.1.2 键盘 每个键都有一个扫描码,根据键表中对应的扫描码作出响应。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210408224933158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) ## 4.2 磁盘与文件 ### 4.2.1 生磁盘的使用 比键盘和显示器复杂得多。 磁盘由一个个盘面组成,每个盘面外环为磁道,内环为扇区,扇区是磁盘的访问单位,大小为512字节。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210411203634124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NzkyOTU5,size_16,color_FFFFFF,t_70) 磁盘IO过程:控制器-->寻道(磁臂)-->旋转(磁道)-->传输 控制器需要的参数:柱面(cyl)、磁头(head)、扇区(sec)、缓存位置 再进一步: 通过盘块号(block)读写磁盘,**磁盘驱动**负责从block计算出cyl,head,sec(CHS) 怎么计算呢? 由一维向三维编址 如何编址:要让block相邻的盘块可以快速读出(满足实际) 磁盘访问时间 = 写入控制器时间 + 寻道时间 (12ms to 8ms)+ 旋转时间(7200r/min, 半周4ms) + 传输时间(50M/s, 0.3ms) 寻道时间最长,那么要让相邻的盘块放在相邻的扇区或盘面(磁头),由此可得到 $block=C*(Heads*Sectors)+H*Sectors+S$ 盘块可以包含多个扇区,这样一次读取多个连续扇区,可以提高读写速度(以牺牲空间为代价) **多个进程通过队列使用磁盘** 涉及到调度,主要目标是平均访问延迟小,寻道时间占主要部分 FCFS SSTF(短寻道优先,不公平) SCAN C-SCAN(电梯算法,完成一次-复位【复位的时间很短】) ### 4.2.2 从生磁盘到文件 关键:从文件得到盘块号 用户:文件为字符流 磁盘:文件为盘块 文件:建立字符流到盘块号集合的映射关系 每个文件都有个对应的FCB,存放文件存放的起始块 不同的文件使用不同的实现方式(如word需要动态增长) 实现方式: - 连续结构,不适合动态增长,适合直接读写 - 链式结构 - 索引结构,多级索引 ### 4.2.3 文件使用磁盘的实现 inode->盘块号->电梯队列->CHS->out磁盘控制器->驱动马达->电磁形成数据 其他设备,inode->对应设备函数 ## 4.3 文件系统 ### 4.3.1 目录与文件系统 磁盘-->目录树 核心问题:怎么将一系列文件映射到整个磁盘 发展:所有文件放在一起-->分用户存放-->目录树(分治) **如何高效地根据路径名,得到文件的FCB(inode)?** 首先,不能在每次读取目录下的文件时,将该目录下所有文件的PCB读进内存,这样太浪费资源,而且频繁的硬盘读会降低速度 目录项:文件名+对应的FCB地址() 根目录(存在硬盘的FCB数组中的第0个,根据根目录文件找到它的数据块(目录中存放的内容))-->匹配数据块的目标字符,再定位FCB数组中第12个元素找到下一个数据块,依次往下进行,知道找到目标文件的FCB 那么,要使整个系统能够自举,还需要存储一些信息,比如根目录的位置,通常,磁盘被格式化为如下形式: 引导块 超级块 inode位图 盘块位图 inode 数据区 引导块:大小一般固定 超级块:存放inode位图和盘块位图的位置(**在系统中mount,其实就是读超级块**) inode位图:哪些文件的inode是空的(可以再被分配使用) 盘块位图:哪些盘块是空的 疑问:inode位图取多大呢?怎么知道我将来要放的文件的数量呢? ### 4.3.2 目录解析代码实现 1. 解析根目录: 在系统启动shell时,mount_root() 2. 读取inode--iget() 3. 找到目录项--find_entry() 匹配文件(夹)名 跳至2,直到树底 操作系统全图: 进程带动 多进程视图+文件视图 赞赏 微信支付 支付宝支付