Memory 操作系统如何处理虚拟地址空间中的碎片

Memory 操作系统如何处理虚拟地址空间中的碎片,memory,operating-system,fragment,virtual-memory,Memory,Operating System,Fragment,Virtual Memory,据我所知,分页系统确实消除了物理地址空间中的外部碎片,但虚拟地址空间中的碎片又如何呢 在现代操作系统中,每个进程都使用虚拟地址空间(内核有自己的专用虚拟范围),这意味着与整个操作系统相比,要求要低得多。虚拟地址空间通常足够大(x86上的每个进程2-3 GB,x64机器上的多TB(Windows上的8 TB)),因此碎片问题不像操作系统范围的物理地址空间那么大。但是,这个问题仍然会出现,特别是对于x86或其他32位体系结构上的长时间运行且内存不足的应用程序。为此,操作系统提供了机制,例如以堆代码的

据我所知,分页系统确实消除了物理地址空间中的外部碎片,但虚拟地址空间中的碎片又如何呢

在现代操作系统中,每个进程都使用虚拟地址空间(内核有自己的专用虚拟范围),这意味着与整个操作系统相比,要求要低得多。虚拟地址空间通常足够大(x86上的每个进程2-3 GB,x64机器上的多TB(Windows上的8 TB)),因此碎片问题不像操作系统范围的物理地址空间那么大。但是,这个问题仍然会出现,特别是对于x86或其他32位体系结构上的长时间运行且内存不足的应用程序。为此,操作系统提供了机制,例如以堆代码的形式。应用程序通常在启动时将一个或多个内存范围保留为堆,并在稍后从堆中分配所需的内存块(例如malloc)。有多种实现以不同的方式处理堆的碎片。Windows提供了一种特殊的低碎片堆实现,如果需要,可以使用它。其他一切通常取决于应用程序或其库。

让我在您的声明中添加一个限定条件。当内核可分页时,分页系统几乎消除了物理地址空间中的碎片

在某些系统上,用户模式页表本身是可分页的。在其他情况下,它们是不可分页的物理位置。然后你可以得到碎片

虚拟地址空间中的碎片往往发生在堆分配中。堆管理器面临的挑战是在最小化碎片的同时管理空间