【发布时间】:2015-03-23 21:43:27
【问题描述】:
据我所知,分页系统确实消除了物理地址空间中的外部碎片,但是虚拟地址空间中的碎片呢?
【问题讨论】:
标签: memory operating-system fragment virtual-memory
据我所知,分页系统确实消除了物理地址空间中的外部碎片,但是虚拟地址空间中的碎片呢?
【问题讨论】:
标签: memory operating-system fragment virtual-memory
让我在你的陈述中添加一个限定条件。当内核可分页时,分页系统几乎消除了物理地址空间中的碎片。
在某些系统上,用户模式页表本身是可分页的。在其他情况下,它们是不可分页的物理位置。然后你可以得到碎片。
虚拟地址空间中的碎片往往发生在堆分配中。堆管理器面临的挑战是在管理空间的同时尽量减少碎片。
【讨论】:
在现代操作系统中,每个进程都使用虚拟地址空间(内核有自己的专用虚拟范围),这意味着与整个操作系统相比,需求要低得多。虚拟地址空间通常足够大(x86 上每个进程 2-3 GB,x64 机器上多个 TB(Windows 上 8)),因此碎片对于操作系统范围的物理地址空间来说并不是一个大问题。仍然会出现问题,尤其是对于 x86 或其他 32 位架构上的长时间运行和内存消耗大的应用程序。为此,操作系统提供了机制,例如以堆代码的形式。应用程序通常在启动时将一个或多个内存范围保留为堆,然后从那里分配所需的内存块(例如 malloc)。有多种实现以不同的方式处理堆的碎片。 Windows 提供了一个特殊的低碎片堆实现,如果需要,可以使用它。其他一切通常取决于应用程序或其库。
【讨论】: