三界
内核态
用户态
跨界
标准库
主角登场
malloc是如何工作的
内存不够该怎么办?
向操作系统申请内存
看起来已经讲完的故事
程序调用malloc申请内存,注意malloc实现在标准库中
malloc开始搜索空闲内存块,如果能找到一块大小合适的就分配出去,前两个步骤都是发生在用户态
如果malloc没有找到空闲内存块那么就像操作系统发出请求来增大堆区,这是通过系统调用brk(sbrk、mmap也可以)实现的,注意,brk是操作系统的一部分,因此当brk开始执行时,此时就进入内核态了。brk增大进程的堆区后返回,malloc的空闲内存块增加,此时malloc又一次能找到合适的空闲内存块然后分配出去。
冰山之下
完整的故事
malloc开始搜索空闲内存块,如果能找到一块大小合适的就分配出去
如果malloc找不到一块合适的空闲内存,那么调用brk等系统调用扩大堆区从而获得更多的空闲内存
malloc调用brk后开始转入内核态,此时操作系统中的虚拟内存系统开始工作,扩大进程的堆区,注意额外扩大的这一部分内存仅仅是虚拟内存,操作系统并没有为此分配真正的物理内存
brk执行结束后返回到malloc,从内核态切换到用户态,malloc找到一块合适的空闲内存后返回
程序员拿到新申请的内存,程序继续
当有代码读写新申请的内存时系统内部出现缺页中断,此时再次由用户态切换到内核态,操作系统此时真正的分配物理内存,之后再次由内核态切换回用户态,程序继续。