如果我 运行 相同的程序两次,那部分内存将被共享

if I run same program twice which part of memory will be shared

我在上面的一个职业论坛中看到有人在面试时问我这个问题,但我看到了不同的答案。很高兴知道 SO 的专家怎么说。

我想所有的内存都会被清除,它会在第一个程序执行时重新开始。

none 的虚拟内存将被共享。

加载器'may'重新使用相同的物理内存页 它 'may' 重新使用一些物理内存页面 并且它 'may' 不会重复使用任何物理内存页。

全看现在'memory load'

你了解'mapped'内存页和'virtual'地址的概念吗? 'virtual' 内存如何?内存页'working set'的概念如何?

总的来说,这些概念导致:

你的程序在物理内存中的地址是不确定的。

您的程序在虚拟地址 space 中的地址从一次执行到下一次执行可能是相同的。

这个问题唯一合理的答案是:
"This question has no reasonable answer. The short answer is:'Nothing.', which is more or less true, depending on the underlying hardware and operating system - if there is actually one, which isn't necessary. For the C language itself, if this is a C language question, only memory that is declared static or has an explicit initializer, will have values set when it starts, so any other variable has a theoretical chance of containing values from a previous run."

I think all the memory will be cleared

面试官可能会钓到这样的答案。谁会清除它,为什么?

这个问题的答案完全取决于操作系统。某些系统具有进程 运行 相同应用程序(或库)共享相同副本的机制。其他人没有。

旧的多用户系统比今天更常见的系统更适合这个。

如果同时执行(假设同一个程序运行),文本区域(包含代码位)很可能是共享的。这是因为虽然两个进程的虚拟地址不同,但是到内核中文本区域的映射可以共享给下一次执行相同的二进制文件。 程序的其他区域(如数据、堆栈等)对于未共享的流程执行实例是唯一的。