作者:夏冰语风 | 来源:互联网 | 2022-12-06 17:07
我有点困惑.在操作系统课程中,我们被告知所有操作系统都通过分页或分段来处理内存碎片,并且根本没有连续的物理内存分配.OS使用不同级别的寻址(逻辑/物理)来避免连续的内存分配.现在这里有很多关于它的讨论.我的问题是:在支持逻辑寻址的操作系统的c ++编程中,这个问题是否真实存在(任何进程是否因为内存碎片而崩溃)?如果是的话,为什么首先每个操作系统都试图避免连续寻址?
1> StaceyGirl..:
有两层:虚拟进程地址空间中的碎片和物理内存中的碎片.
如果您查看任何现代应用程序,您可以看到其内存使用量随着内存未发布到操作系统而增长的情况.你可以说这是由其他因素引起的,但是内存碎片(例如分配的内存块的非连续位置)是这个的核心原因.简而言之,内存分配器拒绝向操作系统释放内存.
如果您对物理内存中的碎片感兴趣,那么即使在页面中组织了内存,仍然需要分配物理上连续的内存块.例如,如果您需要避免虚拟内存开销,则可能需要使用大页面(就Linux而言是"大页面").x86_64支持4KiB,2MiB和1GiB页面.如果没有所需大小的连续物理内存,您将无法使用它们.
如果操作系统是指"内核",那么它无法帮助您处理进程地址空间中发生的碎片(堆碎片).C库应该尽量避免碎片,不幸的是,它并不总是能够这样做.查看链接的问题.
如果至少分配了一些内存,内存分配器通常无法释放大块内存.有一个部分解决方案可以利用页面中的虚拟内存组织 - 所谓的"懒惰"机制MADV_FREE
在Linux和BSD以及DiscardVirtualMemory
Windows上表示.当你有一大块内存只是部分使用时,你可以通知内核不再需要那部分内存,它可以在内存压力下恢复.这是懒惰地完成的,并且仅在内存压力下完成,因为内存释放非常昂贵.但是由于性能原因,许多内存分配器仍然不使用它.
所以你的问题的答案 - 这取决于你对程序效率的关注程度.大多数程序都不关心,因为标准分配器只为它们完成工作.当标准分配器无法有效地完成其工作时,某些程序可能会受到影响.