【发布时间】:2017-12-09 14:55:32
【问题描述】:
我知道关于我在这里指出的问题有很多问题,但我找不到任何复杂的答案(无论是在 StackOverflow 上还是在其他来源)。
我想问一下堆(RAM)碎片问题。
据我了解,有两种碎片: internal - 与分配单元大小 (AU) 和分配的内存 AM 大小之间的差异有关(浪费内存等于 AM % AU), external - 与空闲内存的非连续区域有关,因此即使空闲内存区域的总和可以处理新的分配请求,如果没有连续区域则失败可以应付。
这很清楚。当“分页”出现时,问题就开始了。
有时我可以找到分页解决外部碎片问题的信息。 事实上,我同意,由于分页,操作系统能够创建内存的虚拟连续区域,分配给进程,即使内存的各个部分在物理上是分散的。
但它究竟对外部碎片有什么帮助呢? 我的意思是,假设一个页面的大小是 4kB,而我们要分配 16kB,那么我们当然只需要找到四个空的页面框架,即使这些框架在物理上不是连续区域的一部分。
但是如果分配较小呢? 我相信页面本身仍然可能是碎片化的,并且(在最坏的情况下)如果旧框架不能用于分配请求的内存,操作系统仍然需要提供新框架。
那么(假设最坏的情况)迟早,无论有没有分页,分配和释放堆内存(不同大小)的长时间工作的应用程序会因为外部碎片而陷入低内存状态?
那么问题是如何处理外部碎片? 自己实现分配算法?分页(正如我所写,不确定是否有帮助)?还有什么 ?操作系统(Windows、Linux)是否提供了一些碎片整理方法?
最根本的解决方案是禁止使用堆,但对于具有分页、虚拟地址空间、虚拟内存等的平台真的有必要...唯一的问题是应用程序需要不间断地运行数年?
还有一个问题.. 内部碎片是一个模棱两可的术语吗? 我在某处发现了内部碎片指向页面框架部分的定义,这是浪费的,因为进程不需要更多内存,但单个框架不能由多个进程拥有。
我已经把问题加粗了,所以赶时间的人不用阅读所有内容就可以找到问题。
问候!
【问题讨论】:
-
... even if physically the frames are not a part of a continues area.物理内存不相关。需要四个连续的未使用地址空间的“页面”。 -
是的,在进程(虚拟)地址空间中是连续的。但这是由 mmu 组织的,帧的位置在物理上是无关紧要的。
标签: memory-management paging dynamic-memory-allocation fragmentation memory-fragmentation