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

程序装入内存的三种方式

  • 内存
  • 2024-06-15 12:31:29
  • 1832

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