在malloc期间内核中发生了什么?
我在一次采访中被问到这个问题。他们想知道的是,当用户调用malloc(4)来分配4字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用在malloc期间内核中发生了什么?,c,linux,process,system,heap,C,Linux,Process,System,Heap,我在一次采访中被问到这个问题。他们想知道的是,当用户调用malloc(4)来分配4字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用 我告诉他malloc()将由内存管理子系统提供服务。malloc()实现将遍历空闲内存(物理内存)列表,我们称之为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将从空闲列表中删除并添加到已使用列表中。然后,该物理内存将映射到进程堆vma结构。他似乎对这个答案不太满意。伙伴制如何适应这个问题?任何帮助都将不胜感激。当用户空间应
我告诉他malloc()将由内存管理子系统提供服务。malloc()实现将遍历空闲内存(物理内存)列表,我们称之为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将从空闲列表中删除并添加到已使用列表中。然后,该物理内存将映射到进程堆vma结构。他似乎对这个答案不太满意。伙伴制如何适应这个问题?任何帮助都将不胜感激。当用户空间应用程序调用
malloc()
时,该调用不会在内核中实现。相反,它是一个库调用(实现了glibc或类似功能)
简而言之,glibc中的malloc
实现要么从brk()
/sbrk()
系统调用获取内存,要么通过mmap()
获取匿名内存。这为glibc提供了一个大的连续(关于虚拟内存地址)内存块,malloc
实现将其进一步切分为更小的块并分发给应用程序
这是一个小型的malloc
实现,它将为您提供想法,以及许多很多链接
请注意,还没有任何东西关心物理内存——当进程数据段通过brk()
/sbrk()
或mmap()
更改时,以及当内存被引用时(通过对内存的读或写),内核虚拟内存系统会处理物理内存
总结如下:
malloc()
malloc()
将尝试扩展过程数据段(通过sbrk()
/brk()
或在某些情况下mmap()
)<代码>sbrk()最终出现在内核中brk()。首先,将没有物理内存映射到扩展数据段提供的附加虚拟地址
您的答案中有一个错误-
malloc
不直接处理物理内存。它涉及——尽管我不确定它是否适用于所有的架构
当您的程序尝试分配内存时,如果空闲列表中的块大小不等于或大于请求的大小,则会分配整个新页。页面大小取决于体系结构(x86上为4096字节)。页面分配只有内核才能执行,因此
malloc
调用可能会导致系统调用。然后,新地址被添加到自由列表中,malloc
根据其实现操作自由列表(例如检查glibc)。他当时非常生气。malloc()是在用户模式下实现的。@Chris:主要是。malloc可能会给sbrk打电话。@Chris:不一定。这里给出的答案意味着malloc()
从物理内存进行分配,这是错误的;我认为,在谈论unix时,将“操作系统”理解为“内核、引导加载程序、libc和基本用户模式程序,如init、getty、login和friends”是公平的。根据面试官的措辞,谈论分配器在用户模式下的工作可能是一个公平的答案。我猜他对你混合使用用户调用malloc和内核函数malloc不满意。您所描述的应该是内核malloc的功能。您能详细说明第4点是如何发生的吗?我只想知道物理内存最终是如何分配的,以及内核代码的哪一部分会这样做?谢谢你。@ArjunBora不,这是一个相当大的话题。请另问一个问题。