gpt4 book ai didi

linux - 程序退出后二进制文件是否留在内存中?

转载 作者:IT王子 更新时间:2023-10-29 00:34:53 26 4
gpt4 key购买 nike

我知道当一个程序第一次启动时,由于代码不在内存中,它在开始时会出现大量页面错误,因此需要从磁盘加载代码。

程序退出时会发生什么?二进制文件是否保留在内存中?程序的后续调用是否会发现代码已经在内存中,因此不会出现页面错误(假设中间没有任何运行并且页面被写入磁盘)?

在我的 Linux 机器上运行一些实验,答案似乎是否定的。我一遍又一遍地运行某个程序,每次都观察到相同数量的页面错误。这是一台相对安静的机器,所以我怀疑在两次调用之间是否有东西被调出。那么,这是为什么呢?为什么可执行文件不能留在内存中?

最佳答案

这里有两件事需要考虑:

1) 可执行文件的内容很可能保存在操作系统缓存(磁盘缓存)中。虽然该数据仍在操作系统缓存中,但每次对该数据的读取都将命中缓存,操作系统将响应请求而无需从磁盘重新读取文件

2) 当一个进程退出时,操作系统取消映射到一个文件的每个内存页,释放所有内存(一般来说,释放进程分配的所有资源,包括其他资源,如套接字等)。严格来说,物理内存可能会被清零,但并不完全需要(不过,操作系统的安全级别可能需要将不再使用的页面清零 - 可能是 Windows NT、2K、XP 等,请执行此操作 - 请参阅此Does Windows clear memory pages?)。同一可执行文件的另一次调用将创建一个全新的进程,该进程将在内存中映射相同的文件,但第一次访问这些页面仍会触发页面错误,因为最终,它是一个新进程,不同的内存映射.所以是的,页面错误会发生,但与第一个相比,同一可执行文件的第二个实例的成本要低得多。

当然,这只是关于可执行文件的只读部分(包含代码和只读数据的段/模块)。

可以考虑另一种情况: fork 。在这种情况下,每个页面都被标记为写时复制。当每个内存页面上发生第一次写入时,操作系统内存管理器会触发并拦截硬件异常。操作系统确定是否允许写入有问题的页面(例如:如果它是堆栈、堆或任何一般的可写页面),如果是,它分配内存并复制原始内容之前允许进程修改页面 - 为了在其他进程中保留原始数据。是的,还有另一种情况——共享内存,其中确切的物理内存被映射到两个或多个进程。在这种情况下,写时复制标志当然不会在内存页上设置。

希望这能澄清内存页面的情况。

关于linux - 程序退出后二进制文件是否留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712205/

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