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

在malloc期间内核中发生了什么?,c,linux,process,system,heap,C,Linux,Process,System,Heap,我在一次采访中被问到这个问题。他们想知道的是,当用户调用malloc(4)来分配4字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用 我告诉他malloc()将由内存管理子系统提供服务。malloc()实现将遍历空闲内存(物理内存)列表,我们称之为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将从空闲列表中删除并添加到已使用列表中。然后,该物理内存将映射到进程堆vma结构。他似乎对这个答案不太满意。伙伴制如何适应这个问题?任何帮助都将不胜感激。当用户空间应

我在一次采访中被问到这个问题。他们想知道的是,当用户调用malloc(4)来分配4字节的内存时,操作系统(Linux)如何响应?哪个子系统响应此系统调用


我告诉他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实现的读/写操作),故障处理程序将启动并向下捕获到内核,内核将把物理内存分配给未映射的内存

  • 您的答案中有一个错误-
    malloc
    不直接处理物理内存。它涉及——尽管我不确定它是否适用于所有的架构


    当您的程序尝试分配内存时,如果空闲列表中的块大小不等于或大于请求的大小,则会分配整个新页。页面大小取决于体系结构(x86上为4096字节)。页面分配只有内核才能执行,因此
    malloc
    调用可能会导致系统调用。然后,新地址被添加到自由列表中,
    malloc
    根据其实现操作自由列表(例如检查glibc)。

    他当时非常生气。malloc()是在用户模式下实现的。@Chris:主要是。malloc可能会给sbrk打电话。@Chris:不一定。这里给出的答案意味着
    malloc()
    从物理内存进行分配,这是错误的;我认为,在谈论unix时,将“操作系统”理解为“内核、引导加载程序、libc和基本用户模式程序,如init、getty、login和friends”是公平的。根据面试官的措辞,谈论分配器在用户模式下的工作可能是一个公平的答案。我猜他对你混合使用用户调用malloc和内核函数malloc不满意。您所描述的应该是内核malloc的功能。您能详细说明第4点是如何发生的吗?我只想知道物理内存最终是如何分配的,以及内核代码的哪一部分会这样做?谢谢你。@ArjunBora不,这是一个相当大的话题。请另问一个问题。