存储单元,内存地址,按字编址,按字节编址
逻辑地址---相对地址;物理地址---绝对地址
内存管理(操作系统完成)
内存管理做得四件事:空间分配与回收,空间扩充(实现虚拟性),地址转换(逻辑地址转绝对地址),存储保护(进程只能访问自己的)
地址转换:
从写程序到程序运行:编译,链接,装入
装入过程会遇到的问题:逻辑地址中有指令对地址80操作,装入内存后模块很可能不是从0开始的,所以80对应的数据不是目标数据
实现地址转换的三种装入方式
绝对装入
如果知道装入模块要从地址为100的地方开始存放,那就可以在在编译、链接阶段直接修改指令中的地址
单道程序阶段使用(无并发进程)
静态重定位(可重定位装入)
在装入阶段修改地址初始值
再装入时必须分配其要求的全部内存空间(地址一次性修改);运行期间不能在移动(否则地址又错了)
动态重定位(动态运行装入)(现代操作系统使用)
内存中直接装入,有一重定位寄存器记录存放初始位置,在指令运行时加上。允许程序在运行时移动位置。程序运行只需要装入部分代码就能运行
内存保护:
法一:CPU汇总设置一堆上下限寄存器存放进程的地址区间
法二:重定位寄存器(存起始物理地址)和界地址寄存器(存最大逻辑地址即长度)
内存空间扩充:解决程序大小超过物理内存总和的问题 (也就考考选择)
覆盖技术
将程序分为多个段常用的段常驻内存,不常用的段在需要时调入内存。内存中分为1个“固定区”和若干个“覆盖区”需要常驻内存的段放在固定区中,调入后就不再调出(除非运行结束)不常用的段放在覆盖区,需要用到时调入内存,用不到时调出内存
让一个程序中不可能同时被访问的程序段共享一个覆盖区
需要由程序员声明覆盖结构
缺点:对用户不透明,增加编程负担
交换技术
将某些进程暂时挂起到外存,将已具备运行条件的进程放入内存。前面讲的内存调度(中级调度)就是为了实现交换技术。 ps:PCB不会换出内存
挂起到外存的什么位置?
磁盘(外存)中分为对换区和文件区。前者速度快,挂起的文件在这里。
何时交换?
进程运行缺页时,后面讲
换出哪些进程?
优先阻塞进程,优先级低的进程
覆盖与交换的区别:覆盖是在同一个进程中的,交换是在不同进程间的。
内存分配与回收
连续分配管理方式
单一连续分配
内存被分为系统区和用户区。内存中只能有一个程序,独占用户区
优点:实现简单,无外部碎片,可采用覆盖技术扩充,可能不需要内存保护
缺点:单任务单用户,有内部碎片(空间给了程序,但程序没有用,如图中的蓝色区域:属于A但A没使用)无外部碎片,存储器利用率低
固定分区分配:
将用户空间分成固定大小的分区,每个分区最多一道作业
分区大小相等:适合多个相同对象的场景
分区大小不等:增加灵活性
实现简单,无外部碎片。
有内部碎片、无外部碎片。当程序太大时,需要覆盖技术,降低性能
通过分区说明表存放分区状态:
动态分区分配
不预先划分内存分区,根据进程建立分区
与固定分区分配相同,通过表或链表记录空间使用状态
若有多个空闲分区满足要求,选择哪个区域?
按一定的动态分区分配算法,后面讲
如何进行分配回收操作?
表中该合并就合并,该删除就删除。
无内部碎片,有外部碎片。外部碎片可以通过紧凑技术(移动进程在内存中的位置,将零碎的空余空间合并)消除
动态分区分配算法
若分配的空闲分区远大于所需空间(大于某阈值),则只是分配空闲空间的一部分,剩下的不属于该进程,而是继续作为空闲空间
首次适应算法:
最佳适应算法:
算法思想:尽可能留下大面积的空闲区,优先使用小面积空闲区
优点:内部碎片最小
缺点:每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。算法开销大(因为空间改变可能需要重新排序空余空间表/链)
邻近适应算法(循环指针): 与上面两种结合使用
首次适应算法每次都从开头检索,所以高地址处的大面积空余容易留下来给将来的大进程。而临近适应算法因为是循环检测地址的,所以大面积空余都容易被使用。将来有大进程时,就没有合适的空间了。
综合看来,首次适应算法才是最好的
非连续分配管理方式:
连续分配指一个进程的内容连续的放到内存里,容易出现碎片。非连续指进程的内容可以分散的放入内存,解决的碎片问题
基本分页存储管理
将内存空间分为大小相等的分区,每个分区就是一个“内存块”配有“内存块号/物理块号”。进程的地址空间也分为与内存块大小相等的区域,称为“页/页面”配有“页号”。(注:进程的最后一个页面可能没有一个内存块那么大。因此,内存块不能太大,否则可能产生过大的内部碎片)。各个页面不必连续存放,也不必按先后顺序来。
非连续分配实现逻辑地址到绝对地址(动态重定位方法的扩展)
那么电脑如何知道一个页面对应的起始地址? 建立页表
一行叫一个页表项
因为每个页表项的长度是相同的,所以页表中页号可以是隐含的:
最后这一段的意思是:世知道页表项长度和页号就能找到对应页表项和块号