静态重定位:
静态重定位是指程序在编译链接阶段,将程序中的符号地址转换为实际的物理地址。
在静态重定位的情况下,程序在运行时不会改变其所需的内存地址,因为所有的地址已经在编译链接阶段确定下来。这意味着程序在加载到内存后,其各个部分的位置是固定的,不会发生变化。
动态重定位:
动态重定位是指程序在运行时,能够根据需要调整其内存地址空间中的部分内容。
当程序执行时,操作系统会根据动态链接库、虚拟内存等机制,将程序加载到内存中的某个位置,并可以根据需要在运行时进行地址重定位。
动态重定位使得程序在运行时更加灵活,能够适应不同的内存布局和其他程序的加载情况。
实现动态重定位需要重定位寄存器的支持,存储了当前程序或进程在内存中的基地址,用于动态地调整程序中指令的地址,以实现程序的重定位和正确访问内存中的数据或指令。
静态内存分配:
内存静态分配是指在程序编译阶段确定程序中变量、数组等数据结构的内存大小和位置,这些内存分配是固定的,直到程序结束才会释放。
静态分配的内存通常包括全局变量、静态变量以及在函数中使用 static
关键字声明的变量。
静态内存分配一般是在栈区分配。
动态内存分配:
内存动态分配是指程序在运行时根据需要动态地分配内存空间,通常使用像 malloc
、new
这样的函数或者操作符来进行动态内存分配。
动态分配的内存可以在程序运行时根据需要进行分配和释放,使得程序能够更加灵活地管理内存资源。
动态内存分配一般在堆区分配。而且动态内存分配更容易产生内存碎片。
解决内存碎片问题的一种有效的方法是移动内存中所有进程的存储区,使它版们相互邻接并权位于内存的某一端,而把全部空闲区留在另一端,形成一个大的空闲分区,这种技术称为“紧凑”。由于经过紧凑后的用户进程在内存中的位置发生了变化,必须采用动态重定位的方法,因此可重定位分区是解决内存碎片问题的有效方法。