gpt4 book ai didi

c - 启动时是否将整个静态程序加载到内存中?

转载 作者:IT王子 更新时间:2023-10-29 00:24:20 25 4
gpt4 key购买 nike

在 Mac、Windows、Linux、iOS 等典型计算机上,当用户启动程序/二进制文件/应用程序时,程序的静态部分是否总是在执行开始之前完全加载到内存中?这是否包括程序中的所有数据段/部分,如字符串和任何其他嵌入的 BLOB 数据?假设我将一个巨大的图像文件嵌入到二进制文件中(例如在 __DATA 段中)。此图像数据是否会在启动时完全加载到内存中?

最佳答案

在 OS X、Windows、Linux 和 iOS 下,可执行文件在执行时不会加载到 RAM 中。相反,可执行文件被映射到进程的虚拟地址空间。当进程访问尚未加载到 RAM 中的可执行文件的映射页面时,CPU 会生成页面错误,操作系统通过将页面读入 RAM 来处理该页面错误。

因此,如果您将一个巨大的图像文件放入可执行文件的数据部分,在您的程序首次访问它之前,它不会被加载到 RAM 中。一个巨大的图像文件可能占用多页内存(通常大小为 4K),因此如果您的程序只访问图像的一部分,则只有一部分图像会被加载到 RAM 中。

请注意,在 Windows 和其他操作系统下,有一个重要的异常(exception)。在 Windows 下,称为预取器的操作系统服务将开始将它预测程序将在启动期间访问的任何文件的部分预加载到内存中。它根据记录的程序先前运行的启动访问模式做出这些预测。由于“任何文件”包括可执行文件本身,以及它使用的任何 DLL 或数据文件,这意味着当进程启动时,可执行文件的一部分将被预加载到 RAM 中。这也意味着如果程序通常在程序启动时显示大图像(例如启动画面),那么预加载器会将图像加载到 RAM 中,无论它是作为可执行文件的一部分存储还是作为单独的数据文件存储。

关于c - 启动时是否将整个静态程序加载到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31722881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com