mmap是一种内存映射文件的方法,即讲一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟空间中一段虚拟地址的一一对应关系,函数原型如下
void *mmap(void *addr,size_t length,int prot,int flags,int fd,off_t offset);
实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动会写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
好处:read,write等函数本身涉及两次的数据拷贝,一次是用户空间和内核空间的数据拷贝,另外一次是内核空间和硬件之间的数据拷贝,如果设备拷贝的数据量很小,那么read,write两次数据拷贝的过程对系统的影响几乎没有,如果设备的数据量非常大,比如说显卡那么对系统的性能影响非常大。
而mmap则减少一次内存拷贝,只有用户空间的内存拷贝。正是因为减少了从Linux页缓存到用户空间的缓冲区的这一次拷贝,所以mmap大大提高了性能。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/mman.h>
#include<stdio.h>
#include<stdlib.h>
int main(){
int fd = open("my_data.dat",O_RDONLY);
size_t len = lseek(fd,0,SEEK_END);
char *p = mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);
printf("%s\n",p);
return 0;
}
//Hello World!
//