蒲晓蓉_操作系统原理第3_1章_存储管理

上传人:305****881 文档编号:133490320 上传时间:2020-05-27 格式:PPT 页数:66 大小:153.50KB
返回 下载 相关 举报
蒲晓蓉_操作系统原理第3_1章_存储管理_第1页
第1页 / 共66页
蒲晓蓉_操作系统原理第3_1章_存储管理_第2页
第2页 / 共66页
蒲晓蓉_操作系统原理第3_1章_存储管理_第3页
第3页 / 共66页
蒲晓蓉_操作系统原理第3_1章_存储管理_第4页
第4页 / 共66页
蒲晓蓉_操作系统原理第3_1章_存储管理_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《蒲晓蓉_操作系统原理第3_1章_存储管理》由会员分享,可在线阅读,更多相关《蒲晓蓉_操作系统原理第3_1章_存储管理(66页珍藏版)》请在金锄头文库上搜索。

1、第三章存储管理 外存 本章要点 存储管理的任务内存划分与分配技术程序装入技术简单存储管理技术虚拟存储管理技术 3 1存储管理的任务 存储分配 基本任务 管理内存空间的分配与回收 1 分配基本内存空间 2 增加新的内存空间 动态申请或释放内存空间 3 回收内存空间 用于内存管理的数据结构 如位示图 空闲页框表等 记载哪些内存被分配给了哪个进程 哪些内存空间是空闲的等信息 若系统采用虚拟存储管理技术 还需要登记进程的程序和数据中 哪些部分在内存 哪些部分尚在外存等信息 这些数据结构自身需要占用一定的内存空间 也需要系统花费额外的时间进行维护 存储分配步骤 首先 根据系统的内存分配算法 在空闲的内存

2、分区中寻找到一块满足进程需要的内存空间 将其分配给进程 然后 更新进程的资源分配清单 内存分配情况清单等数据结构 内存的回收 更新相应的数据结构 将回收的内存空间标识为 空闲可用 就行了 该内存空间是否可以被回收 被其他进程共享 属于相应的进程 与相临的空闲空间进行合并 地址映射 逻辑地址 或相对地址 一般从0开始编址物理地址 或绝对地址 标识内存中的每个存储单元 逻辑地址 高级语言或汇编语言使用符号地址 变量名或标号源程序经过编译 链接以后 其中的符号地址就会变成数字式的逻辑地址 编译 链接程序会自动计算每一个变量或标号所对应的逻辑地址是多少 静态映射 静态重定位 地址映射 程序装入内存以后

3、 由操作系统将逻辑地址改为逻辑地址加上起始地址 得到实际的物理地址 重定位 Relocation 对目标程序中的指令和数据地址进行修改的过程 静态映射实现简单 地址变换只在程序装入时一次完成 程序运行时不再改变 但不适合多道程序系统 不允许系统执行内存的碎片整理 无法实现虚拟存储 动态映射 动态重定位 操作系统将程序装入内存以后 并不立即把目标程序中的逻辑地址转换为物理地址 而是在处理机执行每一条指令时进行地址转换 复杂且费时 为了系统效率 处理机中设置了专门的高速硬件 自动完成地址转换 这样的硬件被称作地址管理部件 如图3 2所示 存储保护 防止地址越界 防止操作越权 地址越界 进程访问不属

4、于自己的地址空间 或者说进程在运行时所产生的物理地址超越其自身的地址空间范围 可能侵犯其他用户进程空间 也可能侵犯操作系统的存储空间操作越权 进程对共享存储区的操作违反了系统规定的权限 存储保护的实现 存储保护只能进程执行过程中动态地进行 不可能在运行前一次性静态完成 若采用动态映射动态计算物理地址 可能计算出错误地址 若采用静态映射 进程执行过程中也可能出错 从而导致地址越界或操作越权 为了提高系统效率 存储保护的主要工作必须由高速的专用硬件来完成 在地址管理部件中 存储共享 为了进程通信和节约内存空间 两个或多个进程共用内存中相同的分区 即他们的物理空间有相交的部分 可以共享进程的代码 也

5、可以共享进程数据 一般地 进程之间共享代码的目的主要是为了节约存储空间 共享数据的目的主要是为了实现进程间相互通信 通过存储共享完成通信的过程 一个进程将数据写入共享存储区 另一个进程从共享存储区中读出数据 共享代码 程序可重入 设计程序时 逻辑上将程序代码区和数据区分开 代码区不包含运行程序时需要改变的数据 被处理的数据都放在独立的数据区 这样 进程执行过程中就不会改变代码部分的任何内容 数据区是单独的一个段 堆栈式动态申请的分区 或通过参数传递 共享代码 创建新进程时 不需要为该进程的代码部分另外申请内存空间 只需将该进程PCB中的进程代码空间的地址指向已有的代码空间地址 进程的数据区 要

6、么等到操作系统为其分配相应存储空间以后 将数据区地址填写在PCB中 要么由进程运行时向操作系统动态申请 共享代码 可以将进程的代码视为处理数据的一组规则或公式 这一组规则或公式存储在内存中的某个分区 进程的执行 利用这一组规则或公式来完成数据的运算 多个进程共享代码 多个进程需要使用同一组规则或公式处理不同的数据 PCB 告诉进程其所需的规则或公式以及需要处理的数据存储在哪里 进程的进度等 共享代码 对于高级程序的设计而言 只要相应的编译程序支持可重入的程序设计 那么 设计程序时就不需要考虑程序的可重入问题 不需要将程序代码和数据严格分开 编译程序在编译时 会自动将欲处理的数据与程序代码分开存

7、储 以保证代码部分是纯的 可重入的 存储扩充 内存 速度快 容量小 价格贵外存 容量大 速度慢 价格便宜目的 在多道程序系统中能运行更多 更大的程序 降低系统的造价 提高系统的性价比存储扩充 采用软件手段 在硬件的配合下 将部分外存空间虚拟为内存空间 并将内存和外存有机地结合起来 得到一个容量相当于外存 速度接近于内存 价格十分便宜的虚拟存储系统 存储扩充 虚拟存储系统在逻辑上对外是一个整体 用户感觉到系统提供了一个非常大的 内存 空间 操作系统负责完成内存与外存之间的透明切换 进程运行时将需要的数据或代码从外存装入内存 并将内存中暂时不用的部分交换到外存 3 2内存划分与分配技术 内存划分

8、静态划分 划分预先进行 创建新进程时 在内存中找到一个合适的分区分配给它 动态划分 系统初始化时 可以将整个内存的用户区看作一个分区 创建新进程时 根据进程申请的空间大小 在这个分区中动态地为之划分一部分空间 静态划分 必须事先进行 一旦划分完毕 分区的大小和数目将不再改变 可以划分 大小相同 不同的分区 如固定分区和分页 固定分区 根据系统管理员的经验和一些统计规律 事先将内存空间划分为若干个固定大小的分区 称为分区 Partitioning 当进程申请存储空间时 系统为之分配一个大小合适的空闲分区 静态划分 分页 特殊的静态分区 需要事先将内存空间划分为若干个大小相同的分区 称为页框 或帧

9、 frame 当进程申请存储空间时 系统可以为之分配多个空闲页框 图3 4固定分区划分 固定分区 等长 固定分区 等长 所有分区的长度相同 优点 分配简单 只要进程大小不超过分区大小 就可以装到任何一个分区中运行 浪费存储空间 若进程申请的存储空间很小 却需要占用整个分区 分区内存在不可用的浪费空间 称为内零头 internalfragmentation 无法运行超过分区大小的程序 无法精确确定分区的大小 图3 4固定分区划分 固定分区 异长 固定分区 异长 将内存空间划分为若干个长度不同的分区 以适合于不同大小的进程需要既提高存储空间的利用率 减少浪费 又使长进程能装入运行 但是 确定每个分

10、区的大小也是一件十分困难的事情 固定分区 管理简单 只需要建立一张分区使用表 登记分区的使用情况 等长分区只需要标明分区状态是已分配 还是空闲 固定分区 分配 首先 检索分区使用表 从中找出一个尚未分配的 能满足大小且内零头最小的分区 若分区使用表中的分区按从小到大的顺序排列 则分配时 从表中的第一个表项开始查找 找到的第一个尚未分配并满足大小的分区即是最佳的分区 将分区使用表中该分区的状态修改为已分配 若找不到大小足够的分区 则系统将拒绝运行该进程 或采用其它技术进行处理 如覆盖技术等 固定分区存在内零头 浪费存储空间 异长分区较等长分区可以一定程度上提高系统的性能 但并不能彻底解决问题 分

11、页式划分 Paging 为了提高内存资源的利用率 可以考虑将分区长度缩小 减少内零头浪费的空间 但是 这样做必须有一个前提 即进程可以分配若干不连续的存储空间 否则 小分区可能使更多的进程无法装入内存 分页划分 系统预先将内存空间划分为若干较小的 固定大小的页框 分页式划分 Paging 页框较小 有效地减少了内零头的浪费每个进程平均浪费0 5页框大小 页框大小固定 简化了存储分配 需要记录内存页框的分配和使用情况 位示图 空闲页框表或空闲页框链表等 分页 数据结构 位示图是一个由0 1构成的向量 其中每一位 bit 表示一个页框的使用状态 一般规定 0表示页框空闲 1表示页框已被分配 假定存

12、储空间被划分为n个页框 所有页框依次编号为0 1 2 n 1 则记录所有页框的使用状态的位示图形如 000001110111111111110001111 0011111 分页 数据结构 空闲页框表 以表格形式记载内存页框的使用情况 显然 为每一个空闲页框设置一个表项是不合理的 这将导致页框表太大 可以为一组连续的空闲页框设置一个表项 其中主要包括 首页框号和页框个数 如表3 2所示 分页 数据结构 表3 2空闲页框表 分页 数据结构 位示图和空闲页框表都需要占用专门的存储空间空闲页框链表 是将内存中所有的空闲页框通过其内的链接指针连成一个链表 系统只需要记录链表头的位置 为进程分配存储空间时

13、 从链表头开始取所需的页框 同时更新链表头 回收进程释放的存储空间时 将新产生的空闲页框链接到空闲页框链表中 动态划分与分配算法 静态划分未考虑进程的实际需要 无论是固定分区 还是分页 都存在不同程度的内零头 动态划分 根据进程的实际需要 动态地划分内存空间 并分配给进程 彻底解决了内零头问题 系统初始化时 内存用户区就是一个大分区 随着进程的创建和撤消 内存被动态划分成若干较小的分区 动态划分与分配算法 例如 如图3 6有一个128MB的内存 其中操作系统自身占用8MB 剩下的120MB空间供用户进程使用 依次装入进程P1 P2 P3 P4 P5 P6 剩下一个10MB的空闲分区 一段时间之

14、后 进程P1 P3 P5执行结束 释放出3个空闲分区 内存中共有4个空闲分区 动态划分与分配算法 可见 动态分区的分区长度和数目都是可变的 为了实施存储分配 系统必须维护一张空闲分区表 登记内存中的各个空闲分区 动态划分与分配算法 采用动态划分技术 为进程分配存储空间的过程较复杂 当系统中有多个满足进程大小的空闲分区时 如何为进程选择一个分区合适的分区呢 目前几种较典型的分区分配方案 首次适应算法 FFA FirstFitAlgorithm 基本思想 总是从内存的某一端 一般从低地址端 开始查找 选择一个超过进程申请大小的空闲分区 为此 可以将空闲分区表中登记的空闲分区按照其起始地址由小到大的

15、次序依次排列 系统查找空闲分区时 从表头开始查找 取第一个满足要求的分区分配给进程 首次适应算法 FFA FirstFitAlgorithm 若找到的空闲分区恰好与进程申请的存储空间大小相等 或分配给该进程以后 仅剩下一个非常小的空间 小于系统设置的阈值 则将该分区全部分配给申请进程 否则 系统将该分区划分为两个分区 一个分区的长度等于进程申请的空间大小 并将其分配给申请进程 然后 将另一个子分区链接到空闲分区链表中 首次适应算法 FFA FirstFitAlgorithm 优点 尽量使用低地址空间 因而在高地址的空间可能会保留较大的空闲分区 所以 大进程申请的存储空间大都能在高地址端得到满足

16、 缺点 由于每次只简单地使用找到的第一个分区 结果可能导致将较大的空闲分区不断地分割为较小的空闲分区 外零头 紧凑 动态划分技术解决了静态划分技术的内零头 可能产生很多较小的分区 外零头 ExternalFragment 紧凑 Compaction 把内存中的所有空闲分区拼接成一个较大的空闲分区 即把内存中的所有进程移到内存的某一端 所有空闲分区移到另一端例如 将如图3 7 a 所示的内存空间进行紧凑以后的效果见图3 8所示 下次适应算法 NFA Next FitAlgorithm 首次适应算法每次都从低地址端开始查找空闲分区 总是频繁使用内存的某一端 某些大进程申请的大分区需要很长时间才能在内存的另一端找到 能否均衡使用整个内存空间 加快大分区的查找速度呢 下次适应算法能记住上次分配分区的位置 下一次实施分配时 从上一次的分配位置之后开始查找 选择一个大小足够的空闲分区 下次适应算法 NFA Next FitAlgorithm 该算法常常会导致内存中缺乏大分区 因为它会均衡地利用空闲分区 包括分割较大的空闲分区 从而使得大进程无法装入内存运行 下次适应算法可能会导致大量的外零头 需要

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号