其他分享
首页 > 其他分享> > mmap

mmap

作者:互联网

一、mmap 概述

mmapmemory map(内存映射)的缩写,其为一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和程序虚拟地址空间具有一种虚拟对应关系。mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存,普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问而不必再使用read()write()等操作。

二、为何使用 mmap

Linux 通过内存映射机制来提供用户程序对内存直接访问的能力,内存映射的意思是把内核中特定部分的内存空间映射到用户级程序的内存空间去,这实现了用户空间和内核空间对某段内存的共享。内核在这块地址内存储变更的任何数据用户可以立即发现和使用,无须进行额外的数据拷贝。例如,使用mmap获取磁盘上的文件信息,只需要将磁盘上的数据拷贝至共享内存,用户进程便可直接获取到信息,而传统的I/O操作write and read要求必须先把数据从磁盘拷贝至内核缓冲页中,然后再把数据拷贝到用户进程内存空间。两者相比,使用mmap会减少一次拷贝操作,在高负载情况下这将带来巨大的性能提升;另外,使用内存访问来取代writeread能够简化一些应用程序逻辑。

从输入输出及内存空间角度分析使用mmap的好处:

1、正常的readwrite操作需要两次传输,一次是在文件和内核高速缓冲区之间,另一次是在高速缓冲区和用户空间缓冲区之间,使用mmap就不需要第二次传输了。对于输入而言,一旦内核将相应的文件块映射进共享内存后,用户进程就能直接访问这些数据了;对于输出而言,用户进程仅仅需要修改内核中的内容,便可以依靠内核内存管理器来自动更新底层文件。

2、除了节省内核空间和用户空间之间的一次传输之外,mmap还能够通过减少所需内存来减少资源消耗。使用readwrite时数据将被保存在两个缓冲区中(用户和内核),而使用mmap时,用户和内核共享一个缓冲区,此外如果多个进程正在同一个文件上执行I/O,那么它们可通过使用mmap共享一个内核缓冲区。

三、如何使用 mmap

头文件

<sys/mman.h>

函数

void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

参数

返回值

映射成功时函数返回映射区域的起始地址

四、两种映射方式

1、基于文件的映射

适用于任何进程之间,需要打开或创建一个文件然后再调用mmap()

// ...
fd = open(name, flag, mode);
assert(fd >= 0);
ptr = mmap(NULL, len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, fd, 0);

2、匿名映射

操作系统使用特殊文件提供的匿名内存映射,映射的分页会被初始化为 0,可以把它看成是一个内容总是被初始化为 0 的虚拟文件映射。在具有亲缘关系的进程之间(如父子进程), 当一个进程调用mmap()之后又调用了fork(), 则子进程会继承父进程映射后的空间,同时也继承了mmap()返回的首地址,由此来实现父子进程之间的通信

// ...
ptr = mmap(NULL, len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANONYMOUS, fd, 0);
// ptr = mmap(NULL, len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

pid = fork();
assert(pid >= 0);

if(0 == pid)		// 子进程
{
    lock(ptr);
    handle();
    unlock(ptr);
}
else		        // 父进程
{
    lock(ptr);
    handle();
    unlock(ptr);
}

五、mmap 实现原理

1、进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域

2、内核空间调用mmap()构建文件物理地址和进程虚拟地址的映射关系

3、进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝

注:前两个阶段仅在于创建虚拟区间并完成地址映射,但是并没有任何文件数据拷贝至主存,真正的文件读取是当前进程发起readwrite操作时。

注:修改过的脏页面并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync()来强制同步,这样所写的内容就能立即保存到文件里。

六、mmap 优缺点

1、优点

2、缺点

标签:文件,映射,mmap,内核,进程,内存
来源: https://www.cnblogs.com/horacle/p/16602601.html