1.malloc函数是用来分配内存,它的底层是由brk和mmap这些系统调用来实现的
2.brk将堆顶指针向搞地质移动,获得新的内存空间,mmap是在进程的虚拟空间中(栈区和堆区之间的共享数据区)找一快空闲的虚拟内存。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页终端,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系
3.malloc小于128k的内存,使用brk分配内存,将堆顶指针往高地址推,malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配。brk分配的内存需要等到高地址内存释放以后才能释放,而mmap分配的内存可以单独释放。当最高地址空间的空闲内存超过128k时,执行内存紧缩操作。在上一个步骤free的时候,发现最高地址空闲内存超过128k,于是内存紧缩
4.malloc是从堆里面申请内存,也就是说函数返回的指针是指向堆里面的一块内存。操作系统重有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆节点,然后就将该节点从空闲节点链表中删除,并将该节点的空间分配给程序
注意:使用mmap有两种方式:一种是文件映射,一种是匿名映射。malloc中使用到的就是匿名映射,是将一段内存空间映射到虚拟地址空间中,用于分配大块内存。