昨天晚上,浏览开发者头条,里面有一篇文章介绍了Java的IO模型,介绍中nio的原理时提到了内存映射的内容,感觉不是很清楚,于是趁着今晚没有事干,写篇文章总结下。

什么是文件内存映射

将磁盘上的文件与进程中的逻辑地址空间关联起来,建立映射关系,就是文件内存映射。这样对于文件进行操作时,就不需要普通意义上的IO操作了。可以直接在内存中操作文件。

内存映射的原理

image

这是我参考了一篇文章,然后经过自己的理解画的一个示意图(原图实在是很难理解)。

这里解释下为什么文件内存映射要比一般的文件IO速度快。

就以文件读取为例。

IO方式:

读文件我们使用的是系统调用 read()。而Linux的系统机制决定了文件需要经过两次拷贝:即第一次从磁盘中拷贝到内核空间,第二次从内核空间拷贝到用户空间。

实际的应用程序是不能感知到内核空间的,因为内核空间是留给很多系统级别的应用的,如果用户能随意访问,则此系统容易受到破坏,所以为了保护系统,专门为了系统使用而设计了内核空间。

而应用程序能够访问的是用户空间,所以需要进行再次拷贝。

内存映射方式:

从上图中可以看到,只有在物理内存中没有找到该文件时,才从磁盘中拷贝文件,而且只拷贝一次。
单从拷贝次数上,内存映射已经占了优势,除此之外,在IO时需要进行用户态和内核态之间的切换,这是需要中断来实现的,也是需要开销的地方。

参考

1.http://blog.csdn.net/mg0832058/article/details/5890688