同时启动多个应用程序是否有缺点?


1

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

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

是否存在缺点,即应用程序内存由多个地址组成的地址组成的地址距离彼此更远,那么如果将所有应用程序内存分配为一个大块,理论上可以实现什么?


同时运行两个进程将导致更多的缓存未命中,但也将受益于更好地使用并行化(即使在单个核心上,因为磁盘和CPU是并行化的)。
ctrl-alt-delor 2016年

你的假设是什么?是将它们组合起来更好,还是单独启动它们会更好?
ctrl-alt-delor 2016年

@richard我真的没有假设,因为我对这个问题知之甚少。我的直觉说,一旦他们开始,他们分别开始他们会更好; 开始时我不关心并行性。
2016年

什么操作系统?什么架构?
ctrl-alt-delor 2016年

没有具体,linux / windows特定的答案是可以的
stijn 2016年

Answers:


1

是否存在缺点,即应用程序内存由多个地址组成的地址组成的地址距离彼此更远,那么如果将所有应用程序内存分配为一个大块,理论上可以实现什么?

你不得不:

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

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

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

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

碎片化的虚拟内存是否重要?我不知道它确实如此,如果进程请求多个具有多个malocs的块,那么即使相邻,它也会看到它们是分开的。一个maloc必须在虚拟中连续。安全系统可以在每个maloced块之间保护块,从而防止它们相邻。

在Linux上,很多进程将在进程之间共享:如果是相同的可执行文件,那么它们将共享可执行文件的所有只读块(text,data-ro等)。他们还将共享初始化数据(数据),直到其中一个更改页面,然后复制此页面。对所有动态链接库都做了同样的事情,因此他们将分享很多这些。磁盘上的文件也是这个内存的交换,所以在它需要它之前它不会费心读取数据(程序将开始运行而没有读入,这将导致ram miss和页面正在读入,然后程序将运行,直到有另一个错过等等)。如果没有ram,则可以删除页面,后者可以再次读取(无需将其换出)。当内存不足时,这可能会导致大量磁盘读取,从而导致启动速度变慢。

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


所以tldr; 是有道理的:不应该重要,很难弄清楚它是否有效,因为涉及很多因素?
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.