写C/C++,离不开文件IO。
read、write、fread、fwrite,这几个函数每个程序员都在用,但你有没有想过,当你读一个1GB的大文件时,数据在内存里被拷贝了多少次?更重要的是,有没有一种方法,能让你像访问内存一样访问文件,而且性能还更好?
有。这就是mmap。
这篇文章,我会从传统IO的问题讲起,一步步带你理解mmap的底层原理,最后给出一个现代C++的封装方案。文章有点长,但看完你会对Linux内存映射有一个全新的认识。
一、为什么需要mmap?
先说结论:传统IO拷贝次数太多,系统调用开销太大,随机访问效率太低。
这三个问题,在小文件、顺序读写的场景里可能感知不明显,但在大文件、随机访问的场景下,每一个都是性能杀手。
1.1 传统IO的4次拷贝
我们来看一个最常见的场景:从磁盘读取文件内容,然后通过网络发送出去。
charbuf[4096];while