什么是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去完成。不过也有好处省的我搬来搬去。