主存
存储器管理系统关注的问题
- 逻辑地址空间和物理地址空间的管理方法(分区管理、页式管理、段式管理、段页式管理)
- 逻辑地址到物理地址的映射方法
- 存储保护机制
- 内存共享方法
- 碎片,零头
背景
一个用户程序的运行需要经历以下几个步骤:
- 编写源程序
- 编译
- 链接
- 装入
- 执行
关键问题
各个阶段地址的表示及转换问题:
源程序中如何表示?编译时如何表示?运行时如何表示?
名地址和名空间:
在编程时,使用符号名表示地址,如变量名,标号等
这些变量名和标号等构成程序的名空间
逻辑地址与逻辑空间:(logical address space)
编译时无法确定程序在运行时所分配的地址空间;
假设从0开始编址,指令中地址码部分都是相对于0进行编址
相对地址->相对地址空间;虚地址->虚地址空间
物理地址空间:(physical address space)
程序运行时使用的内存地址;
绝对地址->绝对地址空间; 实地址->实地址空间;
逻辑地址到物理地址的映射:
- 编译时完成地址映射
用户下需要知道内存使用情况,不利于程序的浮动,不支持虚拟存储,早期系统使用 - 装入时完成
不利于程序的浮动,不支持虚拟存储 - 运行时完成(现在的OS多采用)
边执行,边变换
需要硬件MMU支持
支持虚拟存储机制(程序可以装到内存的任何地方)
MMU
MMU 存储保护
链接:
1、静态链接:
运行之前完成链接,将所有的模块链接起来,形成一个可执行文件,运行时直接装入内存
链接及装入过程费时,有些用不到的模块也被装入;
不便于模块的升级,运行速度快
2、动态链接:
运行时仅链接需要的模块,运行调用时进行链接,减少链接的时间节省内存空间,便于模块的升级与共享
装入:
- 绝对方式装入:
运行时装入所有模块,装入时费时,浪费内存,管理简单,运行速度快 - 动态运行时装入:
运行时址装入主控模块,支持下虚拟存储
兑换区(swapping)
对换是指将内存中的暂时还不能被运行的进程或者暂时用不到的程序和数据,调到外存上(在linux中,有个/swap分区专门用户对换),以便腾出足够的内存供在外存中等待的作业使用。
分区
单分区
用户区只有一个分区,每个时刻只能运行一道程序。
多分区
将用户区分成多个分区,每个分区,每时刻运行一道程序。
两种多分区技术:
静态分区:
- 系统初始化时,系统将内存分成多个分区:
分区数目固定,分区大小固定 - 分区表
记录分区位置大小及使用情况,对分区进行管理 - 内碎片
- 地址映射和存储保护:
base寄存器(relocation Register)和limit寄存器如上图所示
动态分区
基本思想:
系统初始化的时候,将内存空间之划分成一个分区;对进程所需内存按需分配
分区表:
对以分配的分区进行管理
空闲分区表:
地址映射与存储保护 与上述相同
外碎片
段式管理用该内存方法
当申请一个大小为n的hole时存在的问题 :
- Best-fit :分配一个笑笑合适的最小的hole要扫描整个list
- First-fit:分配第一个遇到的足够大的hole
- Worst-fit:分配最大的hole,扫描整个list
- Next-fist
分区管理的特点
- 整个作业或进程存放在一段整个连续的内存区域中
- 管理简单
- 对于较大的作业,有时难以找到足够大的连续区域
- 不支持内存共享
- 不是很好的支持虚拟存储
分页
基本思想:
- 内存分块(页框(frame)),作业分页,页和页框一样大
- 内存分配以页为单位。
- 一个作业在内存中的个页面可以分配到不相邻的页框中,但一个页框在内存中连续。
- 逻辑地址格式:页号,页内偏移
- 内碎片
存储保护:
页号越界检查
共享页访问权限
页面共享:
通过页表实现
地址转换
CPU给出的逻辑地址划分
页号 ,页内偏移
地址转换过程
页表的硬件支持
*页表可以由一组专门的寄存器来实现
页表大多驻留在内存中,在系统中设置如下寄存器(在MMU中)
PTBR 存放也便在内存中的起始地址
PRLR 页表长度
未执行时,页表的起始地址和页表长度存放在本进程中的PCB中
当调度程序调度某进程时,系统将这来两个寄存器中的数据装入MMU的页表寄存器中
内存保护
- 检查页号是否超出自己的地址空间定义的范围
- 检查页框的访问许可
valid-invalid 位
valid:表明该页表中的页面是该进程的合法页面
invalid :页面不是该进程和发的页面
当调度一个进程时,系统将其PCB中保存的本进程页表的PTBR及PTLR内容装入系统的PTBE PTLR以实现操作系统对本进程存储空间的访问
页面共享
内存共享条件:
- 可重入代码(纯代码):没有静态变量,全局变量的修改。可宠辱代码是不能自我修改的代码,他不会在执行期改变。因此两个进程可以在同一时间执行相同代码。
- 有相同的页内偏移地址
分页管理产生的是内碎片
页表结构
层次页表
一个页框无法容纳整个页表
层次页表,将一个大页表分成若干小页表
哈希页表
反向页表
分段
分页存在的问题
- 实际内存和用户理解的内存不一致
- 共享困难(可能将一个独立的模块划分到多个页面中)
分区存在的问题
将一个作业的逻辑空间视为一个连续的整体,为大作业找也个连续分区比较困难
分段的基本思想
- 作业分段,内存按动态分区进行管理
- 内存分配以段为单位
- 一个作业在内存中可以不连续但是在段内是连续的
- 每一个段都有段名和长度
- 逻辑地址格式:段号,段内偏移量
- 段表:段与段之间所在内存位置的对应关系
- 外碎片
地址变换
段共享