【发布时间】:2010-10-15 22:37:56
【问题描述】:
我试图对程序生命周期中从源代码到执行的不同阶段进行高级描述。
积分:
- 预处理:在此阶段处理宏、包含文件和编译器指令。
- 编译:源文件编译成obj文件
- 链接器:不同的 obj 文件链接到单个可执行文件。在这个阶段,虚拟地址被分配给可执行文件中的函数、变量和数据。对于 32 位机器,每个进程有 4GB 的地址空间。 1-2 GB 是为操作系统保留的。因此 2-3 GB 的地址空间可以分配给任何进程。
- 执行:在程序执行期间,加载程序进入画面。它基本上将程序从虚拟地址空间加载到物理内存地址。所以当进程开始执行时,操作系统会为进程分配内存并调用它的main函数。
问题:
-
如果一个程序二进制图像大小为2MB,那么是否必须将完整的二进制图像加载到物理内存中才能执行程序?我的理解是程序必须完全加载到物理内存中才能执行。不可能在具有 256 MB 物理内存的机器上运行大小为 512MB 的程序。只有当程序的内存需求增长时,虚拟内存和分页才有用。
-
当程序请求更多内存时,即当它使用 new/malloc 分配堆内存时,内存将保留在虚拟地址空间中。在被引用之前它不会被提交。
如果您觉得我的理解有误,请指出。
有没有什么文章或博客可以给我一两页对整个过程的高级描述?
【问题讨论】:
-
这不是语言无关的。 Java 没有宏。 Python 几乎不做这些。这是特定于 C 和 C++ 的。
-
或其他类似编译模型的语言,如FORTRAN、Pascal等
标签: operating-system