运行类似软件时内存占用更少?

运行类似软件时内存占用更少?

我经常想问一个问题。如果一个类似的程序已经在运行,那么该程序是否会占用更少的 RAM 内存?

我所说的“类似”是什么意思?好吧,例如,我想知道是否有任何 Chromium 衍生产品和 Atom 同时运行。Atom 的底层不是 Chormium 浏览器吗?因此,如果它们在某个时候使用相同的库,与运行其他假设的编辑器或浏览器(其内存消耗与 Atom 或 Chromium 相同)相比,它是否节省了内存?

另一个例子:Firefox 和 Thunderbird - 有什么节省吗?

操作系统难道不应该如此聪明,能够识别类似的依赖关系,然后节省内存吗?

答案1

是的,它们占用的内存更少。实际上,您举的 Chromium 与 A​​tom 的例子就完美地说明了这一点。两种浏览器都使用 WebKit 库来呈现网页。如果两种浏览器都使用相同版本的 WebKit 库,则操作系统只会将其一个副本加载到内存中供它们使用。此过程称为动态链接,因此在 Windows 上称为动态链接库 (DLL)。Linux 只是将它们称为“库”。

您运行的几乎每个程序都会将其大量功能外包给某种外部库。当程序调用库中的某个函数时,操作系统会将库的副本加载到内存中,然后将该函数的地址映射到程序的内存空间中。

假设程序 X 调用库 A 中的函数。操作系统将库 A 加载到内存中,并为程序 X 提供指向其所需函数的指针。现在假设程序 Y 也调用库 A 中的相同函数。由于库 A 已经在内存中(因为程序 X 正在使用它),因此操作系统不会再次加载它。它只是将另一个指针传递给程序 Y。

值得注意的是,程序 X 和程序 Y 都引用了库 A 中的同一个函数,但都不知道对方正在使用该函数。它们都认为该函数被映射到自己的内存空间中。操作系统正在为每个程序动态地将虚拟化指针地址转换为实际值。操作系统实际上是在欺骗它们,告知它们哪个内存地址对应于该函数。

现在,假设程序 X 修改了该函数所占用的内存中的一些字节。由于内存在两个不同的程序之间共享,因此操作系统会对该函数进行第二次复制,以便程序 Y 不受更改的影响。此时,该函数现在被加载到内存中两次。但是,这两个程序都不知道这一点。程序 X 和 Y 只是继续执行它们的工作,操作系统负责处理哪个程序获得哪个副本。这种技术称为写时复制

这样,许多程序都可以在给定内存的同一副本上工作,而无需在 RAM 中拥有多个副本。这种内存虚拟化是很难正确计算系统中实际使用了多少 RAM 的原因之一。

许多软件供应商都有自己使用的内部函数库,因此即使两个程序完全不相似(例如 Firefox 和 Thunderbird),但它们来自同一供应商(在本例中为 Mozilla)这一事实增加了它们能够使用共享内存来实现其功能的可能性。

相关内容