一)基本概念
地址重定位(RELOCATION)又名:地址转换、地址映射、地址翻译
程序装载到内存才可以运行,通常,程序可执行文件格式保存在磁盘上
多道程序设计模型 允许多道程序同时进入内存
每个进程有自己的地址空间(一个进程执行时不能访问另一个进程的地址空间;进程不能执行不合适的操作)
进程地址空间加载到物理空间才能运行,存储模型要解决:为每个进程分配物理内存
进程中的地址不是最终的物理地址,在地址在运行前无法计算出物理地址,因为不能确定进程被加载到内存什么地方
逻辑地址(相对地址,虚拟地址):用户程序经过编译、汇编后形成目标代码,目标代码通常采用相对地址的形式,其首地
址为0,其余地址都相对于首地址而编址,不能用逻辑地址在内存中读取信息
物理地址(绝对地址,实地址):内存中存储单元,可直接寻址
为了保证CPU执行的指令可正确访问到内存单元,需要将用户程序中的逻辑地址转换为运行时可由机器直接寻址的物理地址,
这一过程称为地址重定位
静态重定位:当用户程序加载到内存时,一次性实现逻辑地址到物理地址的转换(程序位置不能改变),一般可由软件完成
动态重定位:在进程执行过程中进行地址变换——》逐条指令执行时完成地址转换,需要硬件支持(为了加快速度)
内存管理单元是硬件机制
二)物理内存管理
1)对物理内存的划分:
a.等长划分
数据结构——》位图:每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)
像数组一样,知道它是第几个,单位长度就可以算出地址了
b.不等长划分
数据结构——》空闲区表、已分配区表:表中每一项记录了空闲区表(或已分配区表)的起始地址、长度、标志
——》空闲链表
2)内存分配算法:
将该空闲区分为两部分,一部分供进程使用,另一部分形成新的空闲区
a.首次适配first fit:从表头开始在空闲区表中找到第一个满足进程要求的空闲区
b.下次适配next fit:从上次找到的空闲区处接着查找
c.最佳适配best fit:查找整个空闲区表,找到能够满足进程要求的最小空闲区
d.最差适配worst fit:总是分配满足进程要求的最大空闲区
3)回收问题:
内存回收算法:当某一块归还后,前后空间合并,修改内存空闲区
四种情况:上相邻、下相邻、上下都相邻、上下都不相邻
三)伙伴系统(Linux低层内存管理采用,一种特殊的“分离适配”算法)
1)主要思想:将内存按2的幂进行划分,组成若干空闲块链表;查找该链表能找到满足进程需要的最佳匹配块
2)算法:
首先将整个可用空间看作一块:2^u
假设进程申请的空间为s,如果满足2^(u-1) < s<=2^u,则分配整块,否则将划分为两个大小相等的伙伴,大小为2^(u-1)
一直划分下去知道产生大于或等于s的最小块
四)基本内存管理方案
加载的单位是进程
1)整个进程进入内存一片连续的区域
a.单一连续区:
思想:一段时间内只有一个进程在内存
特点: 简单、内存利用率低
方案一:用户程序占据高位,操作系统占据低位(或者相反)
方案二:驱动程序占据高位,用户程序在中间,操作系统在地位
b.固定分区
思想:
把内存空间分割成若干区域,称为分区
每个分区的大小可以相同也可以不同
分区大小固定不变
每个分区装一个且只能装一个进程
c.可变分区
思想:根据进程的需要,把空闲内存空间分割出一个分区,分配给该分区
剩余部分称为新的空闲区
缺点:外碎片(进程之间的内存),导致内存利用率下降
碎片:很小的、不易利用的空闲区
解决方案——》紧缩技术:在内存移动程序,将所有小的空闲区合并为较大的空闲区
紧缩时要考虑的问题:系统开销,移动时机(比如正在作I/O的进程不能动)
2)一个进程进入内存中若干不连续的区域
a.页式存储管理方案
设计思想:用户进程地址空间被划分为大小相等的部分,称为页(page)或页面,从0开始编号
内存空间按同样大小划分为大小相等的区域,称为页框(page frame),从0开始编号;也称为物理页面,页帧,内存块
内存分配(规则):以页为单位进行分配,并按进程需要的页数来分配;逻辑上相邻的页,物理上并不一定相邻
典型页面尺寸:4K或4M
逻辑地址(由页号,页内地址(偏移)组成)
页表:记录了进程的地址空间(页)到物理内存(页框)的映射关系,页表中的每一行称为页表项
相关的数据结构
页表——》页表项:记录了逻辑页号于页框的对应关系
每个进程一个页表,存放在内存
页表起始地址保存在何处?寄存器
空闲内存管理
地址转换(硬件支持):CPU取到逻辑地址,自动划分为页号和页内地址;用页号表查表,得到页框号,
再与页内偏移拼接成的物理地址
缺点:内碎片(一页大部分是空的)
b.段式
设计思想:用户进程地址空间按照自身的逻辑关系划分为若干程序段,每个程序段都有一个段名
内存空间被动态划分为若干长度不相同的区域,称为物理段,每个物理段由起始地址和长度确定
内存分配(规则):以段为单位进行分配,每段在内存中占据连续空间,但各段之间不可以相邻
逻辑地址:由段号和段内地址组成(不是自动划分的)
相关数据结构——》段表,每项记录了段号,段首地址和段长度之间的关系
每个进程一个段表,存放在内存
段表起始地址保存在何处? 段表起始地址寄存器
物理内存管理
地址转换(硬件):CPU取到逻辑地址,用段号查段表,得到该段在内存的起始地址,与段内偏移地址计算出物理地址
c.段页式
设计思想:用户进程划分:先按段划分,每一段再按页面划分
逻辑地址:由段号和段内地址组成,段内地址又分为页号和页内地址
内存划分:同页式存储管理方案
内存分配:以页为单位进行分配
数据结构——》段表:记录了每一段的页表起始地址和页表长度
——》页表:记录了逻辑页号与页框号的对应关系
每一段有一张页表,一个进程有多个页表
空闲管理:同页式管理
内存分配、回收:同页式管理
五)交换技术(Swapping)
——》解决内存不足时如何管理,即解决在较小的内存空间运行较大的进程
1)内存“扩充”技术
a.内存紧缩技术(例如:可变分区)
b.覆盖技术overlaying
解决问题——》程序大小超过物理内存总合
程序执行过程中,程序的不同部分在内存中相互替代
——》按照其自身的逻辑结构,将那些不会同时执行的程序段共享一块内存区域
——》要求程序各模块之间有明确的调用结构
程序员声明覆盖结构,操作系统完成自动覆盖
c.交换技术swapping
设计思想:内存空间紧张时,系统将内存中某些进程暂时移动到外存,把外存中某些进程换进内存,占据前者所占用的区域
(进程在内存与磁盘之间的动态调度)
实现时遇到的问题:进程的哪些问题要交换到磁盘,会遇到哪些问题
交换的内容:运行时创建或修改的内容:堆和栈
在磁盘的什么位置保存被换出的进程
交换区:一般系统指定一块特殊的磁盘区域作为交换空间(swap space),包含连续的磁道,操作系统可以
使用底层的磁盘读写操作对其高效访问
交换时机
只要不用就换出(很少再用);内存空间不够或者有不够的危险时换出
与调度器结合使用
如何选择被换出的进程
考虑进程的各种属性;不应换出处于等待I/O状态的进程
如何处理进程空间增长
数据段、栈段
同向增长、数据向上增长栈向下增长
d.虚拟存储技术virtual memory