内存管理
malloc会调用sbrk/brk,相当于封装
sbrk/brk会调用mmap/munmap。。。层层封装
内存映射的建立与解除
mmap
头文件路径为bin/include/x86/sys/mman.h
start:一般给空NULL,系统自动指定,如果自己指定不知道哪些内存能用哪些不能用
length:一页为4096个字节,4kB
PRIVATE与SHARED二选一
munmap
映射两页8kB内存,成功存入
成功输出
解除第一个页的映射,第二页还能使用
解除第二页的映射后,同样访问不了第二页,段错误
虚拟内存的分配和释放
sbrk
前提:已经完成一个页的映射
堆尾指针往上移,内存增大,移出当前已映射范围后,sbrk函数会自动映射一个新的页
堆尾指针往下移,内存释放,从新的页往下移动到旧的页后,sbrk函数会自动解除新页的映射
ubuntu12.04:堆尾指针一开始的位置与第一个返回值(位置)相同
12.04以后堆尾指针一开始的位置与第一个返回的位置差33个页
brk
brk只能用来分配内存,需要用sbrk来获取当前堆尾的地址
系统调用
标准库函数malloc free底层会调用 系统调用函数mmap munmap
间接/直接调用 系统调用函数时,内核就要工作,工作在内核态上
在程序中操作没有调用系统调用函数时,程序执行在底下3G的用户态上