前言
前段时间, 研究了内存映射技术在C/C++中的实现. 当时到网上找文章, 发现相关的文章很多, 但是似乎很多都和我的情况不一样, 而且有些讲得很晦涩. 鉴于自己的经历, 想整理一篇关于C/C++中使用内存映射技术的文章, 供大家参考, 如果能帮到一些朋友的话, 那就真的很开心了.
原创文章, 如果觉得对你有帮助的话, 欢迎点赞, 收藏, 留言, 谢谢.
结论
为了直接了当反映本文想表达的观点, 就先说结论.
C/C++中, 内存映射技术与直接使用open, read等系统底层函数的方式相比, 优势越来越小了, 而且随着内存传输速度的提升, 这一优势会进一步缩小. 这与很多文章的观点不是很符合. 最开始的时候, 我也认为内存映射技术应该比直接使用这些函数好很多, 速度的提升应该很明显, 而且上网查资料(可能大部分资料都比较老了, 所以内存的速度还不是那么快), 都是这么认为的. 可是我自己实际在做的时候, 却发现优势并没有那么明显, 于是我就仔细分析了原因, 有了一些结论, 供大家参考.
内存映射原理
首先, 我们应该做的是分析内存映射的原理. 只有懂得原理, 才能去运用以及分析它. 当然, 由于本人水平有限, 并不能把这个原理讲得很透彻, 但我争取在自己能力范围内把它说得通俗易懂.
我们在读取文件的时候, 必须要做的事情就是把文件从磁盘拷贝到内存中. 这一点无论是内存映射技术也好, 或者使用open, read系统函数读取也好, 都不可避免. 因为CPU只能够处理内存中的数据. 实际上, 关于CPU工作原理, 也有很多的知识, 但是那是另外一个话题了, 我们暂且放下. 目前, 我们要有的一个认识是, 数据从磁盘到内存的这一过程是不可避免的, 而且实际上, 这也是最耗时的传输过程.
对于一个进程来说, 有两部分空间, 分别是内核空间和用户空间. 如果直接使用open, read系统函数去从文件中读取数据, 会先从磁盘到内核空间, 然后再从