linux 文件读写 加速,MMAP文件加速读写小技俩

进程读写数据时除了使用read和write,还可以使用mmap进行文件映射,区别如下图所示:

a7be947e7d1206394b6732a49e586186.png

可以看到,磁盘文件加载到内存后,还需要执行一次拷贝操作。

如果使用mmap,则是磁盘文件直接加载到用户空间,也就是上图中深黄色部分,进程可以通过指针直接操作文件。

粗看起来mmap少了一次拷贝,理论上比read要快。但是,调用mmap后并不会真实将文件加载到内存,因此在读写过程中(特别是大文件)会触发大量中断,导致性能降低,就算使用madvise调用加速参数都没有用。这里提供一个小方法,对文件每一页读取一下首字节:

933cc345d4ddbc22302cd135c7347f6f.png

上面的代码我们使用两个数据完全相同8M文件,看看执行预加载和不执行预加载后的表现:

dbe59153d3eb96f730d877e5b9de0cf4.png

可以看到执行预加载调用速度明显比不执行要快。使用madvise加速有没有效果呢?看一下:

16edb699a29a0ce09217ee593f4d5f85.png

没有效果,还是执行预加载调用速度明显比不执行要快。程序两次读文件时间略有偏差,是因为cpu与内存本身的电气特性。

鲁棒性

当使用mmap进行共享映射时,多个进程可以操作同一文件,典型场景就是使用vim编辑文件,然后使用cat查看文件,如下图:

c69254293cb0f322c8ecd2374354ba50.png

这个时候就有竞争场景了,进程1和2分别只能看见自己的私有虚拟地址,需要调用者自己实现锁机制,详情可以参考写时拷贝机制。

引申

mmap的具体使用可以参考UNIX环境高级编程14.8节(存储映射IO),网上的资料基本是该节修改而来。

8ea252e4e6e438e4057735a3e00299b5.png

本书电子版链接:https://pan.baidu.com/s/14cLZBde6ZXGTeZlqcVziZA

提取码:81r1

更多自学资源(含机械设计、软件相关资源)敬请私信或留言。

ac7bc5b4929b8f89323a6624b2ddaebd.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值