Operating system 项目阶段的高级描述

Operating system 项目阶段的高级描述,operating-system,Operating System,我试图对程序生命周期中从源代码到执行的不同阶段进行高级描述 要点: 预处理:在此阶段处理宏、包含文件和编译器指令 编译:源文件被编译成obj文件 链接器:不同的obj文件链接到单个可执行文件。在此阶段,虚拟地址被分配给可执行文件中的函数、变量和数据。对于32位机器,每个进程有4GB的地址空间。操作系统预留1-2GB。因此,2-3 GB的地址空间可以分配给任何进程 执行:在程序执行期间,加载器进入画面。它基本上将程序从虚拟地址空间加载到物理内存地址。所以,当进程开始执行时,操作系统为进程分配内存

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


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

  • 问题:
  • 如果一个程序的二进制映像大小是2MB,那么完整的二进制映像是否必须加载到物理内存中以执行程序?我的理解是,程序必须在物理内存中完全加载才能执行。在物理内存为256 MB的机器上,无法运行大小为512MB的程序。只有当程序的内存需求增长时,虚拟内存和分页才有帮助

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


  • 请指出我的理解有误的地方。
    有没有任何文章或博客可以给我一个一到两页的整个过程的高层描述

    1) 所以如果一个程序的二进制图像大小是 2MB,那么是完整的二进制文件吗 图像必须加载到物理文件中 用于程序执行的内存?根据我的 理解该程序必须是必要的 在物理内存中完全加载 处决这是不可能的 在计算机上运行大小为512MB的程序 具有256 MB物理内存的计算机 . 仅当 程序增长,然后虚拟内存和 分页是有帮助的

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

    2) 当程序要求更多内存时 当它使用 新建/malloc,则保留内存 在虚拟地址空间中。不会的 获取提交,直到它被引用


    不一定——运行时可以预先请求一个大数据块并立即提交,然后分配提交的内存。我不知道有什么能真正做到这一点,但整个领域都依赖于实现。

    在第4项下,我想您可能没有注意到,这是程序从某些物理存储(例如磁盘或服务器)复制到操作系统内存中的地方。这和你说的不太一样,因为在我看来,物理和虚拟内存是操作系统的一部分


    关于第一个疑问,我认为不一定。考虑一下,如果我开始运行一个游戏,它有一个初始的时间用来加载文件,它是同一个可执行文件的一部分,所以有运行的东西告诉O/S来加载文件。

    < P>这看起来不是我语言不可知的,因为很多语言没有任何与预处理阶段对应的语言。然而,从一开始它就相当准确

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

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

    如果程序一次只使用其地址空间的一部分(“工作集”),并且该部分的页面数足够少,因此它们可以同时存放在物理内存中,那么这种方法很有效。如果它不断引用超过物理内存所能容纳的页面,那么页面就必须不断地从磁盘读入(“抖动”),性能会急剧下降,并且磁盘处于恒定负载下

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

    因此,可以使用256M的物理内存运行512M程序


    当从堆请求内存时,它被分配到内存位置。至少C和C++标准要求它是可用的,除非请求失败,所以“提交”看起来是一个奇怪的选择词。在使用之前,它不必在物理内存中。

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

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

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

    你的问题的答案是: