include <sys/mman.h> //CPATH只到incude级
void* mmap(
void* start, //映射区内存的起始地址
//NULL系统自动选定(默认当前堆尾),成功返回之
size_t length, //字节长度,自动按页(4K)对齐
int prot, //映射权限
int flags, //映射标志
int fd, //文件描述符
off_t offset //文件偏移量,自动按页(4K)对齐
);
成功返回映射区内存起始地址,失败返回MAP_FAILED(-1)
2、销毁虚拟内存到物理内存或文件的映射
int munmap(
void* start, //映射区内存起始地址
size_t length //字节长度,自动按页(4k)对齐
);
成功返回0,失败返回-1
mmap/munmap底层不维护任何东西,知识返回一个首地址,所分配内存位于堆中。
brk/sbrk底层维护一个指针,记录所分配的内存结尾,所分配的内存位于堆中,底层调用mmap/munmap。
malloc底层维护一个双向链表和必要的控制信息,不可越界访问,所分配内存位于堆中,底层调用brk/sbrk。
每个进程都有4G的虚拟内存空间,
虚拟内存地址知识一个数字,
并没有和实际的物理内存相关联。
所谓内存分配和释放,
其本质就是建立或取消虚拟内存和物理内存之间的映射关系。
include <stdio.h>
include <unistd.h>
include <sys/mman.h>
define MAX_TEXT 256
int main(void){
char * psz = (char* )mmap(NULL,MAX_TEXT * sizeof(char),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if((psz == MAP_FAILED){
perror("mmap");
return -1;
}
sprintf(psz, "hello,world !");
printf("%s\n", psz);
printf("psz=%p\n", psz);
printf("查看/proc/%u/maps,按回车退出", getpid());
getchar();
if(munmap(psz, MAX_TEXT*sizeof(char)) == -1){
perror("munmap");
return -1;
}
return 0;
}
网友评论