一尘不染

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

linux

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

我告诉他,内存管理子系统将为malloc()提供服务。malloc()实现将遍历空闲内存(物理内存)列表,我们将其称为空闲列表,并找到一个大于或等于4字节的适当块。一旦找到这样的块,它将被从空闲列表中删除并添加到已用列表中。然后,该物理内存将被映射到进程堆vma结构。他对这个答案似乎不太满意,伙伴系统如何适应这个答案?任何帮助将不胜感激。


阅读 364

收藏
2020-06-03

共1个答案

一尘不染

当用户空间应用程序调用时malloc(),该调用未在内核中实现。相反,它是一个库调用(实现的glibc或类似方法)。

简短的版本是mallocglibc 中的实现要么通过brk()/
sbrk()system调用获取内存,要么通过mmap()。这为glibc提供了一个很大的连续(相对于虚拟内存地址)的内存块,该malloc实现将实现进一步切成小块并将它们切成小块,然后分发给您的应用程序。

是一个小malloc实现,它将为您提供想法,以及许多链接。

请注意,还没有什么东西在乎物理内存-当通过brk()/
sbrk()或更改过程数据段mmap(),以及在引用内存(通过对内存的读取或写入)时,内核虚拟内存系统会处理该内存。

总结一下:

  1. malloc() 将搜索其托管的内存,以查看是否有一块满足分配要求的未使用的内存。
  2. 如果失败,malloc()将尝试扩展过程数据段(通过sbrk()/ brk()或在某些情况下mmap())。sbrk()最终进入内核。
  3. 内核中的brk()/ sbrk()调用会调整struct mm_struct流程中的某些偏移,因此流程数据段会更大。首先,将没有物理内存映射到扩展数据段所提供的其他虚拟地址。
  4. 当第一次触摸到未映射的内存时(可能是实现的读/写操作malloc),故障处理程序将启动并进入内核,在内核中内核将为未映射的内存分配物理内存。
2020-06-03