概述
内存管理的作用
- 保证适当数量的进程能够占用可用的处理器时间
内存管理的需求
- 重定向
- 为了使处理器的利用率最大化,将会使用交换技术
- 程序换出到磁盘后,下次换入时很难再放到与换出前相同的内存区域
- 保护
- 用户进程不能访问操作系统的任何部分,无论是程序还是数据。
- 一个进程中的程序通常不能跳转到另一个进程中的指令。
- 若无特别许可,一个进程中的程序不能访问另一个进程中的数据区。
- 内存保护需求通常由处理器(硬件)而非操作系统(软件)来满足。
- 共享
- 内存管理系统在不损害基本的内存保护的前提下,必须允许对内存共享区域进行受控访问:
(1)多个进程正在执行同一个程序时,允许每个进程访问该程序的同一个副本
(2) 合作完成同一个任务的进程可能需要共享访问相同的数据结构
分区
固定分区
- 固定分区: 分区的大小和数目在系统生成阶段已经确定,且无法改变。
- 固定分区分为
大小相等
和大小不等
两种- 大小相等分区的缺点:
(1)程序可能因太大而不能放到一个分区中;
(2)程序太小也会占用一个完整分区,使内存利用率低;- 大小不同的分区只能缓解这两个问题,但不能完全解决
- 固定分区会在分区内部产生
内部碎片
- 放置算法(大小相等):
- 只要存在可用分区,进程就能装入分区
- 放置算法(大小不等):
- 把每个进程分配到能够容纳它的最小分区中,即每个分区都维护一个调度队列,用于保护从这个分区换出的进程
(1)可以保证每个分区内部浪费的空间(内部碎片)最小
(2)从单个分区的角度来看,这种技术是最优的,但是从整体看却并不是最佳的- 为所有进程只提供一个队列,当需要把一个进程装入内存中时,选择可以容纳该进程的最小可用分区
- 固定分区的优缺点:
优点 | 缺点 |
---|---|
简单 | 由于分区的数量 在系统生成阶段已经确定,因此限制了系统中活动进程的数目 |
操作系统软件和处理开销小 | 由于分区的大小 是在系统生成阶段已经确定,因此无法有效利用分区空间 |
动态分区
- 在动态分区中,分区的大小和数目是可变的
- 在内存中形成许多小空洞,称为外部碎片,会使内存利用率降低
- 压缩技术:
- 定义: 移动进程,使得进程占用的空间连续,从而使所有可用空间连成一片
- 压缩能够克服外部碎片,但压缩过程非常费时,且会浪费处理器时间
- 压缩需要具有动态重定位能力: 把进程从内存中的一块区域移动到另一块区域,且不会使进程中的内存访问失效
- 放置算法:*
- 最佳适配: 选择与要求大小最接近的块
- 首次适配: 从头开始扫描内存,选择大小足够的第一个可用块
- 下次适配: 从上一次放置的位置开始扫描内存 选择下一个大小足够的可用块
- 首次适配算法不仅是最简单的,通常也是最好和最快的
- 下次适配常常会在存储空间的尾部分配内存,使得尾部大的空闲存储块,分裂成小碎片
- 最佳适配算法性能是最差的,会使内存中很快形成许多小到无法满足任何内存请求的小块
- 内存压缩的频繁度:最佳适配算法最频繁、下次适配次之、首次适配算法最不频繁
- 内存回收
- 图
(a)
:将两个分区合并,修改前一分区页项的大小- 图
(b)
:将两个分区合并,修改后一分区页项的首地址和大小- 图
(c)
: 将三个分区合并,修改前一分区表项的大小- 图
(d)
:为回收区单独建立一个新表项
伙伴系统
重定位
- 交换技术及压缩技术会使进程在内存中位置的改变,因此需要重定位技术保证位置改变后内存访问能正常进行
地址类型 | 含义 |
---|---|
逻辑地址 | 由程序产生的与段相关的偏移地址部分 |
相对地址 | 逻辑地址的特例,它是相对于某些已知点(通常是程序的开始处)的存储单元的地址 |
物理地址(绝对地址) | 数据在内存中的实际位置 |
- 在执行对内存的访问之前必须将逻辑地址转换为物理地址
- 把相对地址转换为物理地址需要是一种硬件机制
- 重定向的实现:
- 使用相对地址的程序加载到内存中,进程的所有内存访问都是相对于程序的起始点
- 基址寄存器存放程序在内存中的起始地址,界限寄存器指出程序的终止地址
- 每次移动进程的位置时,必须重新设置基址寄存器和界限寄存器的值
分页
- 页框: 内存被划分为固定且大小相等的块,且块的大小比较小
- 页: 每个进程也被分成和页框同样大小的块
- 每个进程中在内存中浪费的空间,仅是进程最后一页的一小部分形成的内部碎片,没有外部碎片
- 一个进程的不同页可以不连续
- 逻辑地址转物理地址:
- 在分页式内存管理系统中:
逻辑地址 = 页号 + 页中的偏移量
- 操作系统为每个进程维护了一个页表:
页表:给出了该进程的每页对应页框的位置
from 逻辑地址(页号 + 页内偏移) to 物理地址(页框号 + 页内偏移)
分段
- 把程序和与其相关的数据划分到几个段中,段的大小不需要相等
逻辑地址 = 段号 + 偏移量
- 在分段方案中,一个程序可以占据多个分区,并且这些分区可以是不连续的
- 分段系统中没有内部碎片,但会产生外部碎片,由于进程被分成多个小段,因此外部碎片也会很小
- 分段式内存管理系统中段和段之间可以离散,但是每一段内需要连续空间
- 逻辑地址转物理地址:
- 每个进程都有一个段表,系统也会维护一个内存中的空闲块列表
- 每个段表项必须给出相应段在内存中的起始地址,还必须指明段的长度,以确保不会使用无效地址