mmap解析
发布网友
发布时间:2024-08-19 19:50
我来回答
共1个回答
热心网友
时间:2024-08-22 17:45
虚拟内存将系统内存分割成大小固定的虚拟页VP,每个VP默认4KB;物理内存分割为物理页PP,每个PP默认4KB。
MMAP(Memory Mapped)是内存映射文件的方法,Linux通过此机制让用户程序可以直接访问内存。
内存映射本质是将内核特定区域的内存空间映射到用户级程序内存空间,实现共享。
mmap将文件或其他对象映射到进程地址空间,创建文件磁盘地址与进程虚拟地址空间的虚拟地址对映关系。
通过mmap()系统调用,进程之间可以共享映射同一个普通文件,读取文件如同普通内存访问,无需调用read()/write()等操作。
两个进程共享映射同一文件的示意图。
mmap分为基于文件映射和匿名映射两种方式。
基于文件映射适用于任何进程间共享,需要打开或创建文件,然后调用mmap(),如:
...
fd = open(name,flag,mode);
if(fd<0){
printf("error! ");
}
ptr = mmap(NULL,len,PROT_READ|REOT_EXEC|PROT_WRITE,MAP_SHARED,fd,0);
匿名映射没有对应文件,分页被初始化为0,适合父子进程间共享。
如父子进程间共享映射,子进程通过fork()继承父进程映射后的空间。
mmap实现过程包括三个阶段:进程创建映射区域,内核实现文件物理地址与虚拟地址映射,进程发起对映射空间的访问。
读写文件通过页缓存pageCache中转,mmap通过将文件页缓存映射到虚拟内存空间实现文件映射。
读写操作引发缺页异常,内核请求调页过程,将所需内存页从磁盘装入内存,进程即可对主存进行操作。
修改的脏页面不立即更新至文件,可以调用msync()强制同步。
mmap在write和read时的处理:
write中,进程将数据复制到mmap地址,产生缺页异常由内核处理,或直接复制到物理内存,更新磁盘。
read中,mmap避免了普通read的两次传输,直接访问内核缓冲区数据,减少内存使用。
mmap优点包括高读取效率、高效交互、进程间共享与通信、高效大规模数据传输。
缺点涉及文件大小限制、变长文件处理、大量更新操作。