【问题标题】:How is a C++ program loaded into memoryC++程序如何加载到内存中
【发布时间】:2020-04-04 14:05:52
【问题描述】:

如果我用 static.lib 静态编译一个可执行的 prog.exe 当 prog.exe 运行时,它会加载 prog.exe 的所有二进制文件,包括 static.lib 吗?

第一次加载 prog.exe 时,对于静态和全局变量,是否使用 RAM 上的内存?

地址的内存分配发生在编译时和运行时,这些内存地址被占用了吗?

相同的虚拟地址是否映射到不同的物理内存地址?

听说不经常访问的变量不会出现在RAM而是硬盘,这个不经常访问变量的信息是怎么存储的,是不是存储在prog.exe中var1不经常访问应该存储在硬盘中?

需要的时候从硬盘加载?

【问题讨论】:

  • 取决于可执行格式。对于 ELF,请参阅 lwn.net/Articles/631631
  • 它与编程语言无关,取决于操作系统。但一般来说,单独的变量不存在,如果不经常使用也不会放在磁盘上。如果内存不足且未使用,内存块可能会被分页,但这是另一回事,与变量无关。

标签: c++


【解决方案1】:

通常,可执行文件是内存映射的,类似于映射“普通”数据文件的方式。当进程试图访问内存中尚不存在的映射页面时,它会陷入操作系统,该操作系统负责从磁盘读取数据并将其放入 RAM。

对于静态变量,程序加载器会在调用 main() 之前分配它们。

【讨论】:

    【解决方案2】:

    如果我用 static.lib 静态编译一个可执行的 prog.exe 当 prog.exe 运行时,它会加载所有包含 static.lib 的 prog.exe 的二进制文件吗?

    程序可以部分加载到 RAM 中。按需加载程序的一部分是操作系统的工作。其机制是page fault

    第一次加载 prog.exe 时,对于静态和全局变量,是否使用 RAM 上的内存?

    是的

    地址的内存分配发生在编译时和运行时,这些内存地址被占用了吗?

    操作系统通常无法知道一个进程需要多少内存。

    相同的虚拟地址是否映射到不同的物理内存地址?

    是的,这个概念叫做virtual memory

    听说不经常访问的变量不会出现在RAM而是硬盘,这个不经常访问变量的信息是怎么存储的,是不是存储在prog.exe中var1不经常访问应该存储在硬盘中?

    我认为没有任何操作系统可以做到这一点。这将是非常低效的。类似的事情是swap partition

    【讨论】:

    • 但是如果有多个程序,怎么能全部加载到主存RAM中,其中一些程序必须驻留在HDD中?如何决定程序的哪些部分驻留在 HDD 中?还是每个程序都部分加载到程序结束?
    • HDD 用于非易失性存储。程序在 HDD 中。在运行之前,它也会(至少部分)加载到 RAM 中。可以同时运行成百上千个程序,它们都可以加载到 RAM 中。操作系统决定加载程序的哪一部分以及何时加载。
    猜你喜欢
    • 2011-04-12
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多