导读先说说虚拟内存怎么来的:首先一个前提条件是现在的OS基本都是多道程序设计的,也就是把用 户的多个不同的程序(或者说是进程吧)放在内存里面,然后cpu通过调度算法在来执行相应的程序(或者说是指令),用户程序若

先说说虚拟内存怎么来的:首先一个前提条件是现在的OS基本都是多道程序设计的,也就是把用 户的多个不同的程序(或者说是进程吧)放在内存里面,然后cpu通过调度算法在来执行相应的程序(或者说是指令),用户程序若是项目大,那就是一个文件夹里面有几百或者上千的文件,且每个文件就是上千上万的代码,这样的大小已经足以大于实际的物理内存了。那么这样就产生了一个现象那就是用户程序只有一部分在内存里被执行,所以要执行完整的程序,就引入了虚拟内存的概念,这个虚拟内存就是用来存储不在内存的那部分代码,那虚拟内存实际又是什么,也就是在实际的层面上它是什么??它其实是磁盘的一部分,其实想想也知道,程序等一般是放在磁盘上,只有被执行才放在内存上去被执行,若是内存不够了,程序过大,那就只有放在磁盘上嘛。还有一点是用户程序一部分在内存,一部分在磁盘,要说明的是一般放在磁盘上的代码是那些常常不被执行的代码,比如判断是否出错的语句等,而放在内存上的就是常常要执行的代码了,虚拟内存的代码要被执行同样通过页面置换的算法来被执行(因为这部分代码是在磁盘上的)。

对于内存映射文件,意思就是把磁盘上的文件映射到内存上去,这样进程直接访问内存就可以直接访问文件了,要比一般的I/O操作来的更快。具体实现如下图:

虚拟内存与内存映射的区别

 

这个图来源于网上的https://blog.csdn.net/whoamiyang/article/details/53365385

步骤就是过程1->过程2->过程3->过程4->。

过程1:也就是把磁盘上的文件映射到进程的逻辑内存,我查了书上和网上并没怎么说逻辑内存是什么,逻辑内存其实是相对于进程的来说的,逻辑内存并不存在,之所以有逻辑内存就是因为进程过大、过多导致物理内存不够,所以需要磁盘的帮助来存放部分代码,其实可以理解为虚拟内存,但是进程还有部分代码在内存所以逻辑内存 = 部分物理内存 + 部分磁盘内存,因为有了磁盘的帮助对于进程来说我就有足够的控件来存放代码并被执行。当然这是我的理解。

过程2:当进程要访问磁盘映射的代码时,同样通过页面置换来执行代码,所以第一次访问会产生页错误,因为第一次访问时实际的物理内存并没有存放磁盘的内容,也就是cpu在获得逻辑地址后,在通过页表转换为实际的物理地址发现这部分地址的内容在内存上并没有,所以产生了页错误。由于第一次访问时通过页面置换的算法把磁盘的内容置换到了内存里面,所以当再次访问时就不会产生页错误了。

过程3、4也就是页面置换的过程了。

所以也就是说内存映射文件通过虚拟内存技术而发展的技术,而通过内存映射文件产生的技术就有了内存共享的方法之一了。

二者的区别如下:

1.虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件.

2.二者的架构不同,或者是说应用的场景不同,虚拟内存是架构在物理内存之上,其引入是因为实际的物理内存运行程序所需的空间,即使现在计算机中的物理内存越来越大,程序的尺寸也在增长。将所有运行着的程序全部加载到内存中不经济也非常不现实。内存映射文件架构在程序的地址空间之上,32位机地址空间只有4G,而某些大文件的尺寸可要要远超出这个值,因此,用地址空间中的某段应用文件中的一部分可解决处理大文件的问题,在32中,使用内存映射文件可以处理2的64次(64EB)大小的文件.原因内存映射文件,除了处理大文件,还可用作进程间通信。