离散分配
分页(Paging),分段,段页式
一、分页
一个进程的物理地址可以是非连续的;
将物理内存分成固定大小的块,称为块(frame);
将逻辑内存分为同样大小的块,称为页(page);
将连续的页分配并存放到不连续的若干内存块中;
建立页表,记录每一页对应的存储块的块号,将逻辑地址转换为物理地址。
将产生内部碎片
地址转换方法
将逻辑地址转换为虚拟地址:
CPU生成的地址分成以下两部分:
1.页号(p):页号作为页表中的索引。页表中包含每页所在物理内存的基地址。
2.页偏移(d):与页的基地址组合就形成了物理地址,就可送交物理单元。
逻辑内存和物理内存的分页模型:
![](https://i-blog.csdnimg.cn/blog_migrate/20c96f61d841738c697b271db5f2dd53.png)
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/f24b11d9e9f1a814b7e0c54dcd9672fa.png)
将逻辑地址转换为物理地址需要寄存器来支持,地址转换体系结构如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a2b54b9866ecd49d02f87e94eca6a04e.png)
地址变换机构如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8837d32cb34e4a145e3b85837b8010b8.png)
假定一页大小为1K(1024B),考察逻辑地址2056,地址变换过程工作原理如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/dfce4437b89c44b84d933e1cb0388233.png)
转换过程分析:逻辑地址机内表示(以16位为例)
无需计算,只需用块号代替高位的页号,就可立即得到对应的物理地址
![](https://i-blog.csdnimg.cn/blog_migrate/9828047b03dca0d9e10418490335c678.png)
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/5b4caca18c423834d91667866c4b39f3.png)
页表的实现
1.页表保存在内存中
2.页表基寄存器(PTBR)指向页表
3.页表长度寄存器(PTLR)指示页表的大小
4.在这种方式下,每次数据/指令的访问需要访问两次内存。一次访问页表,另一次访问数据/指令
5.两次内存访问问题可以用特别的快速查找硬件缓冲(TLB,称为快表或联想存储器或关联内存或翻译后备缓冲器)来解决。
带TLB的分页硬件原理如下:
![](https://i-blog.csdnimg.cn/blog_migrate/45e6c586fcf1d99e61523257e000d31a.png)
页表结构:
①层次化分页
②Hash页表
①层次化分页
1.将逻辑地址空间分成多个页表
2.一种简单的方法是两层分页法
示意图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/66a5cc6d60734c709cf46b70ea5e88d2.png)
两层分页方法实例:
逻辑地址(32位机器,页大小为4K)分成以下两部分:页号(20位),页偏移(12位)
页表又分成页,所以页号又进一步分成:10位页号,10位页偏移
因此,逻辑地址表示如下:
![](https://i-blog.csdnimg.cn/blog_migrate/780e927f71b26577e0b722f365b240e1.png)
②Hash页表
1.处理超过32位地址空间的常用方法是使用Hash页表。
2.逻辑地址中的逻辑页号被放入hash页表中。hash页表的每一项都包括一个链接组的元素,这些元素hash成同一位置(碰撞)。
3.逻辑页号与链表中的每 一个元素的第一个域相比较。如果匹配,那么对应的块号就用来形成位置地址。如果不匹配,那么就对链表中的下一个域进行页码比较。
Hash页表实例:
![](https://i-blog.csdnimg.cn/blog_migrate/a41ad3d1f9acff774e21dddf2a07761d.png)
二、分段
支持用户观点的内存管理方法
程序是若干段的集合:主程序,子程序,函数,方法,对象,局部变量,全局变量,堆栈,符号表,数组
用户角度的程序:
![](https://i-blog.csdnimg.cn/blog_migrate/ac1f75c6f8817fdb358a1c915682cfa4.png)
段的逻辑视角:
![](https://i-blog.csdnimg.cn/blog_migrate/57537982fbbf379d8846565ebe5ca501.png)
段的体系结构:
逻辑地址由两个元素组成:
<段号,偏移>
段表:将二维的用户定义地址映射为一维物理地址。段表的每个条目都有段基地址和段界限。
基地址:包含段的起始地址
界限:指定段的长度
段表基地址寄存器(STBR)指向内存中的段表的位置
段表长度寄存器(STLR)指示程序所用的段的个数
段号S小于STLR的时候才是有效的
段硬件实现:
![](https://i-blog.csdnimg.cn/blog_migrate/737e978f1718855c470bd823258bb296.png)
分段实例:
![](https://i-blog.csdnimg.cn/blog_migrate/b56db53b1f42a527fae72e316eb8fa4f.png)
三、交换
进程可以暂时从内存中交换出来到备份存储上,当需要再执行时再调回到内存中。
备份存储 —— 通常是快速磁盘。这必须足够大,以便容纳所有用户的内存映象拷贝,它也必须提供对这些内存映象的直接访问。
换入、换出 - 是交换策略的一个变种,被用于基于优先权的调度算法中。如果一个更高优先级进程来了且需要服务,内存管理可以交换出低优先级的进程,以便可以装入和执行更高优先级的进程。当更高优先级进程执行完后,低优先级进程可以交换回内存以继续执行。
交换时间的主要部分是转移时间。总的转移时间与所交换的内存空间直接成正比。
交换的修改版本在许多系统中被采用。(如UNIX, Linux及Windows)
交换示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/d5c8379466e950acbdb86c078440854b.png)