内存管理API
#include <unistd.h>
void *sbrk(intptr_t increment)
increment:
0 获取未分配前的内存首地址(也就是已经分配内存的尾地址)
大于0 增加内存空间
小于0 释放内存空间
返回值:未分配前的内存首地址,以字节为单位。
int brk(void *addr)
功能:设置未分配内存的首地址
返回值:成功0,失败-1
它们背后维护着的一个指针,该指针记录的是未分配的内存的首地址(当前堆内存的最后一个字节的下一个位置)。它们都可以用来映射内存和取消映射(系统级的内存管理),但为了方便起见,sbrk一般用于分配内存,brk用于释放内存。
注意:sbrk/brk分配和释放的都是使用权,真正的映射工作由其它系统调用完成(mmap/munmap)。
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
功能:把虚拟内存与物理内存或者文件建立映射关系
addr:要映射的虚拟内存地址, 如果为NULL操作系统会自动选择一个虚拟地址与物理内存映射。
length:要映射的字节数
flags:映射标志
prot: 权限
fd:文件描述符(与内存映射没有关系)
offset:文件映射偏移值
返回值:映射成功后的虚拟内存地址,失败返回0xffffffff。
int munmap(void *addr, size_t length);
功能:取消映射
addr:需要取消映射的内存首地址
length:需要取消映射的字节数
返回值:成功0,失败-1