程序阶段的高级描述

时间:2009-03-27 13:33:44

标签: operating-system

我试图提出程序生命周期中不同阶段的高级描述,从源代码到执行。


点数:

  1. 预处理:在此阶段处理宏,包含文件和编译器指令。
  2. 编译:源文件被编译为obj文件
  3. 链接器:不同的obj文件链接到单个可执行文件。在此阶段,虚拟地址被分配给可执行文件中的函数,变量和数据。对于32位机器,每个进程都有4GB的地址空间。并且1-2 GB是OS的保留。因此,2-3 GB的地址空间可以分配给任何进程。
  4. 执行:在程序执行期间,加载程序进入画面。它基本上将程序从虚拟地址空间加载到物理内存地址。因此,当进程开始执行时,OS为进程分配内存并调用其主函数。

  5. 问题:

    1. 如果程序二进制映像大小为2MB,那么是否必须将完整的二进制映像加载到物理内存中以执行程序?我的理解是程序必须完全加载到物理内存中才能执行。在具有256 MB物理内存的计算机上运行大小为512 MB的程序是不可能的。只有当程序的内存需求增长时,虚拟内存和分页才会有用。

    2. 当程序要求更多内存时,即当它使用new / malloc分配堆内存时,内存将在虚拟地址空间中保留。在引用它之前,它不会被提交。


    3. 请指出您认为我的理解错误的地方 是否有任何文章或博客可以给我一个或两页的整个过程的高级描述?

5 个答案:

答案 0 :(得分:0)

  

1)因此,如果程序二进制图像大小是   2MB,那就是完整的二进制文件   图像必须加载到物理中   程序执行的记忆?按照我的   理解程序必须   满载在物理内存中   执行。这是不可能的   运行一个大小为512MB的程序   机器具有256 MB的物理内存   。只有在内存要求时   程序增长然后虚拟内存和   分页很有用。

不,大多数(所有?)现代操作系统都按需加载页面。如果页面未被使用,则不会加载。

  

2)当程序要求更多内存时   即当它使用时分配堆内存   new / malloc,然后内存被保留   在虚拟地址空间。它不会   得到提交,直到它被引用。

不一定 - 运行时可以预先请求大块并立即提交,然后将已提交的内存分块。我不知道实际上做了什么,但整个领域都依赖于实现。

答案 1 :(得分:0)

在第4号下,我想您可能会错过这是从某些物理存储中复制程序的地方,例如磁盘或服务器,进入操作系统的内存。这与您说的不完全相同,因为物理和虚拟内存是我操作系统的一部分。

关于第一个疑问,不一定,我想。考虑如果我开始运行一个游戏,即在加载同一个可执行文件的一部分文件时花费了一些时间,因此有一些东西正在运行以告诉O / S加载文件。

答案 2 :(得分:0)

这对我来说并不是所有与语言无关的,因为许多语言没有与预处理阶段相对应的任何内容。但是,它起初相当准确。

您似乎将虚拟地址空间与磁盘文件存储混淆。实际上,它是物理内存的附属物,并以相同的方式工作(性能除外)。它使用磁盘,但与使用文件的方式不同。

你知道物理记忆是如何运作的。虚拟内存是一种以通常透明的方式伪装更大内存的方法。该文件被分为“页面”,并根据需要从磁盘读入页面。物理内存分为“页面帧”,物理内存地址与它当前表示的虚拟地址没有任何关系。显然,如果程序使用的内存多于物理上可用的内存,则必须重复使用页面框架,因此必须回写页面框架的内容(如果从读取时更改),并加载新页面。

如果程序一次只使用其部分地址空间(“工作集”),并且该部分是足够少的页面,因此它们可以同时位于物理内存中,这很有效。如果它经常引用的页数超过物理内存中的页数,则必须从磁盘中读取页面(“捶打”),性能急剧下降,磁盘处于恒定负载状态。

因此,当我编译并链接一个程序时,磁盘上的文件系统中有一个可执行文件。当我执行它时,它被分配一个地址空间,然后它变得更复杂。实际上,它被加载到内存中,以及与用户无关的物理和虚拟内存的数量(除非它没有足够的物理,否则运行速度会非常慢)。

因此,可以运行具有256M物理内存的512M程序。

从堆请求内存时,会将其分配给内存位置。至少C和C ++标准要求它可用,除非请求失败,因此“承诺”看起来像是一个奇怪的单词选择。在使用它之前,它不必在物理内存中。

答案 3 :(得分:0)

第2点不完整。编译器生成汇编为二进制文件的程序集。

第3点是错误的。内核虚拟内存空间预留与链接器无关。内核空间依赖于操作系统。在Windows中它甚至可以配置(臭名昭着的/ 3GB开关)。

第4点错了。可执行映像映射到虚拟内存中。它实际上并没有“加载”。

你的问题的答案:

  1. 程序映射到虚拟内存,而不是物理内存。然后,虚拟内存管理器(VMM)负责确保在需要时内存在物理内存中。
  2. new / alloc请求堆内存。堆是虚拟内存的抽象,以最小化内存分配可能产生的内核切换量。如果堆太小而无法满足分配请求,则堆将增长,从而导致虚拟内存分配。页面由堆管理器自行决定。

答案 4 :(得分:0)

使用内存映射文件加载DLL和可执行文件,因此它们实际上并未复制到RAM,它们仍然在磁盘上,只是将其字节映射到进程的虚拟地址空间。