William Stallings 计算机组成与结构(第8版) 第八章 操作系统支持
操作系统的目标与功能 便利性 使计算机使用起来更方便 效率 允许计算机系统的资源以有效的方式使用
计算机系统的层次结构
操作系统提供的主要服务 程序创建 程序执行 访问I/O设备 文件访问控制 系统访问 错误检查和响应 审计
操作系统作为资源管理器
操作系统的类型 交互式 批处理 单任务 多任务
早期的系统 20世纪40年代末到50年代中期 没有操作系统 程序员直接与计算机硬件交互 两个主要问题 : 调度 安装时间
简单的批处理系统 常驻监控程序 用户向操作员提交任务 操作员把任务成批的放在一起 监控程序按顺序执行这些任务 当前任务完成后,控制权交回给监控程序以读入下一个作业 监控程序负责调度
常驻监控程序的内存分布
任务控制语言 提供给监控程序的一种特殊的程序设计语言 起始符通常用“$”表示 例 $JOB $FTN ... Some Fortran instructions $LOAD $RUN ... Some data $END
需要的硬件支持 内存保护 定时器 特权指令 中断 保护监控程序 防止一个任务垄断系统资源 只能被监控程序执行 例如I/O指令 使得操作系统可以中止任务重获控制权
多道程序批处理系统 I/O设备的速度比处理器要慢 当一个作业需等待I/O时,处理器可以转去处理另一个作业,而不必等待I/O
单道程序
有2个程序的多道程序
有3个程序的多道程序
资源利用率
多道程序技术允许多个用户与计算机进行交互 分时系统 允许用户与计算机直接交互 即交互式 多道程序技术允许多个用户与计算机进行交互
调度 多道程序的关键 长期调度 中期调度 短期调度 I/O调度
长期调度 确定哪些程序提交给系统处理 控制多道程序设计的深度(内存中的进程数) 一旦提交,作业或用户程序就成为进程,并加入到短期调度的队列中 在某些系统中,新建的进程处于换出状态,此时,它们会加入到中期调度的队列中
中期调度 交换(swapping)功能的一部分 通常基于管理多道程序的需要 在没有虚拟存储的系统中,存储管理也是一个问题
短期调度 派遣程序 细粒度地判定接下来运行哪个作业 即:下一个时间片由哪一个进程来使用CPU
进程状态模型
进程控制块 标识符 状态 优先级 程序计数器 存储器指针 现场数据 I/O状态信息 统计信息
进程控制块框图
调度示例
操作系统的要素
进程调度
存储器管理 单道程序设计系统 多道程序设计系统 主存划分成两大部分 一部分分配给操作系统(常驻监控程序) 另一部分分配给当前正在执行的程序 存储器的“用户”存储区须进一步细分供多个进程使用
问题:处理器速度比I/O快得多,即使在多道程序设计中,处理器仍可能有许多时间处理空闲状态 解决方案: 交换 问题:处理器速度比I/O快得多,即使在多道程序设计中,处理器仍可能有许多时间处理空闲状态 解决方案: 扩大主存 昂贵 更大的程序 交换
当主存有空间时,进程被调入(每次调入一个) 当进程完成时,移出主存 存储器中无进程处于就绪状态(例如,所有进程都在等待I/O操作) 什么是交换? 进程请求的长期队列,通常存储在磁盘上 当主存有空间时,进程被调入(每次调入一个) 当进程完成时,移出主存 存储器中无进程处于就绪状态(例如,所有进程都在等待I/O操作) 把这些进程中的一个调回磁盘,排入中间队列 从中间队列中调入另一个进程,或处理长期队列中的一个新进程请求,并执行新到达的进程 然而,交换是一种I/O操作 …
交换
把主存分块以容纳多个进程(包括操作系统) 固定长度分区 每个分区的长度可以不相等 当一个进程调入主存时,分配给它一个能容纳它的最小的分区 浪费了主存 更有效的方法是使用变长分区
固定分区举例
当一个进程调入主存时,分配的分区大小可以与进程所需的大小一样,一点也不多 变长分区 (1) 当一个进程调入主存时,分配的分区大小可以与进程所需的大小一样,一点也不多 多个进程调入主存,最后导致主存末尾出现一小块空间,太小以至于无法被任何进程所用 只有一个小洞,浪费不多 当所有进程阻塞时,换出一个进程,换入另一个进程 新进程也许比换出的进程更小 另一个(主存)洞出现了
最后将导致在存储器中出现许多小的空块 (主存碎片化) 解决方案: 变长分区 (2) 最后将导致在存储器中出现许多小的空块 (主存碎片化) 解决方案: 紧缩 - 操作系统一次又一次地移动存储器中的进程,把所有空闲块放置在一起,组成一个整块 (例如磁盘碎片整理)
变长分区的效果
无法保证一个进程每次换入时分配到与上次相同的位置 指令可以包含两种类型的存储器单元的地址 进程的位置迁移 无法保证一个进程每次换入时分配到与上次相同的位置 指令可以包含两种类型的存储器单元的地址 数据的地址 指令的地址,用于转移指令 逻辑地址 - 相对于程序起始单元的地址 物理地址 - 主存中的实际单元地址 (当前) 通过基地址自动转换
分页 把存储器分成相当小的、相等的固定长度的存储块 - 页帧 将每个进程也划分成小的固定长的程序块 - 页 为进程分配它所需要数量的页帧 空闲帧的列表由操作系统维护 进程不一定需要连续的页帧 用页表来记录进程所使用的页帧
空闲页帧的分配
分页情况下的逻辑地址与物理地址
虚拟存储器 按请求分页技术 页失效 没有必要将整个进程的所有页都装入主存 一个进程的每个页只有在需要时(即请求时)才调入 所需页不在内存里 操作系统将所请求的页换入内存 有可能需要换出一些页来腾出空间 基于最近的页访问历史来选择换出的页
抖动 进程太多内存太少 操作系统频繁的交换页,占用很多资源 很少资源能用于实际执行任务 硬盘灯常亮 解决方案 良好的页替换算法 减少活跃的进程数量 增加内存
按请求换页带来的好处 没有必要将整个进程装入主存 每个页只有在需要时(即请求时)才调入 因此,一个进程可能比主存所有的空间都大! 主存被称为实存储器 程序员或用户看到了一个大得多的存储器,它分配在磁盘上,称为虚拟存储器
倒置页表结构
每次虚拟存储器的访问能引起两次物理存储器的存取 快速重编址缓冲器(快表) 每次虚拟存储器的访问能引起两次物理存储器的存取 获得相应的页表项 获得所需的数据 用一个特殊的高速缓存来存放页表项 TLB
TLB 操作
TLB 和 CPU缓存 操作
分段 分页对程序员(通常)是不可见的 分段通常对程序员是可见的 通常,程序员或操作系统为程序和数据分配不同的段 可能有多个程序段和数据段
分段的优点 简化了对数据结构的处理 允许每段程序独立的修改和重编译,不需要整个程序重新连接和重装入 实现进程共享 实现段保护 有些系统通过硬件和操作系统同时支持分页和分段
硬件同时支持分段和分页方式存储 Pentium II 不分段不分页 分页不分段 分段不分页 分段分页 虚拟地址和物理地址相同 低复杂性 高性能 分页不分段 存储器被看成是分页的线性地址空间 存储器的保护和管理通过分页实现 例如:Berkeley UNIX 分段不分页 存储器被看成逻辑地址空间的集合 可以提供低至字节级的保护机制 可以保证当段在存储器中时,需要的转换表(段表)在芯片上 分段分页 分段用于存储器逻辑分区 分页用于逻辑分区的物理再分 例如:Unix System V
Pentium II 地址转换机制
每个虚拟地址(在Pentium II中称为逻辑地址)由16位段号和32位偏移量组成 2位用于保护机制 余下的14位表示一个具体的段 无分段的存储器,用户的虚拟存储空间是232=4GB 有分段的存储器中,用户总的虚拟存储空间为246=64TB 虚拟存储器容量实际上能大于64TB 一半(8K段×4GB)是全局的 另一半是局部的,每个进程都不同
Pentium II保护机制 2比特的保护位提供了4级特权级 0特权级代表最高保护, 3特权级代表最低保护 不同软件可以定义不同的保护程度 许多系统中,应用处在第3级, 特权级1常用于操作系统, 特权级0用于系统核心(特权级2不用) 特权级2可能被用于需要实现自己的安全机制的某些特殊的应用子系统, 例如:数据库 一些指令(如处理存储管理寄存器的指令)只能在0级执行
Pentium II 分页 分段是一种可选特性,可以禁止 二级表的检索 程序中直接使用线性地址 第1级是页目录 包含1024个项 将4GB的线性存储空间分成1024个页组,每个页组长度为4MB 每个页表包含1024个项,每项对应一个4KB的页 所有进程共用一个页目录,或者每个进程一个页目录,或者两者的组合 当前任务的页目录总是在主存中,页表可以存储在虚拟存储器中 使用TLB(包含32个页表项) Pentium II的扩展(80386和80486没有)使得系统程序员可以定义页长度为4kB或者4MB
ARM存储器系统组织
ARM存储器管理 虚拟存储器地址转换 采用一级或二级表将虚拟地址转换成物理地址 快表 (TLB) 存储最近使用的页表项 如果将要调用的页表项在TLB中,则TLB直接将该页的物理地址发给主存用于读/写操作 处理器与主存之间的数据交换通过高速缓存进行 逻辑高速缓存 当高速缓存访问失效时, ARM直接提供地址给高速缓存同时也提供给TLB 物理高速缓存 TLB必须将物理地址提供给高速缓存 转换表中的项也包含存取控制位
虚拟存储器地址转换 基于分节或分页来支持存储器访问 超级节(可选) 节 大页 小页 节和超级节可以使用TLB中单个表项映射一大片主存区域 由主存的16MB块组成 节 由主存的1MB块组成 大页 由主存的64KB块组成 小页 由主存的4KB块组成 节和超级节可以使用TLB中单个表项映射一大片主存区域 额外的存取控制机制 将小页扩展到1KB的子页 将大页扩展到16KB的子页 保存在主存中的转换表有两级 第1级表包含节和超级节的转换地址,以及指向第2级表的指针 第2级表包含大页和小页的转换地址 存储器管理单元(MMU) 将处理器产生的虚拟地址转换为访问主存的物理地址 计算和检查存取许可位 在TLB不包含所请求地址的情况下工作 MMU先在第一级表中取转换地址 节映射存取只需要在第一级表中取转换地址 页映射存取还需要在第二级表中取转换地址
小页的ARM虚拟存储器地址转换框图
小页的ARM虚拟存储器地址转换 每个二级页表 32位的虚拟地址结构 类似的二页地址转换适用于大页 节和超级节只需查找L1页表 1个一级页表 4K个32位表项 每个L1表项指向一个二级(L2)页表 每个二级页表 255个32位表项 每个L2表项指向主存中一个大小为4KB的页 32位的虚拟地址结构 最高12位是指向L1页表的索引 接下来的8位指向相应的L2页表地址 最低的12位指向主存中相应页的一个字节 类似的二页地址转换适用于大页 节和超级节只需查找L1页表
ARMv6 存储器管理格式
ARM存储管理参数 访问允许(AP)位,访问允许扩展(APX)位 控制相应的存储器访问 如果访问没有得到允许,则会引起许可故障 可缓冲(B)位 和TEX位一起决定带高速缓存的存储器的写缓冲方式 可高速缓存(C)位 决定某一块存储区是否可以映射到高速缓存 域(Domain) 若干存储区的集合 存储控制可以域为单位进行 非全局(nG)位 决定某一地址转换为全局地址(0)或为进程内地址(1) 共享(S)位 决定某一地址转换是针对共享存储器(1)或是不共享存储器(0) SBZ位 应该为0 类型扩展(TEX)位 与B和C位一起控制高速缓存的读取控制 控制写缓存的使用方式 决定一个存储区域是否可共享 必须保障一致性 永不执行(XN)位 决定某一存储区是可执行的(0)还是不可执行的(1)
存储器管理格式 - L1页表 L1页表 每一个表项表示它与1MB的虚拟地址的映射关系 位[1:0] = 00 对应的虚拟地址没有被映射 试图存取时会产生地址转换错误 位[1:0] = 01 表项给出L2页表的物理地址 位[1:0] = 10 且 位19 = 0 表项表示的是对应虚拟地址的节映射 位[1:0] = 10 且 位19 = 1 表项表示的是对应虚拟地址的超级节映射 位[1:0] = 11 保留
二级页表: 小页和大页 对于分页的存储器结构 L1页表项的位[31:10]包含了一个指针指向一个L2页表 对于小页 L2页表项中包含一个20位的指针指向主存中一个4KB页的基地址 对于大页 虚拟地址结构中有12位指向L1页表、8位指向L2页表 对于64KB的大页,其虚拟地址的页索引部分必须是16位 4位页索引域与L2页表域重叠 L2页表中的每一个支持大页的页表项复制16次 如果所有的页表项都指向大页,那么L2页表中的页表项就从256个减少到了16个 L2页表能够支持大页和小页的混合,因此需要进行大页项的复制
一级页表:节和超级节 节 超级节 需要页表项的复制 物理地址范围可以通过8个额外的地址位进行扩展 节和超级节的存储器结构 只需要一级页表存取 L1页表项中的位[31:20]包含一个12位的指针, 指向主存中1MB节的基地址 超级节 L1页表项的位[31:24]包含一个8位的指针,指向主存中16MB节的基地址 需要页表项的复制 超级节结构中,虚拟地址的L1页表索引部分与虚拟地址的超级节索引部分有4位重叠 需要16个完全相同的L1页表项 物理地址范围可以通过8个额外的地址位进行扩展 位[23::20]和位[8:5] 扩展方式依赖于具体实现 这些额外位可以将物理地址扩展为28=256的倍数 对于每一个进程,可寻址的物理存储范围可以变成原来的256倍
访问控制 每块存储区都可以设置为不可访问、只读或者读写 每块存储区都可以设置为特权访问,即只有操作系统才可以访问,用户不可以访问 域 域是一批具有特殊访问权限的节和/或页 支持16个域 域特征允许多个进程使用同一个转换表而不会相互影响 每个页表项和TLB项都包含一个字段,用来指明该项是包含在哪个域中 域存取控制寄存器中一个2位的字段控制访问每个域 整个存储区域可以非常有效地换入和换出 域用户 必须观察构成该域每一节和每一页的存取允许 域管理员 控制域的行为 控制域包含哪些节和页, 以及域的访问控制 不受具体节和页访问控制设置的限制 一个程序可以是 某些域的客户 另外一些域的管理员 对剩下的域没有访问权限
阅读要求 第八章课文 Stallings, W. [2004] Operating Systems, Pearson出版社 大量有关操作系统的网站