参考资料: 《现代操作系统 3th edtion》原书第三章 储存管理
在 xmind 上记录
一、地址空间
地址空间是一个进程可用于寻址内存的一套地址集合
基址寄存器与界限寄存器
- 简单的动态重定位
- 程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中
- 每次访问内存都需要进行加法和比较运算,效率低
二、交换技术(swaping)
-
用以解决内存不足的情况
-
把一个进程完整调入内存,使该进程运行一段时间,然后(必要时)把它存回磁盘
-
当程序耗尽分配的内存时可以存回磁盘后,分配一块更大的内存区域
三、空闲内存管理
使用位图的存储管理
- 内存可能被划分成小到几个字或大到几千字节的分配单元
- 每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)
使用链表的存储管理
-
链表的结点包含进程或空闲区的指示位、起始地址、长度等信息
-
分配内存
-
首次适配(first fit)算法
- 找到第一个大于程序请求内存的空闲区
-
下次适配(next fit)算法
- 记录找到的位置,不从头开始查找
-
最佳适配(best fit)算法
-
遍历整个链表, 找到最小的合适空闲区
-
耗时长,内存浪费
-
-
最差适配(worst fit)算法
-
遍历整个链表, 找到最大的合适空闲区
-
仿真结果: 不是个好主意
-
-
快速适配(quick fit)算法
- 提前储存常用的内存大小的空闲区
-
注: 为进程和空闲区各自维护一个链表会提升查找效率,但是增加了维护开销
四、虚拟内存
问: 为什么不建议使用物理地址?
- 如果用户程序可以寻址内存的每个字节,它们就可以很容易地(故意地或偶然地)破坏操作系统,从而使系统慢慢地停止运行
- 使用这种模型,想要同时(如果只有一个CPU就轮流执行)运行多个程序是很困难的
- 需要解决两个问题:保护和重定位
每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或页面(page)每一页有连续的地址范围
-
这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序
- 当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射
- 当程序引用到一部分不在物理内存中的地空
间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令
分页
-
RAM和磁盘之间的交换总是以整个页面为单元进行的
-
MMU发现某页面没有被映射, 于是使CPU陷入到操作系统, 这个陷阱称为缺页中断(page fault)
- 操作系统找到一个很少使用的页框且把它的内容写入磁盘(如果它不在磁盘上)。随后把需要访问
的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷阱的指令
- 操作系统找到一个很少使用的页框且把它的内容写入磁盘(如果它不在磁盘上)。随后把需要访问
注: - MMU(Memory Management Unit,MMU)把虚拟地址映射为物理内存地址
页表
-
虚拟地址被分成虚拟页号(高位部
分)和偏移量(低位部分)两部分 -
虚拟页号可用做页表的索引,以找到该虚拟页面对应的页表项
- 由页表项可以找到页框号(如果有的话)。然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成送往内存的物理地址
比如: 例如,对于16位地址和4KB的页面大小,高4位可以指定16个虚拟页面中的一页,而低12位接着确定了所选页面中的字节偏移量(0~4095)
- 页表的目的是把虚拟页面映射为页框(在物理内存中对应的单元称为页框(page frame))。从数学角度说,页表是一个函数,它的参数是虚拟页号,结果是物理页框号。通过这个函数可以把虚拟地址中的虚拟页面域替换成页框域,从而形成物理地址
加速分页
-
转换检测缓冲区(Translation Lookaside Buffer,TLB)
- 为计算机设置一个小型的硬件设备,将虚拟地址直接映射到物理地址,而不必再访问页表
-
软件TLB管理
-
针对大页表的处理
- 多级页表
- 倒排页表
五、页表置换算法
最近未使用页面置换算法
- 在最近一个时钟滴答中(典型的时间是大约20ms)淘汰一个没有被访问的已修改页面要比淘汰一个被频繁使用的“干净”页面好
- 易于理解,有效实现,性能不是最好但是已经够用
先进先出页面置换算法
- 可能淘汰常用的页面
第二次机会页面置换算法
- 第二次机会算法就是寻找一个最近的时钟间隔以来没有被访问过的页面
时钟页面置换算法
- 环形检测,使用位为0则淘汰,使用位为1则置0
- 又称为最近未用(Not Recently Used, NRU)算法
最近最少使用页面置换算法
-
LRU
- 理论上是可以实现的,但代价很高
-
软件模拟LRU
-
NFU最不常用算法
-
老化算法
- 非常近似LRU的有效算法
-
工作集页面置换算法
- 工作集是最近k次内存访问所访问过的页面的集合
- 工作集时钟页面置换算法
六、分段
-
页面是定长的而段不是
-
段的长度在运行期间可以动态改变
-
每个段是一个为程序员所知道的逻辑实体
XMind: ZEN - Trial Version