内存管理分类如下:
一.地址转换
在上一小节中,我们讲到的模块装入方式,就是从逻辑地址转换为物理地址的方式,我们来回顾一下:
1.绝对装入
绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。(也就是将编译程序中各变量的地址修改为正确的绝对地址)
例如:如果直到装入模块要从地址为100的地方开始存放
装入内存,从100开始装入:
缺点:灵活性很差,只适用于单道程序环境。
2.可重定位装入(静态重定位)
静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
与绝对装入的区别在于,静态重定位是在程序装入内存时,再进行地址转换,将逻辑地址转为物理地址。
静态重定位的特点:
•在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。
•作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
•一般用于早期的多道批处理操作系统。
3.动态运行时装入(动态重定位)
动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
重定位寄存器:
存放了装入模块存放的起始位置,例如下图,起始位置为100。
当CPU访问指令0时,会将其中的逻辑地址79,与重定位寄存器的起始位置相加,得到其访问的地址。
与静态重定位的区别在于,动态重定位装入时依旧保持使用逻辑地址。
动态重定位的特点:
•采用动态重定位时允许程序在内存中发生移动。
•可将程序分配到不连续的存储区中;
•在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;
•便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
二.内存保护
内存保护即操作系统需要保证各进程在各自存储空间运行互不干扰。
这里假设进程1的逻辑地址空间0~179;实际物理地址空间为100~279;
1.设置上、下限寄存器
在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
CPU会根据上下限寄存器中存储的数据,来判断进程访问某个地址时是否越界。
2.重定位寄存器和界地址寄存器
采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
加入进程1想要访问逻辑地址为80的内存单元,首先逻辑地址会与界地址寄存器中的数据对比,若没有超过这一数据,就认为没有越界,再与重定位寄存器中的数据相加,就可以得到实际要访问的物理地址。
三.内存空间的扩充
1.覆盖技术
早期的计算机内存很小,比如 IBM 推出的第一台PC机最大只支持 1MB 大小的内存。因此经常会出现内存大小不够的情况。后来人们引入了覆盖技术,用来解决“程序大小超过物理内存总和”的问题。
覆盖技术将程序分为多个段(多个模块)常用的段常驻内存,不常用的段在需要时调入内存。
内存中分为一个“固定区”和若干个“覆盖区。需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束)。不常用的段放在“覆盖区”,需要用到时调入内存用不到时调出内存。
若程序X中,模块A会依次调用B和C模块,B模块可能会调用D模块,C模块可能会调用E,F模块。因为A不可能同时访问B,C模块,所以可以将B,C模块设置在同一个覆盖区,同理也可以将D,E,F模块设置在一个覆盖区。
所以,采用覆盖技术可以按照自身逻辑结构,让那些不可能同时被访问的程序段共享同一个覆盖区。
采用覆盖技术中用:8K+10K+12K=30K的大小
必须由程序员声明覆盖结构,操作系统完成自动覆盖。
缺点:对用户不透明,增加了用户编程负担。覆盖技术只用于早期操作系统,现在已经不使用这一技术。
2.交换技术
交换(对换)技术就是指,内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
内存紧张时,内存就会将某些进程放入外存,而这些进程的PCB会保留在内存中,并插入到挂起队列中。当内存不紧张了,就可以将这些进程调入内存中。
PCB保留在内存中的原因是用于保存该进程在外存中存放的位置,操作系统根据PCB中存放的信息就可以对进程进行管理了。
补充:
暂时换出外存等待的进程状态为挂起状态(挂起态,suspend)
挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态:
当就绪态被换出内存就称为就绪挂起态,当阻塞态被换出内存就称为阻塞挂起态。
我们之前有讲过高级调度,中级调度和低级调度,那么交换技术就是中级调度使用的一种交换策略,忘记了可以回顾一下:
中级调度就是用来决定哪个处于挂起状态的进程将被重新调入。
1.应该在外存(磁盘)的什么位置保存被换出的进程?
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。
文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;
对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/O速度比文件区的更快。
操作系统(11)----内存管理2:https://developer.aliyun.com/article/1511164