大白话系列之mmap

mmap是Linux内核提供的一种系统调用,主要用于实现零拷贝和文件映射。通过mmap,文件可以直接映射到内存,减少CPU上下文切换和数据拷贝,提高效率。当需要读取文件时,数据从磁盘加载到物理内存,并通过MMU(内存管理单元)进行虚拟地址到物理地址的转换,实现了从文件到进程空间的直接访问,避免了数据在用户空间和内核空间间的多次拷贝。这种方法在高并发I/O操作中尤其有用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

什么是mmap?

mmap是linxu内核提供的一个系统调用。说白了就是linux给你提供的一个方法。linux肯定不是闲着没事干非要给自己找事,mmap肯定是为了解决什么东西而出现的,那他能解决什么事呢?我觉得从两个事说起,一个是零拷贝,另外一个是epoll。

mmap将一个文件或者其它对象映射进内存

就跟我们平时做关系型数据库两个表映射一样,需要找一个中间表,那mmap的中间表在哪里呢?在mmu(内存管理单元)中有一张页表,表的作用内存虚拟地址到内存物理地址的转换。

假如一个文件a.txt,物理地址是aaa,进程调用系统函数mmap(a.txt)后,会在虚拟空间的文件映射区开一快空间虚拟地址bbb,然后将bbb和aaa的映射关系保存到mmu的页表中,通过bbb在mmu的页表中就能找到aaa。

但是文件a并没有真的拷贝到物理内存中,有点像给了一句口头承诺,东西放这里了,要的时候你自己来拿,你感觉自己有了,但实际上只是一句承诺。

当真的要读取a文件时,cpu拿着虚拟地址bbb到mmu查找,查出来aaa发现只是一句承诺,于是拿着aaa找到a.txt加载到物理内存,物理内存地址为ccc,将承诺变现。mmu将物理内存地址与虚拟内存地址进行映射,将bbb映射为ccc。

你以为事情很完美的结束了,其实你发现,其实a.txt始终没有到过进程空间,一直只是个映射。。。

先说零拷贝

零拷贝说白了就是减少cpu上下文切换和拷贝次数,平时我们读写一个a文件的时候,读a文件->拷贝到内核空间->拷贝用户空间->写a文件->拷贝内核空间->a文件。发没发现点问题?拷贝到内核空间->拷贝用户空间->写a文件->拷贝内核空间,如果不用拷贝到用户空间,在用户空间画出来一块区域,将这块区域与内核空间做一个映射关系,操作用户空间就好像直接操作文件,是不是很爽。有点什么感觉呢?老西想给老潘送东西但是必须先经过王婆,但是老潘其实对老西的东西不太喜欢每次拿到了就送给武龟,送给别人也还是要将东西送回王婆那里,再由王婆转交给别人。于是老西就跟老潘说,下次你把东西放王婆那里就好了,我知道有这么个东西我用的时候自己跟王婆要,下次老西再给老潘送东西的时候还是把东西送到王婆那里,但是王婆不会给老潘送去了,老潘知道东西在王婆那里,再想把东西送给别人的时候直接从王婆让王婆送给武龟,老潘省了两次拌匀的过程。

总结

总结一句话呢?就是mmap略等于 mmp(妈卖批)。。。欺骗了进程,进程一直拿到的是承诺,始终没有真的拿到过实物。实物一直是mmu在管理,我的东西根本不经过我手,怎么操作都是mmu去完成。不过也有好处省的我搬来搬去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值