在Mac,Windows,Linux,iOS等典型计算机上,当用户启动程序/二进制/应用程序时,程序的静态部分是否始终在执行开始之前完全加载到内存中?这是否包括程序中的所有数据段/部分,如字符串和任何其他嵌入式BLOB数据?假设我将一个巨大的图像文件嵌入到二进制文件中(例如在__DATA段中)。这个图像数据在发布时是否会完全加载到内存中?
答案 0 :(得分:12)
在OS X下,Windows,Linux和iOS可执行文件在执行时不会加载到RAM中。而是将可执行文件映射到进程的虚拟地址空间。当进程访问尚未加载到RAM中的可执行文件的映射页面时,CPU会通过将页面读入RAM来生成操作系统处理的页面错误。
因此,如果您在可执行文件的数据部分放置一个巨大的图像文件,它将无法加载到RAM中,直到您的程序首次访问它为止。一个巨大的图像文件可能需要多页内存(通常为4K大小),因此如果您的程序只访问部分图像,则只会将部分图像加载到RAM中。
请注意,在Windows和其他操作系统下,这是一个重要的例外。在Windows下,一个名为prefetcher的操作系统服务将开始将预测程序将在启动期间访问的任何文件的部分预加载到内存中。它根据先前运行程序的记录启动访问模式进行这些预测。因为"任何文件"包括可执行文件本身,以及它使用的任何DLL或数据文件,这意味着当进程启动时,可执行文件的一部分将被预加载到RAM中。这也意味着如果程序通常在程序启动时显示大图像(例如,启动画面),则预加载器会将图像加载到RAM中,无论它是作为可执行文件的一部分存储还是作为单独的数据文件存储。