当前位置:首页 > 内存 > 正文

存储器管理的内存扩充功能

  • 内存
  • 2024-08-24 11:29:26
  • 3821

一、内存管理的基本问题内存管理
操作系统对内存的划分和动态分配就是内存管理的概念。有效的内存管理在多道编程中非常重要。它不仅方便用户使用内存,提高内存利用率,还可以通过虚拟技术实现内存的逻辑扩展。内存管理的功能包括:
内存空间的分配和回收
地址转换:在多道程序环境中,程序中的逻辑地址和内存中的物理地址不能保持一致,所以存储管理必须提供地址转换功能,将逻辑地址转换为对应的物理地址。
内存空间的扩展:利用虚拟存储技术或自动覆盖技术,对内存进行逻辑扩展。
存储保护:保证每个作业运行在自己的存储空间中,互不干扰。
程序加载和链接
要创建进程,必须首先将程序和数据加载到内存中。将用户源程序变成可以在内存中执行的程序通常需要以下步骤:
编译:编译器将用户源代码编译成若干目标模块。
链接:链接器将一组已编译的目标模块和所需的库函数链接在一起,形成一个完整的加载模块。
加载:加载程序将加载模块加载到内存中并运行。
程序的链接有三种方式:
静态链接:在程序运行之前,将各个目标模块及其所需的库函数链接成一个完整的可执行程序以后不会被拆解。
加载时动态链接:将用户源程序编译后得到的一组目标模块,采用加载链接的链接方法加载到内存中。
运行时动态链接:链接到某些目标模块是在程序执行过程中需要时才链接到目标模块。优点是易于修改和更新,并且易于共享目标模块。
模块加载到内存时,也有以下三种方法:
绝对加载。在编译时,如果知道程序将驻留在内存中的某个位置,则编译器将生成具有绝对地址的目标代码。绝对加载器根据加载模块中的地址将程序和数据加载到内存中。由于程序中的逻辑地址与实际的内存地址完全相同,因此无需修改程序和数据的地址。
可重新定位装载。在多道程序环境中,多个目标模块的起始地址通常从0开始,程序中的其他地址都是相对于起始地址的。在这种情况下,应该使用可重定位加载方法。根据当前内存的情况,将加载模块加载到内存中合适的位。加载过程中修改目标程序中的指令和数据的过程称为重定位。地址转换通常在加载时完成一次,因此也称为静态重定位。静态重定位的特点是,当一个作业被加载到内存中时,它所需要的所有内存空间都必须被分配。如果内存不足,则无法加载作业。另外,作业一旦进入内存,在整个运行过程中就不能在内存中移动,也不能申请内存空间。
动态运行时加载也称为动态重定位。如果程序在内存中移动,就需要使用动态加载。将加载模块加载到内存后,加载器并不会立即将加载模块中的相对地址转换为绝对地址,而是将这种地址转换推迟到程序实际执行时。因此,加载到内存后的所有地址都是相对地址,这种方法需要重定位寄存器的支持。动态重定位的特点是可以将程序分配到不连续的存储区域;在程序运行之前,只能加载其部分代码并投入运行,然后在程序运行过程中,根据需要动态分配内存;方便程序的共享,可以为用户提供远大于存储空间的地址空间。