虚拟内存 MMU mmap

1. 虚拟内存

  • 虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys。
  • 它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
  • 虚拟内存为每个进程提供了一个非常大的、一致的、私有的地址空间。
  • 假设每个进程创建加载的时候,会被分配一个大小为4G的连续的虚拟地址空间,虚拟的意思就是,其实这个地址空间是不存在的,仅仅是每个进程“认为”自己拥有4G的内存,而实际上,它用了多少空间,操作系统就在磁盘上划出多少空间给它,等到进程真正运行的时候,需要某些数据并且数据不在物理内存中,才会触发缺页异常,进行数据拷贝。
  • 比如dota进程分配虚拟内存地址1-1000,lol进程分配虚拟内存地址1-1000。虚拟内存地址可以重复分配,而且不同的进程映射的实际物理地址是不同的。
    如果没有虚拟地址,只有物理地址,那么dota分配1-1000,lol就不能再使用1-1000,只能分配1001-2000,但是如果物理内存只有1000个地址,这些程序就无法运行,因为程序需要的内存超过了物理内存大小,但是虚拟内存可以重复分配,就可以同时运行了。(纯属个人理解)

2. MMU

  • Memory Management Unit,内存管理单元,是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。
  • 负责虚拟地址与物理地址的转换,提供硬件机制的内存访问授权。

3. mmap

  • mmap是一种内存映射文件的方法,即将硬盘文件映射到进程虚拟地址空间中的一块区域,但没有真正分配物理内存。
  • mmap()会返回一个指针ptr,它指向进程虚拟地址空间中的一个地址,这样进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作文件。但是ptr所指向的是一个虚拟地址,要操作其中的数据,必须通过MMU将虚拟地址转换成物理地址;
  • 虽然建立了内存映射,但文件内容并没有加载到物理内存中,所以当进程在访问这段地址时,会发生缺页异常(page fault),由内核的缺页异常处理程序处理,将这部分文件内容从磁盘拷贝到物理内存;
  • 最终直接通过内存操作访问到硬盘上的文件,而不必再调用read,write等系统调用函数。

效率

  • 在不使用mmap读写文件时,首先发生系统调用read(),将文件内容从硬盘拷贝到内核空间的一个缓冲区,然后再将这些数据拷贝到用户空间,发生两次数据拷贝;
  • 而使用mmap(),直接将文件从硬盘拷贝到用户空间,只进行一次数据拷贝;
  • 因此,内存映射的效率要比read/write效率高。

参考
https://www.jianshu.com/p/da998d55ea36
https://www.jianshu.com/p/046f5ea45acd

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值