什么是虚拟内存?与实际物理内存的关系?

声明:我是一个新手,有一些理解可能不准确,希望有大佬能指出错误,万分感谢!

虚拟内存的概念及其实现方法

1.1 什么是内存

内存是相对于外存而言的,所谓“内外”,由于CPU处理器是最核心的部分,所以“内存”指的是比较靠近核心的、能直接被CPU读写数据的那一个数据容器。通常这个容器的容量较小,读写速度较快。而“外存”指的是离CPU稍远一些的容数据器(如磁盘),外存一般空间较大,但读写速度较慢(比CPU的处理速度要慢得多),所以不宜直接让CPU去读外存数据,否则CPU都已经把数据处理完了,新的数据还没读进来,让CPU在空等就是浪费时间。因此需要在CPU与外存之间多搞了一个叫内存的东西,来提升速度。

1.2 什么是虚拟内存

因为内存容量对一个大程序而言是在是太小,很难将整个程序直接从外存读到内存里(内存放不下,就算放得下一个,也无法放下多个需要同时运行的程序),虽然这些年内存的速度和大小一直在升级,但对于程序员来说,只要有需要,就能写出非常非常大的程序,所以内存的大小和速度始终无法满足实际需求。
所以计算机学家想出了一个点子——虚拟内存。这是一种在不扩大实际内存容量的情况下,让内存看上去能放下更多程序的方法。这是怎么做到的?
在虚拟内存技术出现之前是将完整的程序从外存(如磁盘)读入内存中,但是现在虚拟内存不这么做,虚拟内存技术将一个完整的程序切割成多份,当CPU要执行这个程序时,内存先把该程序的第一份送入CPU,然后马上又问磁盘拿同一个程序的第二份内容,然后再送入CPU。这样做就使得内存中可以出现更多的程序头(程序的第一份),而不是一个完整的程序占满整个内存。
说到这里其实还没讲到虚拟内存最精髓的地方,“虚”到底虚在哪?虚拟内存和实际内存都存储着多个程序头(被切割出来的第一份),但是虚拟内存胆子很大,他敢记录实际物理内存中没有记录的程序头。所以在容量上看,虚拟内存比实际物理内存要大很多,“虚”就是“比实际更多”的意思。你可能觉得很奇怪,虚拟内存表里记录了在实际物理内存不存在的程序头,那CPU是怎么从实际物理内存中读到不存在的程序头的?这个简单,CPU只会盯着虚拟内存表看,不会再管实际物理内存里有什么,当CPU在虚拟内存表里调用了一个在实际物理内存中不存在的程序头时,物理内存马上去外存(磁盘)里找这个程序头,然后把物理内存中不常运行的程序头踢出去,将CPU需要的程序头放到这个空的位置上,供CPU使用。另一种情况是如果CPU要使用的程序头刚好实际物理内存里有,那就直接用。

1.3 虚拟内存的作用

虚拟内存解决了两部分的问题:
① 防止一个程序太大,无法整体放入物理内存,所以将程序都分割成多份,这样内存中就可以保存很多个不同的程序头,同时也避免了把一整个程序送进来让CPU等待好几秒的尴尬。当CPU要调用内存中的程序头的时候,内存再联系外存(磁盘),让外存一份份送来内存,在送的时间里,CPU可以去处理其他已在内存中的程序头。
② 虚拟内存表里记录了很多物理内存中没有的程序片段,所以欺骗了CPU,让CPU以为内存真的很大,实际情况是,如果CPU调用了物理内存上没有,但虚拟内存表中有的程序时,物理内存会马上“将功补过”,去磁盘找这个程序的头部片段,因为切割后的一份也不大,所以不会让CPU等很久。

上面说的只是形象地描述了虚拟内存的概念、行为以及作用,具体的实现方法要复杂一些,还涉及到内存管理单元(MMU)和地址映射之类的知识,但是有了总体的概念,再去看书,应该会好理解很多。

    原文作者:Dolance
    原文地址: https://blog.csdn.net/weixin_42243865/article/details/122493634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞