程序的装入与链接
物理地址:主存的绝对地址。
逻辑地址:程序中总是从0开始的地址
程序的装入
编译 链接
源程序 ----------> 多个目标模块
----------> 装入模块(可执行程序)
1.绝对装入方式:程序中使用物理地址,只适用于单道程序环境
2.静态重定位装入方式:装入时将所有逻辑地址换成物理地址,运行时程序不能被移动。
3.动态重定位装入方式:运行时才将当前指令中的逻辑地址换成物理地址,采用地址转换机制实现,需要一个基址寄存器,程序可浮动。
程序的链接
1.静态链接:即直接链接成一个装入模块(可执行程序)
2.装入时动态链接:在装入时才链接所有外部模块,这样可以实现共享(比如dll)
3.运行时动态链接:运行过程中需要时才去链接,可避免默认链接到那些根本没有使用到的模块。
内存管理方式
一、连续存储管理
1.单一连续存储管理
只允许一个作业装入主存。
2.固定分区存储管理
划分多个固定大小的分区,一个作业只能装入一个分区中且一个分区只能装一个作业。
3.可变分区存储管理
弄两个表:已分配分区表和空闲分区表。
分配算法:
最先适应算法:顺序查找空闲分区表,一旦找到马上分配
最优适应算法:总是找那个能满足但尽量小的分区
最坏适应算法:
总是找那个能满足且尽量大的分区
二、页式存储管理
一个程序的所有逻辑地址表示的是一个连续的内存空间,我们把这个内存空间等分为一页一页,分别为第0页,第1页,......,第n页。那么对于某一页内的一个基本内存空间(不可再分),只需要知道该页号还有页内偏移量就可以找到它,所以我们把逻辑地址拆成两部分,第一部分表示页号,第二部分表示页内地址,如下:
由上面可知每一页的大小为2^12即4KB(最小单位是字节)。
现在把内存空间也等分为一块一块,且大小与一页的大小一致,那么以后内存空间中的一块就刚好放程序中的一页数据。而且页的存放位置可以是任意的,不必相邻。
现在程序运行过程中,手头上有一个逻辑地址,根据上面的格式我们知道这个逻辑地址指向的是第几页,页内偏移量多少的那个地址空间,但我们并不知道这一个放到主存哪一块(即我们推不出物理地址),因此需要有一个表专门用来记录程序的哪一页是放在主存的哪一块这个信息,这个表叫页表,如下:
页号 块号
0
|
10
|
1
|
3
|
2
|
29
|
3
|
21
|
...... |
......
|
页表的数据是在程序装入时(动态重定位装入方式)填写的。
举个例子:给个逻辑地址00000000
0000000000000001 000000000100,我们可以算出页号为1,页内地址为4,查页表知页号1放在块号为3的主存中,因此物理地址为000000000000000000000011 000000000100。
对于主存划分的那么多块,可以采用位示图法记录每一块的使用情况(已用或未用)。
快表:利用高速缓冲寄存器存放页表的一小部分,称这部分为快表。
二、段式存储管理
将程序分成若干个段,每一段有一个段名,段号从0开始,将逻辑地址分拆为如下格式:
由于段大小时可以不一样的,因此以上格式的2^16就是段的最大长度。
段表一般长这个样子:
段号
|
段长
|
基址
|
0
|
30KB
|
40KB
|
1
|
20KB
|
80KB
|
......
|
......
|
......
|
段表的数据也是在程序装入时(动态重定位装入方式)填写的。
例子:给一个逻辑地址:0000000000000001 0000000000000011,其中段号为1,段内地址为3,查段表知段号1的基址为80KB即
10100000000000000,因此物理地址为
10100000000000000 0000000000000011,注意判断是否越界(3<20KB不越界)。
三、段页式存储管理
对于每一个段,采用页式进行管理。因此对于一个作业,需要一张段表,和n张页表(n为段数)。
虚拟存储管理
虚拟分页式存储管理分为请求分页式管理和预调入页式管理。
请求分页式管理:当发现需要的页不在主存时产生缺页中断然后调入(或页面置换)。
预调入页式管理:预测并调入可能的页。
请求分页式管理
1.页表格式:
状态位:表示是否在主存中。
修改位:是否被修改,如果被修改则需要写会磁盘。
2.缺页中断机构
要先保护现场,然后判断是否有多余的主存块可以放置待会要调入的页,有就调入并恢复现场然后继续执行,没有就进行页面置换,找到要被调出的页,如果它已被修改过则先写会磁盘,然后调出,再调入我们需要的页。
3.页面置换算法
(1)最佳置换算法(OPT):
调出以后最长时间不使用的页面。
(2)先进先出算法(FIFO):调出最先进入主存的页面。Belady现象。
(3)最近最少用算法(LRU):
调出最长时间没有使用的页面。这里的“少”是没有使用的意思。基于局部性原理。
(4)时钟置换算法:简化LRU,设置超时时间。
(5)最近最不常用算法(LFU):调出访问次数最少的页面。