浅谈mmap

本文介绍了mmap的概念,包括进程虚拟地址空间、内存管理的基础知识,并详细阐述了mmap的功能、参数及典型应用场景,如进程间共享内存、避免数据拷贝的文件读写、作为malloc的底层实现等。同时,文章还讨论了mmap的写时拷贝特性以及磁盘文件映射的细节。

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

奇技指南

作者说:最近在工作中遇到一个mmap使用相关的问题,造成了一定的困惑,于是花了些时间补了下 mmap的功课,在这里分享给大家,错误和不足之处大家多指教。

相关背景知识

  • 说到mmap的使用,我们首先要了解一下进程的虚拟进程地址空间的概念。Linux上为了作进程隔离,每个进程都运行在自己的单独的虚拟进程空间,同时物理机上内存有限,每个进程使用虚拟内存地址来隔离又共享物理内存。我们平时在代码里获取的地址就是虚拟地址;

  • 放一张进程虚拟地址空间草图,网上也可以很容易找到更精美的 

640?wx_fmt=jpeg
  • 我们在程序中申请内存的操作,实际上只是在进程地址空间相应部分申请了一段虚拟地址,当实际对这段虚拟地址进行读写操作时,才会分配真正的物理内存;

  • 通常x86 Linux采用段页式的内存管理模式,这块不具体展开,简单来说就是CPU访问的逻辑地址,然后经过分段机制转换成线性地址(你可以简单理解成等价于上面说的虚拟地址),再经过分页机制转换成物理地址,第一次访问的时候由于实现物理地址还没有分配,会产生缺页中断来分配物理地址,用它来填充对应的页表项;

  • 通过read系统调用来读取磁盘上的文件时,文件内容会先被读到内存的page cache部分,然后再从page cache中拷贝到应用层的读缓存buffer中;对于打开的文件,内核都会在内存中维护一个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值