文章目录
第三章 内存管理
内存的基础知识
什么是内存,有何作用
几个常用的数量单位
指令工作原理
装入的三种方式–绝对装入
- 灵活性最差,换台电脑可能就不行了
装入的三种方式–可重定位装入
- 运行期间不能再移动程序,也不能再申请空间
装入的三种方式–动态运行时装入
从写程序到程序运行
- 链接的定义
链接的三种方式
知识点小结
- 这里讨论的关于逻辑地址和物理地址,指的是,指令中包含操作码和操作参数,操作参数里的地址问题,不是指令本身的地址
- 三种装入方式和三种链接方式,别搞混了;
- 装入方式是关于逻辑地址转成物理地址的
- 链接方式是将编译后的若干个目标模块和所需库函数链接在一起
内存管理的概念
操作系统如何对内存进行管理
内存空间的分配与回收
- 知识点比较多,后面再详细探讨
内存空间的扩展
- 虚拟技术,把物理上很小的空间扩展为逻辑上很大的空间
地址转换
- 逻辑地址转为物理地址,即三种装入方式
内存保护
- 让各个进程只能访问自己的内存空间
- 两个方案
知识点小结
覆盖与交换
覆盖技术
覆盖技术举例
- 这里举例的前提是,程序是依次调入执行的
- 缺点:对用户不透明,增加编程负担
交换技术
- 第二章讲的处理机的中级调度就是实现交换技术
- 注意:换出到外存的是进程运行的相关程序和数据,但是进程的PCB仍然保留在内存,便于把进程换入内存
思考问题
- 磁盘存储空间:对换区,文件区
- 对换区追求换入换出速度,I/O速度比文件区更快
- 文件区追求存储空间利用率,采用离散分配方式管理空间
- 换出的数据主要放在对换区
知识点小结
- 主要出选择题
连续分配管理方式
单一连续分配
- 内存中只能有一道用户程序,独占,不可以多道用户程序
- 不一定采取内存保护,因为只有一道用户程序
- 无外部碎片,有内部碎片
固定分区分配
- 将用户空间划分为若干个固定大小的分区,每个分区装入一道作业
- 分区大小相等,分区大小不等
分区说明表
- 操作系统用来记录各个分区的情况,是一个数据结构(链表或数组)
- 无外部碎片,有内部碎片
动态分区分配
- 进程装入内存时,才会根据进程大小动态的建立分区,因此分区大小和数目是可变的
- 思考问题
动态分区分配–用什么数据结构记录分配情况
- 空闲分区表,空闲分区链
动态分区分配–如何选择分区
- 采用动态分区分配算法,下一节再展开
动态分区分配–如何进行分区的分配与回收
- 分配:分完了,还有剩余空间,则修改分区表;没有剩余了,则去掉这个空间分区记录
动态分区分配–如何进行分区的分配与回收
- 回收:回收区有相邻的空闲分区,则进行合并,修改表记录;没有相邻空闲分区,增加一个表记录
- 各个表项的排序规则需要看具体的动态分区分配算法来确定
外部碎片,内部碎片
- 某一进程需要一块大的连续内存空间,但这些外部碎片不满足需求,但这些外部碎片的总和满足
- 采用紧凑技术解决外部碎片
- 紧凑技术正好适合搭配装入技术中的动态重定位技术,因为程序可能会更换在内存中的位置
- 紧凑之后需要修改各个进程的起始地址,进程起始地址保存在PCB中,
知识点小结
- 外部碎片,内部碎片经常出选择题
- 紧凑技术也出过选择题,回收内存分区的四种情况也出过真题
动态分区分配算法
首次适应算法
- 空闲分区地址按照递增的顺序排列,保存在空闲分区表或空闲分区链
- 分配或者回收空闲分区后,在修改对应的表或链
最佳适应算法
- 空闲分区按照容量递增的顺序链接,每次分配内存时按照顺序查找空闲分区链或表
- 如果分配会或回收空闲分区之后,还要修改表项或者链中记录,如果不在满足容量大小递增的顺序了,还要调整空间分区表或链的排列顺序,重新回到容量递增顺序
- 缺点:会产生很多的外部碎片
最坏适应算法
- 优先使用最大的连续空闲区
- 空闲分区按照容量递减的顺序链接
- 解决了最佳算法的隋品太多
- 缺点:消耗了很多大的空闲分区,再有大进程来,就没有内存分区可用了,
临近适应算法
- 每次从上一次查找结束的位置,开始检索
- 可以将空闲分区地址排成一个循环链表,按照地址递增的顺序
- 无需对链表进行重新排列,因为是按地址递增排列的,算法开销比较小;比最佳和最坏的算法开销小
- 首次适应算法也有问题,每次都要从头查找,而临近算法不用从头查
- 临近适应算法也导致了高地址部分的大分区更可能被使用,并划分为小分区,导致最后无大分区可用,
- 四种算法,首次适应算法效果最好
知识点小结
- 很容易出题
- 理解算法思想,各个算法的优缺点;开销大是因为可能要排序
- 邻近适应算法略难理解,再细品一下
基本分页存储管理的概念
本节是高频考点,也是难点
针对的是非连续分配管理方式
分页存储
- 内存空间分成一个个大小相等的页框/页帧/内存块/物理块/物理页面
- 一个进程的逻辑地址也分成页/页面,页的大小与内存块是一样的
- 操作系统将进程的一个个页存放在内存的一个个内存块中,因此进程的页面与内存的内存块有一一对应关系
- 进程的页可以不用连续存放到内存中
- 注意区分概念:
- 进程的逻辑地址划分:页,页面
- 内存的物理地址划分:页框,页帧,内存块,物理块,物理页面
重要的数据结构–页表
- 用于将逻辑地址的页与物理地址的内存块进行一一对应
- 页表通常存放在PCB中
每个页表项占多少字节(先看块号)
- 例题中,块号至少有20位,我们的计算机一般以字节为单位,因此就是至少3字节,24位
- 重要考点,经常让我们通过内存块数量求出块号至少占多少字节
页号占多少字节
- 类比数组,页表项是连续存放的,块号是固定的位数
- 因此页号是隐含的,只需知道页表项的起始地址即可推算任意页号的存放地址
因此每个页表项的字节数就是块号的字节数
如何实现地址转换(复习连续存放时)
- 逻辑地址+偏移量
如何实现地址转换(分页存放)
- 进程的各个页面时离散存放的,但页面内部是连续存放的
举例
页面大小最好是2的整数次幂
- 逻辑地址刚好可以划分为两部分,页号+页内偏移量
- 页面大小=内存块大小
- 物理地址也可以划分两部分,块号+块内偏移量(页内偏移量)
- 如果页面大小是2的整数次幂,可以这样快速算出,也能提高计算机效率;如果不满足2的整数次幂,只能用土办法
为什么页面大小取2的整数次幂
逻辑地址结构
知识点小结
基地址变换机构
基本地址变换机构
- 程序未执行时,页表起始地址和页表长度放在PCB中
- 进程被调度时,操作系统内核将他们存放到页表寄存器中PTR
基地址变换过程
- 进程切换时,内核程序PCB中取出必要信息,恢复进程数据,
- 比如把页表起始地址和页表长度放到PTR中,把下一条指令的逻辑地址放到程序计数器PC中
- 因此我们要把下一条指令的逻辑地址转为实际的物理地址
- 考试经常出题,给出逻辑地址,页表,计算求物理地址
例题
- 理解也是管理中地址是一维的
- 初学者经常忘记对页号的越界检查
对页表项大小的进一步探讨
- 页表项也存放在内存中,也要面对内存块大小的影响
- 本例中,开始用三个字节编址内存块号,因此一个页表项占三字节,因此页表项在一个内存块中存放最后会有剩余碎片的
- 这不利于页表项的查询,因此用四个字节编址内存块号,即一个页表项占四字节,刚好在内存块中可以存满(考试一般不考,了解即可)
- 做题时,我们依然按三字节这个思路求解,四字节的思路是实际应用的思路
- 进程的页表也是装在连续的内存块中的
知识点小结
- 本节十分重要,经常作为大题,小题考察
- 地址变换过程最重要,掌握过程,熟练手算过程
- 本节中介绍的基本地址变换方式一共访问了两次内存
具有快表的地址变换机构
什么是快表
- 联想寄存器,TLB,是高速缓存,专门存放最近访问的页表项副本,不是内存,
- 内存中的页表常称为慢表
- CPU访问缓存的速度比内存快得多
能否把整个页表都放在TLB中
快表的作用
- 快表是一个专门的硬件,当进程切换的时候,快表也会清空
- 查询过程
- 拿到逻辑地址,先检查是否越界
- 根据页号查快表是否可以命中,如果命中直接内存块好+页内偏移=物理地址,访问内存(一次访存)
- 如果快表不命中,访问慢表(一次访存),查询内存块号,将最近使用过的页表项存入快表;然后内存块好+页内偏移=物理地址,访问内存(二次访存)
- 快表存放的是页表中的一部分
快表慢表同时查找
- 做题时需要注意细节,究竟是快表慢表同时查找,还是先查快表再查慢表
局部性原理
- 基于局部性原理,我们把访问过的慢表的页表项存到快表,下次需要访问的逻辑地址有很大几率还在原来的这个页表里
- 因此这个页号的页表项存在快表里,有大概率会被命中
知识点小结
- 理解TLB与普通Cache的区别
两级页表
单级页表存在的问题
- 不要忘记,页表项中只保存了内存块好,页号是隐含的,因此这要求页表项必须是连续存放的
- 如果把图中的2的20次方的页表项,一个页表项4B,需要2的10次方个页框(内存块)连续存放这些页表项,显然很吃力
- 本来设计内存块就是为了离散存放数据,结果存放页表项需要这么多连续的页框(内存块),丧失了离散存储的优点
- 局部性原理,没必要整个页表常驻内存
如何解决单级页表的问题
- 之前用分页的方式解决进程数据的连续存放问题
- 同样的思路,用分页的方式解决页表项连续存放的问题,给页表项分组,
两级页表的原理,地址结构
- 给页表项分组,每个分组刚好装满一个页框(内存块),每个分组就是一个小页表
- 再准备一个顶级页表,里面的每个页表项存放的就是,小页表号对应的页框(内存块)号
- 个人理解:需要注意的是,不管是上层表中的页表项里的小页表号,还是下层表中的页表项的页号,都是隐含的,因为是顺序存储。其实里面存的只有内存块号
- 对应的,将原来的页号编址,重新划分为两部分,一级页号(小页表号),二级页号(小页表内的页号)
如何实现地址变换
- 图中为二级页表
- 1.根据逻辑地址一级页号查一级表(一次访存),得到内存块号(换成物理地址存的就是指定的二级表),表中内容给下一级查
- 2.根据逻辑地址中二级页号查二级表(二次访存),得到内存块号
- 3.内存块号+页内偏移=物理地址,找到指定数据(三次访存)
没必要让整个页表常驻内存
- 需要访问页面时才把页面调入内存,虚拟存储技术
- 页表项增加一个标志位,表示该页面是否已经调入内存
- 如果要放的页面不在内存,则产生内中断,然后将目标页面从外存调入内存,后面详细介绍
需要注意细节
- 若采用多级页表机制,则各级页表的大小不能超过一个页面,如果超出,就再分出层级
- 比如题中的逻辑地址页号有28位
- 经过计算,每个页面可以放2的10次方个页表项,因此每一个层级最多为10位编址
- 28位的页号拆分为8+10+10
- 这里很容易作为考点考察
- 假设没有快表机构,n级页表的访存次数为n+1,其中前n次查表,最后一次访问真正的数据
- 因此多级页表提高了内存空间的利用率,但是访存次数更多,速度降低
知识点小结
- 术语:408中最长用页目录这个术语
基本分段存储管理方式
分段
分段系统的逻辑地址
段表
- 记录各个段的存放位置,类似于页表
- 每一条表项称为段表项
- 页表项没有记录页长,因为都是定长;段表项有段长,因为每个段长度不等;
- 基址表示几号端在内存中的起始地址
- 整个段表项是定长的,因此段号也是隐含的,段表中不需要记录段号
- 如何确定一个段表项的位数,看图中解释
地址变换
- 过程与页表系统地址的转换大致相同
- 段表系统需要在第四步,检查段内地址是否超过段长,因为段长不是定长,这是段表系统与页表系统的主要区别
- 分页系统不需要对页内偏移地址检查是否超过最大长度,分页最大长度都是固定的
分段和分页管理的对比
- 选择题常考,一维,二维
- 分段比分页更容易实现信息的共享和保护
分段比分页更容易实现信息的共享和保护
分段和分页管理的访存次数
- 与单页表系统的访存次数一样,都是两次
- 分段系统也可以引入快表机构
知识点小结
- 分页与分段管理的对比容易出题
段页式管理方式
分页,分段的优缺点分析
分段+分页=段页式管理
- 先分段,再分页
段页式管理的逻辑地址结构
- 分段对用户可见,分页对用户不可见
- 因此,段页式管理的地址结构是二维的。对用户而言,像分段管理一样提供段号和段内地址信息即可。
段表,页表
- 段表中每个段表项是长度相同的
- 根据段号,查对应的段表项,段表项里记录了这个段对应的页表在哪个内存块上
- 根据上面的内存块号,找到某一段对应的页表
- 根据页表中也页号,找到对应的页表项,某一段某一页在哪个内存块上,
- 内存块号+页内偏移=物理地址
- 因此,一个进程有一个段表,段表里有几个段表项,就会对应几个页表
段页式管理的地址转换过程
- 两次检查
- 第一次越界检查:段号是否超过段表寄存器中的段表长度
- 第二次越界检查:页号是否超过段表项的页表长度
- 三次访存
- 第一次,访问段表
- 第二次,访问某一段对应的页表
- 第三次,访问最终目标的内存单元
- 可以引入快表机构,用段号和页号作为查询快表的关键字,如果命中,仅需一次访存
知识点小结
虚拟内存的基本概念
虚拟内存技术是基于高速缓存技术的发展
传统存储管理方式的特征,缺点
- 一次性,驻留性
- 用虚拟内存技术解决,虚拟内存技术基于局部性原理提出的
局部性原理
虚拟内存的定义和特征
- 多次性和对换性,刚好对应了传统方案的一次性和驻留性
如何实现虚拟内存技术
- 虚拟内存技术建立在离散分配基础上
- 后面小结采用请求分页存储管理进行说明
知识点小结
请求分页管理方式
页表机制
- 请求分页的页表比基本分页的页表多了几个字段
- 个人理解:从这几个增加的字段可以推测,分页存储的页表应该是包含了当前进程所需要的全部页表项
缺页中断机构
- 页面不在内存,缺页中断,进程阻塞,调页完成,唤醒进程
- 内存有空闲块,为进程分配空闲块,装入页面到内存块,修改页表项
- 内存没有空闲块,页面置换算法淘汰页面,如果被淘汰的页面修改过,则将页面写回外存,未被修改,不用写回外存,被淘汰的页面的页表项也要修改
- 个人理解:从图中可以看出,如果页面不在内存,则页表中对应的页表项只有外存地址有数据,其他字段都是清空的
缺页中断机构
- 缺页中断属于内中断,故障
- 有了缺页中断才能实现请求调页
地址变换机构
- 比基本分页存储管理多做了一些事情
- 1.查找页面时,需要对页面是否在内存进行判断(看页表项状态位)
- 2.需要调页,但是没有空闲内存块,需要页面置换,换出页面,腾出空间
- 3.页面调入,调出,被访问,都需要修改对应页表项
地址变换过程
- 同样检查页号是否越界,查快表是否命中
- 查慢表的时候,如果页面不在内存,则缺页中断,等等;当然也要根据情况的不同,对页表项进行修改
- 关于快表
- 进程的页表项应该是完整的,包含了所需的全部页表项
- 快表中的包含的是页表项中的一部分
- 如果页面被调出内存,那么快表中的快表项也应该被删除,(都调出了,意味着近期可能不需要了)
- 如果快表项被删除,也要修改对应页表项,
王道书上的插图
- 红框,补充细节
知识点小结
- 中断在理解,不需要死记硬别
- 重点关注与基本分页不同的地方
页面置换算法
最佳置换算法
- 举例说明
- 如图,箭头所指,需要访问3页面,此时内存块有201页面,因此需要置换
- 内存块中的已有的201,其中0和2接下来都会访问,只有1是距离最远将要访问的,因此换1
- 可以保证最低缺页率,但是是理想化的,因为操作系统无法预判页面访问序列,实际应用无法实现
先进先出置换算法
- 按照顺序给调入内存的页面排成一个队列,换出页面时,选队头换出;队列的最大长度取决于系统为进程分配了多少内存块
- 举例说明
- 如图,箭头将要访问0页面,此时队列内存块有321页面,队列为3-2-1,把队头3换成0号页面,同时调整队列,3出队,0入队
先进先出置换算法问题
- 存在贝拉迪异常,只有先进先出算法才会产生贝拉迪异常
- 实现简单,但是,先进入的页面也可能被经常访问,因此,算法性能最差
最近最久未使用置换算法
- 需要检查页表项的访问字段,可以反映最近多久没有被使用
- 举例说明(手算思路)
- 如图,箭头所指,访问3号页面,内存块中没有,需要置换
- 此时的内存块为1872,从3往前推,812分别出现了,因此相当于7是最近最久没有使用的,因此,用3号页面置换7号页面
- 性能最接近最佳置换算法的,但是需要硬件支持,实现困难,开销大
时钟置换算法
- 性能和开销比较均衡的算法,又称为最近未用算法
- 需要检查页表项中的访问为,1表示最近被访问过,0表示最近没有别访问过
- 内存中的页面通过链接指针形成一个循环队列,需要置换时就循环扫描检查
- 遇到访问位为1,就变为0,扫描下一个;遇到为0的,就置换这个页面
- 如果所有页面访问都是1,就是都变为0,在扫描一轮,遇到0则置换
- 简单时钟算法举例
- 如图,需要访问6,此时队列中的所有页面访问为都为1,
- 全部变为0,再扫描,遇到1号页为0,则6号页置换1号页,同时指针指向下一个页面(以备需要置换的时候继续扫)
- 6号后面的3和4内存块里都有,不需要置换,但是被访问了,访问位需要变为1
- 访问最后的7号时,需要继续扫描并置换,3和4的访问位为1,因此扫描过以后变为0
- 扫描到2号页时,访问位为0,7号替换2号页,同时7号页标记为访问1,指针指向下一个(5号页)
改进型的时钟置换算法
- 除了考虑最近是否被访问过,还要考虑页面是否被修改过,需要访问位,修改位
- 被修改过,以为这淘汰时,要执行I/O写回外存,增加系统开销
- 为了提高性能,其他条件相同时,优先淘汰没有被修改的页面
- 算法规则
- 访问位为0是优先级最高的,其次是修改位为0,
- 仔细看图中的每轮扫描,仔细阅读,不难理解,四轮足以找到可以置换的页面
知识点小结
- 重要知识点,理解算法规则
- 出题时,给序列,能手算模拟算法过程;各个算法的优缺点考选择题
页面分配策略
页面分配,置换策略
- 驻留集的定义,大小的选取
- 局部置换,全局置换
- 全局置换和固定分配不可能同时存在,全局置换意味着所有进程的页面都可能被置换,则进程的物理块数发生改变,也就不可能固定分配了
三种组合
- 第一种,不好把握进程分配多少物理块
- 第二种,只要缺页,进程就会获得新的物理块,可能是操作系统给的空闲的,也可能是抢来的,但是会导致一个进程物理块数增加,另一个进程物理块数减少,也不太合理
- 第三种,比较合理,只能置换自己的物理块,而且可以根据缺页率,动态调整物理块数
何时调入页面
- 预调页策略,用于进程首次调入,运行前就调入,成功率不高,不好预测
- 请求调页策略,我们之前一直学的就是这个,运行时调入,进程运行期间发现缺页则调入,一次只能调一页,I/O开销大
- 实际中,二者经常结合使用
从何处调入页面
- 外存分,对换区,文件区
- 对换方案:对换区足够时,对换区空间不足时,
抖动(颠簸现象)
- 刚换入的马上要换出,刚换出的马上要换入,
- 原因在于分配给进程的物理块数量不够
工作集
- 区分工作集和驻留集的概念
- 操作系统根据窗口尺寸,算出工作集,根据当前访问的页面往前画出窗口大小个访问的页面
- 工作集大小可能小于窗口,因为一个窗口可能由页面被重复访问,局部性越好,工作集就会比窗口小的更多
- 驻留集大小一般不能小于工作集,否则导致进程运行频繁缺页,产生抖动
知识点小结
- 系统为某进程分配了n个物理块,也可以表述为某进程的驻留集大小为n
- 三种分配置换策略真题考察过,如果大题中给出某一个分配置换策略,要知道背后的隐含信息
- 主要以选择题考察为主
内存映射文件
传统的而文件访问方式
- 文件分成多个部分,保存在各个磁盘块上
- 程序员需要使用系统调用,打开文件,指定读写指针移到哪个位置,读或者写
- 需要读的数据会被读入内存,接下来,读或者写,如果是写指令,这个块数据会被写回磁盘块
- 这样的操作很麻烦
内存映射文件(方便程序员访问)
- 系统调用打开文件
- mmap系统调用,将文件映射到进程的虚拟地址空间,给程序员返回一个 虚拟地址空间里对应的起始地址
- 接下来用访问内存的方式,访问文件数据,
- 期初,操作系统只是建立了文件数据和内存的映射关系,数据并没有读入到内存
- 当需要虚拟地址访问某一部分数据时,操作系统发现没有数据,就会出现缺页异常,操作系统自动将数据读入内存
- 程序员无需执行前面的read和write指令
- 如果程序员对虚拟地址空间里的文件修改,关闭文件时,操作系统自动将被修改的数据写回磁盘
内存映射文件(方便多个进程共享同一文件)
- 多个进程想要访问同一个文件,操作系统把这些进程的虚拟地址映射到同一个物理地址上,(其实就是修改页表)
- 相当于两个进程共享同一个文件数据
知识点小结
第四章 文件管理
初识文件管理
文件属性
- 文件名:方便用户找,同一目录不能文件重名
- 标识符:系统内文件的唯一标识,对用户来说无可读性
- 类型:指明类型,操作系统可以根据文件类型设置默认的打开方式
- 位置:文件存放路径(用户使用),外存中的地址(操作系统使用)
- 大小:文件大小
- 创建时间,上次修改时间,文件所有者信息
- 保护信息:
文件内部的数据怎样组织起来
- 无结构文件,有结构文件
文件之间怎样组织起来
操作系统向上层提供哪些功能
从上往下看,文件如何存放在外存
- 外存由一个个存储单元组成,一个存储单元对应一个物理地址
- 外存也分磁盘块,磁盘块大小一般为2的整数次幂
- 文件的逻辑地址也分成逻辑块号+块内地址
- 操作系统以块为单位分配存储空间
其他需要由操作系统实现的文件管理功能
知识点小结
文件的逻辑结构
无结构文件
有结构文件
- 又称记录式文件
- 可以有数据项作为关键字
- 每条记录有若干个数据项
- 定长记录,可变长记录;
顺序文件
- 顺序文件相当于线性表,顺序存储相当于顺序表,链式存储相当于链表
顺序文件的串结构增删相对简单些,没有关键字和顺序有关,只需把新增记录插到末尾即可
索引文件
- 顺序文件要想实现随机存取,必须采用顺序存储,定长记录,不太方便
- 索引文件解决了问题,索引表的记录是定长的,索引表可以实现随机存取,找到索引记录,再找对应的物理存放位置
- 一个文件可以根据不同的数据项建立多个索引表
索引顺序文件
- 索引文件一条记录对应一个索引记录,太浪费空间
- 索引顺序文件,将逻辑文件归类,索引表中只记录一个分组的地址信息
- 索引顺序文件的索引表中的索引项也不需要按关键字排列,方便增删操作
- 相当于分两次查找,索引表查找一次,逻辑文件的某一分组中查找一次
- 索引文件中的索引表,相当于一个定长的串结构的顺序文件
索引顺序文件检索举例
多级索引顺序文件
- 如果索引表记录仍然很多,可以对索引表记录再分组提取更高一级索引表,原理类似
知识点小结
文件目录
文件控制块
- 打开并访问目录就是在访问目录文件
- 打开当前目录下的文件或目录就是访问对应的文件或目录文件
- 操作系统根据目录我们选择文件名,查当前目录文件下的目录项(根据文件名),找到外存物理地址,调入文件或目录文件
- 目录文件的一条记录也称为文件控制块FCB,一个FCB就是一个文件目录项
- FCB最重要的就是文件名,文件存放的物理地址,
需要对文件目录进行哪些操作
单级目录结构
两级目录结构
多级目录结构
- 绝对路径:从根目录出发,每一层目录都需要一次读磁盘I/O操作
- 相对路径:从当前路径出发,每一层目录都需要依次读磁盘操作I/O,当前目录这几层不算
- 引入相对路径后,磁盘I/O次数减少了,提高访问文件效率
- 个人理解:不能说相对路径的读磁盘次数一定少了,关键还是要看哪一种方式的访问层级更少吧??
树形结构不便于实现文件共享
- 选择题经常出
无环图目录结构
- 多个用户的不同目录指向同一个文件,表示这个文件是共享的
- 删除操作:用户删除自己目录下的共享文件,只会删除该用户的PCB,让共享计数器-1,不会直接删除共享节点,当共享计数器变为0时,才会真正删除节点
- 共享文件是同一个文件,复制文件是得到了一个新的文件
索引节点(FCB改进)
- 为了提高查找效率,减少磁盘I/O次数,给目录表瘦身
- 一个目录项只存放文件名,索引节点指针,指针指向索引节点,保存着其文件名以外的其他信息
- 查找时只检索目录表,找到FCB之后再进一步读取指针指向的索引节点
- 这样一个磁盘块可以存放更多的FCB,降低读磁盘块的次数
- 外存索引节点,内存索引节点(增加一些信息)
知识点小结
- 本小结很重要,容易出小题考察
文件的物理结构(文件分配方式)
本节十分重要,历年都出题
文件块,磁盘块
- 很多操作系统将磁盘块的大小与内存块,页面的大小相同,方便数据交换
文件块,磁盘块
- 文件的逻辑地址空间也被分成一个一个的文件块
- 操作系统为文件分配存储空间以块为单位
- 用户提供逻辑地址,操作系统负责逻辑地址映射到物理地址
文件分配方式–连续分配
- 文件在磁盘上占有一组连续的块
- 物理块号=起始块号+逻辑块号,当然也要检查用户提供的逻辑块号是否超过文件的长度
- 连续分配支持顺序访问,随机访问
连续分配的优缺点
文件分配方式–链接分配
- 离散分配的方式,为文件分配离散的磁盘块
- 分隐式链接和显示连接
隐式链接
- 目录项中包含起始块号,结束块号
- 只支持顺序访问,不支持随机访问,查找效率低,每个块内需要分配空间保存下一个块的指针
显示链接
- 目录项中只需记录起始块号
- 准备一个FAT分配表,记录一个物理块的下一个块是几号
- 一个磁盘只需要一个FAT,记录磁盘所有磁盘块链接信息,FAT的表项是连续存储,长度相同,因此物理块号是隐含的
- 开机时,FAT读入内存,常驻内存
显示链接
- 地址转换过程,目录向起始块号,查内存中FAT,找到对应的起始物理块号
- 块号转换不需要访问磁盘,比隐式链接的访问速度快得多
- 一个磁盘对应一个FAT,开机就加载到内存
链接分配总结
- 考试中只说链接分配,默认为隐式链接
文件的物理结构(文件分配方式)
索引分配
- 索引表功能有点像页表
- 存放索引表的磁盘块叫索引块,存放数据的磁盘块叫数据块
- 每个文件都有自己对应的索引表
- 索引表表项可以定长,因此索引表中逻辑块号可以隐含
索引分配,地址的转换
- 支持随机访问,文件拓展容易实现
索引分配–链接方案
- 索引表太大,一个索引快装不下,可以用多个索引快存放,索引块之间链接起来
- 如果,要访问的物理块在第二索引表里,必须先访问第一个索引快,通过指针访问第二个索引快,再根据表项访问数据
- 如果,文件太大,索引块太多,读磁盘次数会非常多,操作会变得低效
索引分配–多层索引
- 类似于多级页表,建立多层索引表
- 多层索引分配中的索引表,大小不能超过一个磁盘块
- 根据需求建立二层,三层,四层索引块
- n层索引分配方式,访问目标数据块需要n+1次磁盘I/O,顶级索引表没有调入内存
- 缺点,如果遇到了小文件,也要好几层索引读磁盘
索引分配–混合索引
- 一个顶级索引表,既有直接地址索引,又有一级间接索引,还有两级间接索引
- 8+256+256*256=65800
- 对于小文件可以降低读磁盘次数
知识点小结
- 根据顶级索引表结构计算文件的最大长度,考试中很常见
- 红色字,重要考点!重要考点!
逻辑结构和物理结构
无结构文件举例
逻辑结构(从用户视角看)
物理结构(从操作系统视角看)
C语言创建顺序文件举例
物理结构(从操作系统视角看)
懵逼点:顺序文件采用顺序存储/链式存储
- 用户自己决定顺序还是链式,用户视角觉得就是占用连续的地址空间
链式存储的顺序文件采用连续分配
- 操作系统可以选择连续分配,也可以选择链接分配,
逻辑结构:所以文件
索引文件采用索引分配
知识点小结
- 个人理解:
- 逻辑结构里的,无结构,有结构,顺序文件(顺序存储,链式存储),索引文件,索引顺序文件是给用户使用的
- 物理结构里的,连续分配,链接分配,索引分配,是给操作系统用的
- 二者各玩各的,各自做好自己的事情,用户选好了逻辑结构,至于操作系统选什么分配方式(逻辑转物理),那是操作系统的事情,用户无法知道,也没必要知道
- 用户再怎么选择逻辑层面的文件结构,到了操作系统这里,都是一堆二进制数据,都要按照磁盘块的大小进行拆分,然后选择分配方式,二者不是一个层面的东西
文件存储空间管理
存储空间的划分与初始化
- 磁盘分区,一个物理磁盘划分为多个逻辑磁盘
- 一个磁盘分区包含目录区,文件区
- 目录区保存文件目录相关信息,比如,FCB,索引节点,磁盘管理信息(空闲表,位示图)
- 文件区存放普通数据
- 多个物理磁盘也可以合成一个逻辑磁盘,文件卷
空闲表法
- 类似于内存管理的动态分区分配的空闲表
- 空闲盘块表记录每个空闲的起始位置,空闲盘块数量
- 适用于文件物理结构为连续分配方式的场景
- 如何分配磁盘块
- 与内存管理动态分区分配类似,可采取首次适应,最佳适应,最坏适应
- 分配空闲磁盘块以后,修改对应表项
- 回收时需要注意表项合并问题,与内存的套路一样
空闲链表法
- 空闲盘块链,空闲盘区链
空闲盘块链
空闲盘区链
位示图法
- 考试最常考的方法,如何根据字号位号求出盘块号,或者根据盘块号求出字号位号,注意到底是从0开始的还是从1开始的
- 本例中,从0开始的,n表示字长,则(i,j)的二进制位对应盘块号b=ni+j
- 王道书上是以1开头的,注意区分
- 用矩阵的方式描述每个盘块的情况
- 矩阵横向一般就是一个字,本例中一个字长16位,则横向16位
- 矩阵的纵向有若干个连续的字
- 用每一个位,对应一个磁盘块的情况,比如0为空闲,1为已分配
- 用(字号,位号)或者叫(行号,列号)定位一个磁盘块号
位示图如何进行磁盘分配和回收
- 分配:顺序扫描位示图,找到满足条件的位,算出对应的盘块号,将对应磁盘块分配给文件,修改位示图
- 回收:根据回收的盘块号求出对应的字号位号,修改位示图
- 连续分配离散分配都适用
成组链接法
- 适合于大型文件系统,UNIX系统采用了此法
- 不太好理解,不好用文字描述,也不是考试重点,不大可能出题
- 本人看了一遍视频也是一脸蒙,感觉咸鱼的配图和讲解稀里糊涂的,先不看了,以后有时间再说
知识点小结
文件的基本操作
创建文件
删除文件
打开文件
- 很多操作系统对文件进行操作之前,需要进行打开操作
- 将目录项复制到内存中的打开文件表中,这么做可以大幅提高文件的访问速度
打开文件表
- 系统打开文件表,
- 只有一张,记录全部的打开文件信息,打开计数器记录了有多少进程正在打开这个文件
- 用户进程的打开文件表,
- 记录了进程自己打开的文件信息,通过系统表索引号指向系统打开文件表对应的表项
- 读写指针记录进程对文件操作进行到的位置
- 标明进程对这个文件操作的权限
- 个人理解:打开文件是系统和进程要对文件进行操作,因此需要登记信息,并不是真正的操作文件,真正的操作文件当完成了打开文件后,进程开始对文件进行读写的操作
关闭文件
- 进程删除自己的表项,回收内存空间等资源
- 系统的打开文件表项计数器-1,如果显示计数器变为0,说明没有进程在打开文件,系统也删除这个表项
读文件
- 先进行打开文件的操作,才能对文件执行读操作
- 进程想要读文件,也是需要调用操作系统的读命令
写文件
- 我们在记事本应用程序中编辑好新的内容,点击保存,调用操作系统写的命令
- 也要先对文件执行了打开文件的操作,这里都能编辑了,肯定是已经代开了,不再赘述
知识点小结
- 打开文件操作不会把文件数据直接读入内存,只是复制了文件的目录项,索引号返回给用户
- 索引号也成文件描述符
- 读文件操作才会把文件数据读入到内存
- 写操作不需要提供文件名,只需要文件描述符
- 打开文件和读文件最容易出选择题
文件共享
基于索引节点的共享方式(硬链接)
- 使用索引节点
- 用户目录中,文件名对应索引节点指针,索引节点存放文件物理地址
- 多个用户的用户目录项指向同一个索引节点,这个文件就是共享的
- 索引节点中记录被链接的次数,一个用户删除目录项,索引节点计数-1,只有计数为0时,才真正删除共享文件
基于符号链的共享方式(软链接)
- 图中的user3中的ccc文件就是采用了软链接
- ccc文件名在目录项对应索引节点指针,指向的文件物理地址,这个文件是一个link类型文件,文件内存放了user1的aaa文件逻辑存放路径,最终找到文件本体
- 原理类似windows的快捷方式
- link类型的文件名可以不同,因为文件里保存的路径才决定了如何找到目标文件
- 如果aaa文件的目录项被删除,即使bbb没有被删除,目标文件本体还在,ccc文件也将找不到目标文件,指针悬空
- 软链接方式增加了查询目录的次数,查找效率会降低
知识点小结
文件保护
口令保护
- 用户访问文件需要输入口令,操作系统将用户输入的口令与FCB中保存的口令进行对比,正确才能访问
- 开销比较小,方便,速度快
- 正确的口令保存在系统内部,不安全
加密保护
- 系统使用密码对文件进行加密,只有用户访问时提供正确的密码,才能通过解密算法对文件进行解密
- 保密性强,系统中无需保存密码,加密解密需要一定时间
访问控制
- 给每个文件的FCB增加一个访问控制表,记录了哪些用户可以进行哪些操作
- 如果用户过多,访问控制表项也会数量增多
- 改进,将用户分为不同的组,不同的组可以对文件执行不同的操作
- 想要改变用户的访问权限,只需要把用户放到对应的分组即可
windows的访问控制
- 如果对一个文件进行访问控制,那么这个文件及内部的所有文件都会改为这个类型的访问控制
知识点小结
文件系统的层次结构
408不要求考察本节内容,仅作为理解
文件系统的层次结构
- 用户接口:对应文件基本操作小节
- 文件目录系统:对应文件目录小节
- 存取控制模块:对应文件保护小节
- 逻辑文件系统与文件信息缓冲区:对应文件逻辑结构小节
- 物理文件系统:对应文件物理结构小节
- 辅助分配模块:对应文件存储空间管理小节
- 设备管理模块:对应磁盘管理小节
知识点小结
- 举例说明
文件系统的全局结构(布局)
新考点
低级格式化
- 原始磁盘生产出来后,先低级格式化(物理格式化),
- 将磁盘划分为一个个扇区,检测坏扇区
- 如果有坏扇区,则用备用扇区顶替
- 坏扇区对操作系统是透明的,即操作系统是无感的。操作系统访问这个扇区时,磁盘驱动器会悄悄用备用扇区替代
高级格式化
- 又叫逻辑格式化,把磁盘分区(卷),通过分区表记录每个分区的大小和地址
- 每个分区建立各自独立的文件系统
- 图中的C盘既有超级快,又有位示图。二者的功能是有一定重合的。但超级快更适合查找若干个空闲块,位示图更适合查找特定的一个磁盘块是否空闲
- i节点就是我们说的索引节点,每个文件都有对应的索引节点;Unix中的索引节点都是连续存放在i结点取的,每个索引节点大小相等,支持随机访问
- 完成高级格式化,灰色部分就有实际数据了,后序再有操作,会在白色继续填充数据
文件系统在内存中的结构
- 目录的缓存保存了最近访问过的目录,这样可以降低磁盘I/O的次数
- 系统打开文件表,整个系统只有一个;进程打开文件表,每个进程只有一个,存放在进程PCB中;
- 执行打开文件过程(绿色文字)
- 进程打开文件表中无需存放文件的FCB,而是保存索引,通过索引指向系统打开文件表中的对应表项,里面就有对应的FCB
- 操作系统返回文件描述符,相当于一个指向进程打开文件表的指针,
- 接下来的操作将通过文件描述符找到文件并操作
- 对文件执行read操作(红色流程)
虚拟文件系统,文件系统挂载
普通的文件系统
- 不同的文件系统向上层提供了不同的函数调用接口,不利于上层用户的开发使用
虚拟文件系统
- 用户进程只需要调用虚拟文件系统的函数接口即可
- 虚拟文件系统的特点
存在的问题
- 不同的文件系统,表示文件数据结构不同,打开文件后,其在内存中的表示就不同
- 为了解决这样的问题,虚拟文件系统使用vnode统一的数据结构来存放各种文件系统的加载数据
- 虚拟文件系统打开文件系统,现在内存加载这个文件系统的数据,在复制一份到虚拟文件系统vnode上
- 注意区分vnode与inode
函数功能指针
- vnode中有函数功能指针,指向对应的具体文件系统的函数功能
文件系统的挂载(mounting)
- 又称文件系统的安装,装载,
- 比如U盘插到电脑上,就完成文件系统的挂载
- 使用macos系统的应该知道,如果外接的移动硬盘跟自己电脑上硬盘文件系统不一致的,插上也不能正常使用,因此我们经常会使用一个叫做mount的软件,用来正常使用不同文件系统的硬盘
磁盘的结构
磁盘,磁道,扇区
如何在磁盘中读写数据
盘面,柱面,磁盘物理地址
磁盘的分类
知识点小结
磁盘调度算法
高频考点
一次磁盘读写操作需要的时间
- 寻道时间,延迟时间,传输时间
- 延迟时间和传输时间都和磁盘转速有关,操作系统无法优化
- 操作系统可以优化寻道时间,采用不同的寻道算法
先来先服务(FCFS)
最短寻找时间优先(SSTF)
扫描算法(SCAN)
- 磁头必须到到最边上才能调头
- 对各磁道响应频率不平均,边缘的磁道可能很快就有响应,中间的响应时间略长一些
- 因此扫描算法需要改进
LOOK调度算法
- 针对扫描算第一个问题的改进
- 磁头不用必须移动到边上了
- 如果磁头的移动方向上没有新的访问请求了,就可以立即改变磁头移动方向
循环扫描算法(C-SCAN)
- 针对扫描算法的第二个问题的改进
- 磁头只能在磁道号增大的的方向上扫描,到达一端后,重新移动到开头重新扫
C-LOOK调度算法
- 基于C-SCAN的优化,磁头无需一定要移动到两个边缘的磁道上
知识点小结
减少延迟时间的方法
前情回顾
- 读完一个扇区,磁头需要时间处理数据,来不及立刻读下一个扇区,
- 如果逻辑上连续的扇区,物理上也连续,磁头就不得不等下一圈才能读下一个扇区,增加了延迟时间
减少延迟时间的方法–交替编号
- 逻辑上连续的扇区在物理上有间隔,形成交替编号的形态
- 留出处理数据的时间,减少了延迟时间
减少延迟时间的方法–优化磁盘地址结构的设计
- 如果磁盘物理地址是(盘面号,柱面号,扇区号)
- 连续读取物理地址的时候,扇区号读满,需要切换下一个柱面(磁道),一个盘面的各个柱面读满,切换盘面,再重复前面
- 结果,每读完一个盘面上的柱面,就要移动磁头,切换磁道,磁头移动过于频繁
- 如果磁盘物理地址是(柱面号,盘面号,扇区号)
- 连续读取物理地址的时候,扇区号读满,切换到下一个盘面的同一个柱面上,无需移动磁头臂,只需要切换激活对应磁头即可
- 结果,如果有三个盘面,则读完三个盘面同一柱面,才移动磁头,切换磁道,减少磁头移动次数
减少延迟时间的方法–错位命名
- 基于上面优化磁盘地址结构的设计,一个盘面上的柱面读满,需要读取下一个盘面上的柱面
- 如果前一个磁盘块和下一个磁盘块在相对位置上是紧挨着,磁头需要处理时间,还是要等磁盘转一圈,才能读取下一个磁盘块
- 如果二者错位命名,给磁头留出时间处理,则可以不用等再转一圈,接着读下一个磁盘块
- 本质上可以第一点的交替编号是一个原理
知识点小结
磁盘的管理
理解,有印象,可以应对选择题即可
磁盘初始化
- 数据区域就是我们能看到的磁盘空间大小
引导块
- 计算机开机需要执行初始化程序,初始化程序放在ROM中
- 但是这样导致后续不方便修改更新
- 解决办法:现代计算机,ROM只存放很小的自举装入程序,完整的自举程序放在磁盘的启动块上,
- 拥有启动分区的磁盘成为启动磁盘或系统磁盘
坏块管理
知识点小结
固态硬盘SSD
新增考点
- 固态硬盘与机械硬盘的特点对比,磨损均衡技术,是考纲明确要求的
固态硬盘里读写以页为单位,对应了机械硬盘里的一个磁盘块