程序是由用户编写的一系列指令,它们指示计算机执行解决某些问题的任务。现在,我们将详细了解程序在执行之前所经历的各个步骤。该程序作为二进制可执行文件驻留在磁盘上。为了运行程序,必须将其从磁盘带入主存储器(因为CPU可以直接访问的唯一存储位置是-主存储器和寄存器-在一个CPU周期或更短的时间内访问寄存器, (主存储器可能需要花费很多时间)。现在,让我们知道程序要执行的详细步骤,以便完成前一个任务。
当将要执行的程序从磁盘带到主存储器时,它将放置在进程(基本上是正在执行的程序)的上下文中,在该上下文中可以在CPU上执行该程序。在执行过程中,它从内存访问数据和指令,一旦执行完成,进程将终止,内存将被回收以供另一个进程使用。
源代码中的地址通常是符号性的(如变量计数)。编译器将这些地址绑定到可重定位的地址,并由链接器或加载器将其绑定到绝对地址(绑定-从一个地址空间映射到另一个地址空间)。
指令和数据到存储器地址的绑定可以在程序执行的以下任何步骤中完成:
- 编译时间:
如果我们最初在编译时就知道进程在内存中的位置,那么可以生成绝对代码。如果起始位置发生更改,则必须重新编译代码。 - 载入时间:
如果在编译时未知进程所在的内存地址,则编译器必须生成可重定位的代码(没有可运行的静态内存地址)。如果起始地址更改,则必须重新加载程序以合并该值。 - 执行时间处理时间:
如果进程可以在执行期间从一个段移动到另一个段,则必须将绑定延迟到执行时间。这种类型的装订需要特殊的硬件(在下面讨论)。
逻辑地址与物理地址:
逻辑地址是CPU生成的地址,而物理地址是存储单元看到的地址(即加载到内存的内存地址寄存器中的地址)。用户程序处理逻辑地址,而用户永远看不到物理地址。
在编译时或加载时绑定地址(如上所述)会生成相同的逻辑和物理地址,而在执行时完成绑定地址的情况并非如此。在后一种情况下,生成的物理和逻辑地址是不同的。在这种情况下,逻辑地址称为虚拟地址。在运行时,称为内存管理单元(MMU)的硬件设备会执行从虚拟地址到物理地址的映射。
动态加载用于更有效地利用内存。动态加载的优点是仅在需要时才加载特定例程。动态链接库(DLL)是在运行程序时链接到该程序的系统库。这是从源代码阶段到执行的用户程序多步骤处理的总体简要概述。所附的图准确地描述了程序的多步骤处理。