Linux编程之mmap示例

Linux下的文件读写通常涉及三次数据拷贝。mmap提供了一种优化方式,允许直接在用户空间读写page cache,减少了拷贝次数。通过mmap映射文件的页缓存,读写操作直接作用于文件,但需注意同步到磁盘的时机:msync、munmap、进程退出或系统关机。本文包含mmap示例和理论解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题背景

Linux下,针对文件读写操作,一般有三个步骤:
1)把文件内容读入到内存中;调用read(系统调用),从内核态读取文件内容到虚拟内存;
2)修改内存中的内容;在用户空间修改内存中的信息;
3)把内存的数据写入到文件中;调用write(系统调用),从用户态将修改后的内容写入到文件;
过程如下图所示:(本文只讨论mmap,关于page cache,请查看:https://www.cnblogs.com/ronnieyuan/p/12377059.html

显然一次文件的修改操作,我们对文件内容拷贝了两次;

如何优化上述的文件读写操作?如果可以直接在用户空间读写page cache,那么就不需要将文件数据拷贝到用户空间缓存区这个动作了,mmap即可完成;

使用mmap系统调用可以将用户空间的虚拟内存地址与文件进行映射绑定,对映射或的虚拟内存地址进行读写操作,就如同对文件进行读写操作一样。原理图如下所示:

通过上图可以看出,读写文件都需要经过页缓存,所以mmap映射的正是文件的页缓存,而非磁盘中的文件本身。由于mmap映射的是文件的页缓存,所以就涉及到同步的问题,即页缓存会在什么时候把数据同步到磁盘。Linux内核并不会主动把mmap映射的页缓存同步到磁盘,而是需要用户主动触发。同步mm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值