3.1.1 内存管理的基本原理和要求
1、程序装入和链接(把逻辑地址转化为物理地址)
创建进程首先要将进程和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
1、编译
2、链接
3、装入
程序链接有以下几种方式
静态链接
装入时动态链接
:边装入边链接运行时动态链接
:程序执行中需要该目标模块时才进行链接
内存的装入模块在装入内存时,同样有三种方式
-
绝对装入
:知道程序将驻留在内存中某个位置,编译器将产生绝对地址目标代码。(适合单道程序系统)
-
可重定位装入
静态重定位 :(多道程序环境下)
,多个目标模块的起始地址通常从0开始,程序中其他地址都是基于起始地址的。一个作业装入内存时必须分配该作业全部要求的全部内存空间
-
运行时装入
也叫动态重定位 程序在内存中发生移动,则需要动态装入方式 可以指装入部分代码即可,可以动态申请内存空间。
2、逻辑地址空间与物理地址空间
逻辑地址(相对地址):编译后,目标模块都是从0编址,称为该目标模块的逻辑地址(相对地址)
物理地址空间:是指内存中物理单元的集合,它是地址转换的最终地址。
装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转为物理地址,这个过程叫 地址重定位
3、内存保护
(1)、在CPU中设置一对上下限寄存器
,判断有无越界。
(2)、采用重定位寄存器(基址寄存器)
和 界地址寄存器
通过比较界地址寄存器中的值与逻辑地址值来判断是否越界。
3.1.2 覆盖于交换
3.1.3 连续分配管理方式
1)单一连续分配
内存在此方式下分为系统区
与用户区
,系统区仅供操作系统使用,通常在低
地址部分,无需进行内存保护,因为内存中永远只有一道程序
优点: 无内部碎片
、简单
缺点: 有外部碎片
、存储器利用极低
2)固定分区分配
每个分区中只装入一道作业
3)动态分区分配
在进程装入内存时,根据进程的大小动态建立分区。
动态分区算法随着时间的推移,内存会产生很多的
外部碎片,与固定分区的内部碎片
正好相对。克服外部碎片可以通过 **紧凑
**技术来解决。
1.首次适应算法:顺序查找,找到第一个满足要求的分区 最简单、最快、最好
2.最佳适应算法:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。 优先选择小的空闲分区
产生最多的外部碎片
3.最坏适应算法:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。 优先选择大的空闲分区
4.邻近适应:由首次适应算法演变而来
不同之处是分配内存时,从上次查找结束的位置继续查找
3.1.4 非连续分配方式
1、基本分页存储管理方式
进程中的块称为
“页”
;内存中的块称为
“页框”
页表
第一部分是页号,第二部分是物理内存中的块号(页框号)
若页号占了20位,则表示页面上有2^20个页表项
页号类似数组的下标,块号类似值,只有块号占用内存空间
基本地址变换机构
地址变换机构的任务是将逻辑地址转换为内存中的物理地址
①计算页号P,和页内偏移量
②比较页号P和页表长度M,P≥M产生越界中断
③P对应页表项地址 = 页表起始地址F + 页号P * 页表项长度
④计算E = b*L + W
一页1K,2500自然在顺序第三块,对应页号为2,页号2内偏移2500-2048=452
具有快表的地址变换机构
若页表全部放在内存中,则存取一个数据或一条指令至少需要 两次访存
第一次访问页表,确定数据的物理地址,第二次根据地址访问数据。
一般快表的命中率可达90%以上
快表的有效性基于著名的局部性原理
两级页表
2、基本分段存储管理方式
1)分段
进程的地址空间:按照程序自身的逻辑关系划分为若千个段,每个段都有一个段名
(在低级语言中,程序员使用段名来编程),每段从0开始编址
内存分配规则:以段为单位进行分配
,每个段在内存中占据连续空间,但各段之间可以不相邻。
段号位数决定每个进程最多可以分几个段
段内地址位数决定了每个段的最大长度是多少
2)段表
每个段对应一个段表项
,其中记录了该段在内存中的起始位置
又叫基址和段的长度
各个段表项的长度是相同的
段号是可以隐含的,不占内存空间
分段系统的地址转换
分页
的用户进程地址空间是一维的
,程序员只需给出一个记忆符即可表示一个地址。分段
的用户进程地址空间是二维的
,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
分段
比分页
更容易实现信息的共享和保护
分页
对用户不可见; 分段
对用户可见
3、段页式存储管理方式
一个进程中,段表只有一个,而页表可以有多个
例题
页号不占用存储单元,但是页框号占用,所以对应的逻辑地址一个页表项应当加
4B