内存管理的基本原理和要求
操作系统必须对内存空间进行合理的划分和有效的动态分配,而这就是内存管理的概念。有效的内存管理在多道程序设计中可以方便用户使用存储器、提高内存利用率。
内存管理的主要功能有:
- 内存空间的分配和回收
- 地址转换:将逻辑地址转化为物理地址
- 内存空间的扩充:利用虚拟存储技术或者自动覆盖技术从逻辑上扩充内存
- 内存共享:允许多个进程访问内存的统一部分
- 存储保护:保护各道作业在自己的存储空间运行,互不干扰
1.程序的链接与装入
将用户源程序变为可在内存中执行的程序需要三个步骤:
- 编译:将源代码编译成若干个目标模块
- 链接:通过链接程序将编译后的一组目标模块以及所需的库函数连接起来,形成一个完整的装入模块
- 转入:将装入模块装入内存
程序的链接有以下三种方式:
(1)静态链接:程序运行之前,将各个目标模块连接起来,以后不再拆开
(2)装入时动态链接:在装入内存的时候采用边装入边连接的方式
(3)运行时动态链接:在程序执行中需要该目标模块才进行链接。可以加快程序装入过程和节省大量内存空间。
内存的装入模块在装入内存的时候,有以下三种方式:
-
绝对装入
这种方式在编译时就知晓程序在内存中的位置,然后编译器会将程序内所有的相对地址单元替换成绝对地址。由于多道程序执行的异步性,这种方式只适合单道程序环境
-
可重定位装入
编译时对相对地址不做处理,在装入时根据现在内存的使用情况,将程序装入到适当的内存位置中,然后获取到当前内存地址的起始地址。因此程序需要一次性全部装入内存中,如果内存空间不够就无法装入,在装入后地址也不会发生移动
-
动态运行时装入
程序在内存中如果发生移动,则需要动态装入方式。装入程序在把装入模块装入内存后,不立刻将装入模块中的相对地址转化为绝对地址,而是在运行时才进行转换。在进程取得处理机开始运行时,一个地址寄存器从PCB中获得程序头的位置,在运行时的时候将地址寄存器和程序中的相对位置相加就可以得出物理地址。现在绝大部分操作系统都是使用动态运行时装入
优点是可以将程序分配到不连续的存储器,在程序运行之前只需要装入部分代码就可运行,在程序运行期间根据需要动态申请内存分配。
2.逻辑地址和物理地址
3.进程的内存映像
当一个程序掉入内存运行时,就构成了进程的内存映像。一个进程的内存映像一般有以下几个因素:
- 代码段
- 数据段
- 进程控制块
- 堆:用来存放动态分配的变量,比如通过malloc函数动态地向高地址分配空间
- 栈:用于实现函数调用
4.内存保护
内存保护是确保每一个进程都有一个单独的内存空间,不被其他进程访问。内存保护主要采用两种方法:
- 在CPU中设置一对上下限寄存器,CPU要访问一个地址的时候,和两个寄存器的值相比,检查是否有越界
- 采用重定位寄存器和界地址寄存器,重定位寄存器存储进程的最小物理地址,而界地址寄存器存储的是最大的逻辑地址。当CPU发出地址访问的时候,只需要用程序的逻辑地址和界地址寄存器做对比就知道是否有越界了。
5.内存共享
并不是所有进程内存空间都适合共享的那个,只有那些只读的区域才可以共享。可重入代码又称为纯代码,是一种允许多个进程同时访问但是不允许被任何进程修改的代码,但是进程可以通过读将纯代码复制回到自己的内存空间中进行修改。纯代码对节省内存空间有显著的效果。
6.内存的分配和回收
后续提到;