一、内存的基础知识
1、装入方式
绝对地址:内存中的地址,使用这个地址能够直接找到进程在内存中的储存位置。
相对地址:进程内部的编制,知道进程的起始地址可以使用相对地址找到其他的进程。
静态装入:程序在形成装入模块是就按照内存中空缺的已知的地址进行编制,只适用于单道程序。
静态地址重定位装入:在形成装入模块时按照已知的相对地址进行组合,在形成的模块装入内存时按照在内存中分配的绝对地址进行装入,即在装入时给这个程序的存储位置一个新的绝对地址,之后cpu调用这个程序使用这个绝对地址。
动态地址重定位:程序从外存中调入内存中时各程序的内存地址不改变,在程序从内存中调入cache或者cpu中时发生地址的改变,即使用重定位地址寄存器完成内存地址的转变
2、链接方式
静态链接:在编译之后程序从外存调入内存时把所有需要的模块一次拷贝并进行链接放入内存
装入时动态链接:在编译后程序从外存调入内存不进行拷贝,在程序装入时进行连接。
运行时动态链接:程序在运行的时候需要什么调用什么模块在进行该模块的调用和链接。
以下是别人对这个的简单理解
pro A
{
if(case1)
call B;
if(case2)
call C;
}
pro B
{
call D;
}
pro C
{
call D;
}
静态链接方式下
+---------+
| A |
+---------+
| B |
+---------+
| D |
+---------+
| C |
+---------+
| D |
+---------+
每个应用模块都必须含有其目标模块的拷贝,无法实现对目标模块的共享。
装入时动态链接
+---------+
| A |
+---------+
| B |
+---------+
| D |
+---------+
| C |
+---------+
装入时动态链接方式,OS则很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。
运行时动态链接
+---------+
| A |
+---------+
| B |
+---------+
| D |
+---------+
或者
+---------+
| A |
+---------+
| C |
+---------+
| D |
+---------+
根据运行时候的情况定
二、内存空间的分配和回收
1、连续分配
单一连续分配
在内存中的用户分区中只允许一个程序在内存中运行,有内部碎片
固定分区分配
把内存中的用户分区固定的划分为几个不同的区域,有两种划分方式一种是每一个区域的内存大小相同,另一种是根据实际的需求将内存区域划分成大小不同的储存区域。在使用的时候根据分区表进行查询,若该分区已被使用则在分区表中标注已分配,若该区域未被使用则在分区表中标注未分配。
动态分区分配
根据实际情况分配内存中的用户区,在第一次分配时按照进程的大小依次分配内存空间,直到剩余的用户去不足以下一次的分配,这时外存的进程进入等待状态,知道内存中的进程短期内不执行或者已经执行结束,使用中级调度将内存中的进程和外存中的进程进行交换,这时内存中的用户区可能被划分为不连续的间断的区间,这时就涉及到对于内存中的区域的对调入内存中的进程的分配,需要使用四种算法对这些空间进行分配。
首次适应算法
按照空闲用户区间内存地址依次排序,然后根据进程的大小找到第一个刚好能够装下这进程的“仓库”,该算法成功。
临近适应算法
对于首次适应算法的改进,该算法会在首次适应算法的基础上加一个指针指向上次执行该算法的所查找到的地址,下次算法执行从该地址开始。并且最后一个区间链和第一个区间链之间有链接之间形成一个环路。
最佳适应算法
区间链按照容量大小从小到大排列依次查找直到找到第一个刚好大于该进程的区间。
最坏适应算法
区间按照从大到小依次排列。
2、非连续分配
基本分页管理
把内存按照4kB或者其他的大小分成确定的区域,每一个区域叫做一个内存块或者叫做页框、页帧、物理块。
把进程按照同样的大小分成确定的块叫做页,页面。把这些页或者页面非连续的储存到内存中便实现了内存的非连续分配,这样一般没有外部碎片,但会有内部碎片。
页面的逻辑地址:页号+页内偏移量
页号的大小P:为当前内存中有多少个内存块,即页框的位数
操作系统实现页面从逻辑地址到物理地址的转换:
页号(和页表寄存器中的页表长度进行比较看是否合法)-页表寄存器-页表的起始地址-按照页号查找-页号对应的页表地址-该页的内存块地址。
若是使用快表,则由硬件计算出页内偏移量,直接根据逻辑地址去页表中查询,若是命中得到内存块地址直接访问内存,若是没有命中则再去页表寄存器访问页表(慢表)。
二级分页表
在32位操作系统中,若一个页表项需要3B的内存空间,在一个4GB,每个页的大小时4KB的内存中,有2的20次方个页,因此页表的大小位3MB的连续空间,对内存来说是一块很大的连续内存,因此为了避免页表的大小过大,可以使用二级页表来表示,即在32位的的电脑中,可以让逻辑地址的前十位表示一级页表,中间十位表示二级页表剩下的表示页内偏移量,即每一级页表最多有1024个页表项。
在逻辑地址转换上二级页表需要访存三次内存,首先根据逻辑地址访问页表寄存器,同时比较一级页表是否超出页表大小,然后根据一级页表的首地址访问一级页表,取的二级页表的内存块地址,去内存中查找二级页表,根据二级页表号和业内漂移量得出内存的物理地址,根据物理地址进行第三次访存。
基本分段管理
段页式储存管理
三、内存空间的扩充
1、覆盖技术
目标是在较小的内存中运行较大的程序,常用于多道程序系统,与分区存储管理配合使用
原理:
把程序按照其自身逻辑结构,划分 为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享一块内存区域,按时间先后来运行。
必要部分(常用功能)的代码和数据驻内存
可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时装入内存。
2、交换技术
目标
多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源
方法
可将暂时不能运行的程序送入外存中,从而获得空闲内存空间
操作系统把一个进程的整个地址空间的内容保存到外存中(换出),而将外存中的某个进程的地址空间读入内存中(换入),换入还出内容的大小为整个程序的地址空间。
覆盖技术和交换技术二者比较
覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构
交换技术是以内存中的程序大小为单位进行的,它不需要程序给出各个模块的逻辑覆盖结构。
交换发生在内存中程序与管理程序或者操作系统之间,覆盖则发生在运行程序的内部。
3、虚拟内存
四、地址转换
五、内存保护