在malloc期间内核中会发生什么?

| 采访中有人问我这个问题。他们想知道的是,当用户调用malloc(4)分配4个字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用? 我告诉他,内存管理子系统将为malloc()提供服务。 malloc()实现将遍历空闲内存(物理内存)列表,我们将其称为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将被从空闲列表中删除并添加到已用列表中。然后,该物理内存将被映射到进程堆vma结构。他对这个答案似乎不太满意。伙伴系统如何适合这个答案?任何帮助将不胜感激。
已邀请:
当用户空间应用程序调用“ 0”时,该调用未在内核中实现。相反,它是一个库调用(实现的glibc或类似方法)。 简短的版本是glibc中的
malloc
实现从
brk()
/
sbrk()
系统调用中获取内存,或者通过
mmap()
获得匿名内存。这为glibc提供了一个很大的连续(相对于虚拟内存地址)内存块,“ 1”实现将其进一步切成小块并切成小块,然后分发给您的应用程序。 这是一个小的ѭ1实施,它将为您提供想法以及许多链接。 请注意,还没有什么东西在乎物理内存-当通过
brk()
/
sbrk()
mmap()
更改过程数据段时,以及在引用内存时(通过对内存的读取或写入),内核虚拟内存系统会处理该问题。 )。 总结一下: “ 0”将搜索其托管内存,以​​查看是否有一块满足分配要求的未使用内存。 如果失败,ѭ0将尝试扩展过程数据段(通过
sbrk()
/
brk()
或在某些情况下通过
mmap()
)。
sbrk()
最终出现在内核中。 内核中的
brk()
/
sbrk()
调用会调整进程的ѭ18​​ѭ中的某些偏移量,因此进程数据段将更大。首先,将没有物理内存映射到扩展数据段所提供的其他虚拟地址。 首次触摸未映射的内存时(可能由ѭ1实现实现读/写),故障处理程序将启动并捕获到内核,内核将为未映射的内存分配物理内存。
您的答案有误-
malloc
不直接处理物理内存。它处理分页的虚拟内存-尽管我不确定是否适用于其中的每个体系结构。 当您的程序尝试分配内存并且空闲列表不包含等于或大于请求大小的块时,就会分配一个新页面。页面大小取决于体系结构(x86上为4096字节)。页面分配只有内核才能执行,因此“ 1”调用可能会导致系统调用。然后将新地址添加到空闲列表中,并且
malloc
根据其实现对空闲列表进行操作(例如,检查glibc)。

要回复问题请先登录注册