内存分配方面的分页

时间:2015-02-16 04:13:44

标签: c memory-management linux-kernel operating-system kernel

就分页而言,内存分配究竟是如何工作的?我理解伙伴分配器,自由列表算法等都是如何工作的,但在虚拟内存和分页方面我很困惑。例如,假设我是malloc 10个字节。可以说有10个4kb虚拟页面可用。操作系统使用其中一个页面来分配10个字节。操作系统现在会将此页面标记为“不免费”吗?我确信它不会那样做,但它如何跟踪该页面中还有(4kb - 10个字节)?

1 个答案:

答案 0 :(得分:3)

Linux仅适用于页面。

malloc 是一个C库函数。它的工作是允许分配任意大小的内存块。它使用 sbrk mmap 内核的工具来获取/增大/缩小页面池。它跟踪池中的已分配和可用字节。

如果一个页面用于分配一些稍后释放的内存,则内核无法知道它不再需要,除非 malloc 告诉它释放它(例如通过 munmap )。

malloc 从内核请求页面时,进程的虚拟地址空间中的空闲虚拟页面被标记为有效并返回。访问无效页面会触发段错误。

通常分配是懒惰的。这意味着首先没有分配真实页面(即后备存储)。第一次进程写入此虚拟页面时,将分配一个实际页面,并指向虚拟页面。

然后,这个真实页面可能会根据需要在物理内存和交换空间之间来回移动。