同时启动多个应用程序有什么缺点吗?

同时启动多个应用程序有什么缺点吗?

基本上,我想知道像缓存局部性这样的原则,即访问连续的内存片段是否有利,因为通常将较大的内存块加载到缓存中,这在应用程序级别是否也重要。

实际上 - 假设应用程序一旦启动就不需要太多额外的分配 - 我想知道启动应用程序 A 并等待一段时间,然后启动应用程序 B 是否比同时启动应用程序 A 和 B 更有优势。对于后一种情况,我可以想象 A 请求一些内存,然后是 B,然后是 A 等等(虽然我不确定它是否会发生这种情况,但另一方面,操作系统无法事先知道需要多少内存,因此它不能事先保留一大块内存)。

这样做有什么缺点吗?例如,如果应用程序内存由多个地址相距较远的块组成,那么如果将所有应用程序内存分配为一个大块,理论上可以实现什么?

答案1

这样做有什么缺点吗?例如,如果应用程序内存由多个地址相距较远的块组成,那么如果将所有应用程序内存分配为一个大块,理论上可以实现什么?

你不得不:

  • 看看什么是虚拟内存和物理内存,以及它们是如何映射的。

  • 查看缓存是否在您的架构的虚拟层或物理层完成。

  • 看看你的操作系统是如何运作的

碎片化的物理内存重要吗?只有当它导致更复杂的虚拟到物理映射(mmu 等)时才重要。连续的虚拟块与不连续的物理块可能会导致更复杂的查找映射。Linux 可以使用各种页面大小,它将尝试使用最大的页面大小(以最好地匹配 malloc)。在我的 Debian jessie 系统上,内核为 4.6.0-0 amd64,我的页面大小为 4k(正在使用 154964)、2M(正在使用 3753)和 1G(正在使用 1)。

虚拟内存碎片化重要吗?我认为它不重要,如果进程请求了多个具有多个 maloc 的块,那么它会将它们视为独立的,即使相邻。一个 maloc 在虚拟中必须是连续的。安全系统可能会在每个 maloc 块之间保护块,从而防止它们相邻。

在 Linux 上,进程之间会共享很多内容:如果是同一个可执行文件,那么它们将共享可执行文件的所有只读块(文本、数据块等)。它们还将共享初始化数据(数据),直到其中一个更改页面,然后复制该页面。所有动态链接库都是这样,因此它们将共享很多数据。此外,磁盘上的文件是此内存的交换,因此它不会在需要数据之前读取数据(程序将在没有任何数据的情况下开始运行,这将导致内存未命中,并且页面被读入,然后程序将运行,直到再次未命中等)。如果内存不足,则可以删除页面,稍后可以再次读取(无需将其交换出去)。当内存不足时,这可能会导致大量磁盘读取,从而导致启动速度变慢。如果单独启动进程,那么第二个进程对内存子系统施加压力,将导致未使用的页面被丢弃(可能是在进程 1 启动时使用但此后一直未使用的页面)。

(某些架构缓存物理内存:这是最明显的。其他架构缓存虚拟内存:这可能导致相同的物理内存被缓存两次。这很浪费,但更简单、更快。有些架构同时执行这两项操作,例如在第 1 级进行虚拟缓存,需要快速,在其他级别进行物理缓存,需要内存高效。)。

相关内容