浅析linux内存映射原理

来源:
导读 大家好,我是本期栏目编辑小友,现在为大家讲解浅析linux内存映射原理问题。 简而言之,内存映射是将用户空间

大家好,我是本期栏目编辑小友,现在为大家讲解浅析linux内存映射原理问题。

简而言之,内存映射是将用户空间的内存区域映射到内核空间。映射成功后,用户对该内存区域的修改可以直接反映在内核空间中,同样,内核空间对该区域的修改也直接反映了用户空间。当内核空间和用户空间之间需要大量数据传输时,效率非常高。

下面是将常用文件映射到用户空间内存区域的示意图。

图1:

第二,基本功能。

mmap函数是unix/linux下的系统调用。详情请参考《Unix Netword programming》第2卷第12.2节。

mmap系统调用不是为共享内存设计的。它本身提供了一种不同的访问普通文件的方式,这个过程可以像读写内存一样操作普通文件。虽然Posix或system v的共享内存IPC纯粹是用于共享目的,当然,mmap()实现共享内存也是其主要应用之一。

mmap系统调用允许进程通过映射同一个公共文件来共享内存。普通文件映射到进程地址空间后,进程可以像普通内存一样访问文件,无需调用read()、write()等操作。Mmap不分配空间,但是将文件映射到调用进程的地址空间(但是会占用你的虚拟内存),然后你可以用memcpy等操作来写文件,而不是写()。写入后,内存中的内容不会立即更新到文件中,而是会延迟一段时间。您可以调用msync()显式同步它,这样您所写的内容就可以立即保存到文件中。但是,通过mmap写入文件不能增加文件的长度,因为要映射的长度是在调用mmap()时决定的。如果要取消内存映射,可以调用munmap()取消内存映射。

void * mmap(void *start,size_t长度,int prot,int标志,int fd,off_t偏移量)

Mmap用于将文件映射到内存空间。简单来说,mmap就是在内存中制作一个文件内容的图像。映射成功后,用户对该内存区域的修改可以直接反映在内核空间中,同样,内核空间对该区域的修改也直接反映了用户空间。当内核空间和用户空间之间需要大量数据传输时,效率非常高。

原则

首先,“映射”一词与数学课中的“一对一映射”含义相同,即建立一一对应关系,主要是硬盘上文件的位置与进程逻辑地址空间中相同大小的区域一一对应,如图1中的Process 1所示。这种对应关系纯粹是一个逻辑概念,但在物理上并不存在,因为进程本身的逻辑地址空间并不存在。在内存映射过程中,没有实际的数据拷贝,文件不是加载到内存中,而是逻辑上放入内存中。具体到代码,相关的数据结构(structaddress_space)被建立和初始化。这个过程是通过系统调用mmap()实现的,所以建立内存映射的效率很高。

图1。记忆映射原理。

由于内存映射建立时并没有进行实际的数据复制,进程最终如何通过内存操作直接访问硬盘上的文件?它依赖于内存映射后的几个相关进程。

mmap()将返回一个指针ptr,该指针指向进程逻辑地址空间中的一个地址,因此进程只能通过ptr来操作文件,而不能调用read或write。然而,ptr指的是一个逻辑地址,为了操作其中的数据,逻辑地址必须通过MMU转换成物理地址,如图1中的流程2所示。这个过程与内存映射无关。

如前所述,当建立内存映射时,数据实际上并没有被复制。此时MMU在地址映射表中找不到ptr对应的物理地址,即MMU失败,会产生缺页中断。缺页中断的中断响应功能将在交换中寻找相应的页面。如果找不到(即文件从未读入内存),将通过mmap()建立的映射关系从硬盘读取文件。这个过程与内存映射无关。

如果在复制数据时发现物理内存不足,暂时不用的物理页面将通过虚拟内存机制(swap)交换到硬盘,如图1中的流程4所示。这个过程也与记忆有关。

映射无关。

效率

从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图2中过程1,然后再将这些数据拷贝到用户空间,如图2中过程2,在这个过程中,实际上完成了 两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。

图2.read系统调用原理

标签:

版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。