malloc分配内存
malloc是c语言的库函数,不支持重载
malloc的返回值是void*类型需要强制转换
malloc申请完的内存需要用free来进行释放内存
malloc申请空间失败会返回值为空
malloc申请的是虚拟内存地址,只有这块内存被访问时,才能发生映射,才会调用物理内存地址
malloc申请内存的方式
1. brk()
通过brk()系统调用从堆区申请内存空间
brk()是通过堆顶指针向高地址移动,进行空间申请
2. mmap
mmap()方式也称为私有匿名映射,也就是在文件映射区申请一块内存进行分配
3. 调用时机
当申请的内存小于128kb调用brk()
当申请的内存大于128kb调用mmap()
4. malloc申请的内存空间大小
申请的空间内存大小,并不是你说申请1字节空间,申请的就是1字节,malloc会分配更大的内存池
5. free释放内存
free释放掉的内存并不会返回给操作系统,而是返回给malloc的内存池,等下次申请堆区空间的时候可以直接将内存给过去,速度快很多直到进程结束才会将内存还给操作系统。
只有在mmap在文件映射区申请内存空间的时候才会返还给操作系统,但是这样有弊端,因为申请内存的过程要去内核空间申请,一次一次的访问内核空间,于是每次mmap 分配的虚拟地址都是缺页状态的,然后在第一次访问该虚拟地址的时候,就会触发缺页中断。
也就是说,频繁通过 mmap 分配的内存话,不仅每次都会发生运行态的切换,还会发生缺页中断,这样会导致 CPU消耗较大。