是否存在缺点,即应用程序内存由多个地址组成的地址组成的地址距离彼此更远,那么如果将所有应用程序内存分配为一个大块,理论上可以实现什么?
你不得不:
看看什么是虚拟和物理内存,以及它们是如何映射的。
查看是否在架构的虚拟或物理层上完成了缓存。
看看你的操作系统是如何做的
碎片化的物理内存是否重要?只有当它导致更复杂的虚拟到物理地图(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的虚拟缓存,它需要快速,物理缓存在需要内存效率的其他级别。)