1. 内存管理需求
内存管理需要满足以下五种需求:
- 重定位(relocation): 程序换出到磁盘中后下次下次换入时要放入换出前区域很困难,需要重定位到内存的不同区域
- 保护(Protection): 当前进程以外的其他程序不能未经授权地访问(读\写)该进程地内存单元
- 共享(sharing): 保护机制也需要灵活性,以允许多个进程访问内存的同一部分,内存管理系统在不损害基本保护的前提下,允许对内存共享区域进行受控访问
- 逻辑组织(Logical Origanization): 计算机系统中的内存总是被组织成线性(或一维)的地址空间,该地址空间由一系列字节或字组成
- 物理组织(Physical Origanization): 计算机存储器至少有两级:内存和外存.二两级存储间移动信息由系统负责,即为存储管理的本质
2. 内存分区
2.1 固定分区
将内存分成若干边界固定的区域
- 两类固定分区
- 等大分区问题 内部碎片:任何程序,无论大小,都需要单独完整占用一个分区,当装入分区的数据块小于分区大小,限制空间也无法利用造成浪费
- 不等大分区放置算法 | 多队列法 | 将每个进程放到能容纳它的最小分区, 每个队列负责维护该分区换出的进程,对单个分区,该方法最优,内部碎片少,但整体看,当分区有挂起进程,但此时别的分区本可以容纳,却由于非对应队列而无法执行,增加阻塞 | | :—-: | —- | | 单队列法 | 当没有可用分区后,进行交换,优先换出可容纳该进程的最小分区 |
2.2 动态分区
定义 | 分区的长度和数量可变,进程装入内存时,系统分配给它一块与其容量完全相等的内存空间 | |
---|---|---|
外部碎片 | 动态分区时,内存中会出现”空洞”,无法满足任何进程的空间需求,只能换出其余进程, - 这种碎片是对内存整体来说的 - 压缩: 运用动态重定位的方法,将进程位置移动,整理碎片成一个足够大的空间 |
2.3 伙伴系统
运用二分法的思想,进程请求空间s,开始给进程分配大小为2u内存:
- 如果2u-1<s≤2u,分配整个空间
- 否则分为两部分,如果2u-2<s≤2u-1,分配给两个伙伴中的一个
- 重复,且当遇到空间不足时还可以合并伙伴
3. 重定位
- 重定位的硬件支持
- 相对地址的使用
| | |
| :—-: | :—-: |
| 加载模块被加载到内存时,全部使用相对地址,只有真正执行才使用绝对地址
假设某进程占据了内存中一段完整的相邻分区:
程序装入的实际起点(Base值)为1024,假设x装入后Bounds为2688,此时统一相对化地址:开始执行x的语句
jump 400,400+1024=1424 < 2688,读取400处指令
load 1200,1200+1024=2224 < 2688,加载1200处数据 | |
4. 分页
将内存和进程都分割成同样大小的块,进程中为页(page),内存中为帧(frame),没有外部碎片,唯一的内部碎片为每个进程的最后一页
页表: 内存中的帧无法连续保存同一进程的页,为了标注实际的对应关系,每一个进程维护一个页表
例题:使用16位寻址,页大小1k,已知相对地址1502,和部分页表,求逻辑地址与物理地址 |
|
---|---|
解:1502化为二进制0000,0101,1101,1110,1K=210,16-10=6,则6位用于片选 page:000001,offset:0111011110=478 ⭐则相对地址1502的逻辑地址:对于page1(000001)的偏移量为478(0111011110)二者产生的16位数一样,但含义不一样 page:000001->frame:000110 则物理地址:0001100111011110 |
|
逻辑地址 | 物理地址 |
5. 分段
把程序和数据分为几个段(segment),段有最大长度限制,但不要求所有段长度一致
例题:使用16位寻址,段号占4位,已知逻辑地址0001,0010,1111,0000和部分段表,求逻辑地址与物理地址 |
---|
解:片选4位 segment:0001,offset:0010,1111,0000 段表中Length代表该段分区长度,起始地址Base=0010,0000,0010,0000 则offset+Base=0010,0011,0001,0000即物理地址 |
本章动画: http://williamstallings.com/OS-Animation/Animations.html