进程读写数据时不仅使用read和write,还可以使用mmap进行文件映射mmap linux 文件,区别如右图所示:
可以看见,c盘文件加载到显存后,还须要执行一次拷贝操作。
假如使用mmap,则是c盘文件直接加载到用户空间,也就是上图中深蓝色部份,进程可以通过表针直接操作文件。
粗看上去mmap少了一次拷贝硬盘安装linux,理论上比read要快。并且,调用mmap后并不会真实将文件加载到显存,因而在读写过程中(非常是大文件)会触发大量中断,致使性能增加,即使使用madvise调用加速参数都没有用。这儿提供一个小技巧,对文件每一页读取一下首字节:
里面的代码我们使用两个数据完全相同8M文件,瞧瞧执行预加载和不执行预加载后的表现:
可以看见执行预加载调用速率显著比不执行要快。使用madvise加速有没有疗效呢?看一下:
没有疗效,还是执行预加载调用速率显著比不执行要快。程序两次读文件时间略有误差,是由于cpu与显存本身的电气特点。
鲁棒性
当使用mmap进行共享映射时,多个进程可以操作同一文件,典型场景就是使用vim编辑文件,之后使用cat查看文件,如右图:
这个时侯就有竞争场景了mmap linux 文件,进程1和2分别只能看到自己的私有虚拟地址linux系统镜像下载,须要调用者自己实现锁机制,详情可以参考写时拷贝机制。
引申
mmap的具体使用可以参考UNIX环境中级编程14.8节(储存映射IO),网上的资料基本是该节更改而至。
本书电子版链接:
提取码:81r1
更多自学资源(含机械设计、软件相关资源)敬请私信或留言。
文章评论