操作系统 == 内存管理
内存管理概念
内存管理的基本原理
内存管理主要功能包括:
地址转换,内存分配和回收,内存空间的扩充(虚拟存储技术),内存共享,存储保护
逻辑地址和物理地址
编译后,每个模块都从0开始进行编址,这称为目标模块的逻辑地址
Note:进程在运行过程中,看到的和使用的都是逻辑地址
逻辑地址经过地址转换变为物理地址
物理地址指的是内存中的实际地址,内存地址空间是内存中物理单元的合集
地址转换是由MMU(内存管理部件)实现的
程序的链接和装入
将用户程序编程可执行程序,一般需要以下几步
编译,链接,装入
装入分为以下几种
- 绝对装入:
逻辑地址与实际地址完全相同,只适合单道程序环境,在编译时就知道程序存放在内存哪个位置
- 可重定位装入(静态重定位)
地址转换在进程装入时就完成,缺点是一个作业装入内存,必须给它分配足够的存储空间,且运行期间无法移动
- 动态运行时装入
看到这个名字,相比你就知道其与上面的区别了,虽然装入模块被装入到内存,但是只有运行的时候才会发生地址转换,存在一个重定位寄存器来实现动态运行时装入‘
然后就是链接:分为静态链接·和动态链接
- 静态链接
将各目标模块与其所需库函数链接成一个完整的装入模块,以后不在拆分
- 动态链接
采用边装入边链接的方式
- 运行时动态链接
在程序运行需要某目标模块的时候,才对其进行链接
内存映像
内存映像一般包含:代码段,数据段,堆,栈等基本要素
内存保护
- 在CPU设置一对上下限寄存器,存放用户进程在主存中的下限和上限地址
- 采用重定位寄存器和界地址寄存器进行越界检查,重定位寄存器内存放的为初始物理地址,界地址寄存器存放的为进程最大逻辑地址(由于逻辑地址从0开始,所以这就是长度)
内存共享:只有只读区域才可以共享
内存分配和回收
连续分配管理方式
指的是为一个用户空间分配一篇连续的内存空间
- 单一连续分配:用户独占用户区,内存中只有一道程序
- 固定分区分配:将用户空间划分为多个固定大小的分区
- 分区大小相等
- 分区大小不等
使用分区使用表来标识各跟去的起始地址,大小和状态
- 动态分区分配:根据进程需要,动态分配内存
动态分区分配涉及多种分配算法:
- 首次适应算法:按地址递增次序排列,每次分配,顺序查找
- 临近适应算法(循环首次适应算法)
- 最佳适应算法:空闲分区按照容量递增排序,每次顺序查找第一个满足大小的分区
- 最坏适应算法:空闲分区按照容量递减排序
- 索引分配算法:
- 伙伴系统:所有分区大小伟2的k次幂
- 哈希算法:
- 快速适应算法:用常用空间大小进行划分
这三种算法的共同特点就是在主存中连续存放用户程序
基本分页存储管理
思想:将内存分为若干固定大小的分区,称为页框,页帧,物理块
进程的逻辑地址空间同样分为若干与块大小相等的区域,称为页或者页面
这样就不会产生外部碎片,且只会在进程最后一个不完整的块申请主存块空间的时候,才会产生内部碎片
分页存储的几个基本概念
- 页面和页面大小
进程的逻辑地址空间每个页面有一个编号,称为页号,从0开始,同样的,内存页框也有自己的编号,称为页框号,从0开始,为方便地址转换,页面大小为2的整数次幂。 - 地址结构
- 逻辑地址,每个分页存储管理的逻辑地址由页号和页内偏移量组成
- 页表
为了便于找到每个页面在内存中存放位置,系统为每个进程建立了一张内存映射表,简称页表,进程每个页面对应一个页表项,记录页号和块号 - 基本地址变换机构
主要任务是将逻辑地址转换为物理地址,为了提高地址变换速度,系统中存在一个页表寄存器,存放页表在内存中的起始地址和页表长度,一般单CPU系统只有一个页表寄存器,当进程被调度执行的时候,将页表的起始地址和页表长度放到页表寄存器中。 - 物理地址的计算
页号P = A/L ,就是逻辑地址/页面大小
页内偏移两 W = A%L 就是逻辑地址%页面大小
先判断是否越界,如果没有越界的话,那么就区找对应页表项,即查询物理块号
note:这里的P对应页表项的地址为页表起始地址加上P乘以页表项长度
计算物理地址 E = bL * W,b为对应物理块号
note:地址转换是由硬件来完成的
快表(TLB)
具有并行查询能力的高速缓冲寄存器
由于局部性原理,这里面会存储一些访问过的若干页表项,对快表进行遍历查询的时间几乎可以忽略不计,通过快表命中访存次数就会降低到1次
多级页表
如果页表项较多,但是页表还要求连续存储,这显然不切实际
故为了使得页表离散存储,引入多级页表,对页表在进行分页,然后上一级页表项存储对应页表对应的块号
基本分段存储管理
分段管理的方式考虑到了程序员和用户,将用户进程逻辑地址空间划分为若干大小不等的段,并分配一段连续的地址空间
段表:包含段号,段长,本段在主存中的起始地址
分段和分页的区别
- 页是物理信息的基本单位,段是信息的逻辑单位
- 页的大小固定,段大小不固定
- 分页管理的地址空间是一维的,分段管理的地址空间是二维的
段的共享
内存中配置张共享段表,所有共享的段在共享段表中占据一个表项
段页式存储管理
其实就是将每段再分为若干页
逻辑地址结构如下
段号 页号 业内偏移量