虚拟内存和物理内存有什么区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟内存和物理内存有什么区别?相关的知识,希望对你有一定的参考价值。

我经常对操作系统中的虚拟化概念感到困惑。考虑将RAM作为物理内存,为什么我们需要虚拟内存来执行进程?

当来自外部硬盘驱动器的进程(程序)被带到主存储器(物理存储器)以执行时,该虚拟存储器的位置。

谁负责虚拟内存以及虚拟内存的大小?

假设RAM的大小是4GB(即2 ^ 32-1地址空间),虚拟内存的大小是多少?

答案

除其他外,虚拟内存是一种抽象,为程序员提供了在系统上拥有无限内存的错觉。

虚拟内存映射与实际物理地址相对应。操作系统创建并处理这些映射 - 利用页表以及其他数据结构来维护映射。虚拟内存映射总是在页表或某些类似的数据结构中找到(在虚拟内存的其他实现的情况下,我们可能不应该将其称为“页表”)。页表也在物理内存中 - 通常在内核保留空间中,用户程序无法写入。

虚拟内存通常比物理内存大 - 如果虚拟内存和物理内存大小相同,虚拟内存映射的理由就不多了。

只有程序所需的部分通常驻留在内存中 - 这是一个名为“分页”的主题。虚拟内存和分页紧密相关,但不是相同的主题。还有其他虚拟内存实现,例如分段。

我可能会在这里假设错误,但我敢打赌你发现难以解决的问题与虚拟内存的特定实现有关,很可能是分页。没有一种方法可以进行分页 - 有许多实现,你的教科书描述的那个可能与Linux / Windows等实际操作系统中出现的实现不一样 - 可能存在细微差别。

我可以写一千段有关分页的内容......但我认为最好留给另一个专门针对该主题的问题。

另一答案

软件在操作系统上运行的前提非常简单 - 它们需要内存。设备OS以RAM的形式提供它。所需的内存量可能会有所不同 - 某些软件需要大量内存,有些需要微不足道的内存。大多数(如果不是全部)用户同时在OS上运行多个应用程序,并且鉴于内存很昂贵(并且设备大小有限),可用内存量总是有限的。因此,鉴于所有软件都需要一定数量的RAM,并且所有软件都可以同时运行,操作系统必须处理两件事:

  1. 软件总是运行直到用户中止它,即它不应该自动中止,因为操作系统内存不足。
  2. 上述活动,同时为运行的软件保持了可观的性能。

现在主要问题归结为如何管理内存。究竟是什么决定了存储器中属于给定软件的数据所在的位置?

可能的解决方案1:让各个软件明确指定它们将在设备中使用的存储器地址。假设Photoshop声明它将始终使用从01023的内存地址(将内存设想为字节的线性数组,因此第一个字节位于0位置,1024th字节位于1023位置) - 即占用1 GB内存。同样,VLC声明它将占用内存范围12441876等。

好处:

  1. 每个应用程序都预先分配了一个内存插槽,因此在安装和执行时,它只是将其数据存储在该内存区域中,一切正常。

缺点:

  1. 这不规模。从理论上讲,应用程序在执行非常重要的操作时可能需要大量内存。因此,为了确保它永远不会耗尽内存,分配给它的内存区域必须始终大于或等于该内存量。如果最大理论内存使用量为2 GB(因此需要从RAM中分配2 GB内存)的软件安装在只有1 GB内存的机器上会怎么样?该软件是否应该在启动时中止,并说可用的RAM小于2 GB?或者它应该继续,并且当所需的内存超过2 GB时,只是中止并挽救没有足够的内存可用的消息?
  2. 无法防止内存损坏。有数百万的软件,即使每个软件都只分配1 kB内存,所需的总内存将超过16 GB,这比大多数设备提供的更多。那么,如何为不同的软件分配不会侵占彼此区域的内存插槽呢?首先,没有集中的软件市场可以规范当一个新软件被发布时,它必须从这个尚未占用的区域分配这么多的内存,其次,即使有,也不可能这样做,因为没有。软件实际上是无限的(因此需要无限的内存来容纳所有这些),并且任何设备上可用的总RAM不足以容纳所需的一小部分,因此不可避免地会侵占一个软件的内存边界在另一个。那么当Photoshop被分配内存位置11023并且VLC被分配10001676时会发生什么?如果Photoshop在1008位置存储了一些数据,那么VLC会用自己的数据覆盖它,后来Photoshop访问它,认为它是先前存储的相同数据?可以想象,糟糕的事情会发生。

很明显,正如你所看到的,这个想法很天真。

可能的解决方案2:让我们尝试另一种方案 - 操作系统将执行大部分内存管理。软件无论何时需要任何内存,都只需要操作系统,操作系统也会相应地适应。假设OS确保每当新进程请求内存时,它将从可能的最低字节地址分配内存(如前所述,RAM可以想象为线性字节数组,因此对于4 GB RAM,地址范围为从02^32-1的一个字节)如果进程正在启动,否则如果它是一个请求内存的正在运行的进程,它将从该进程仍然驻留的最后一个内存位置进行分配。由于软件将在不考虑存储数据的实际存储器地址的情况下发送地址,因此OS必须维护软件发出的地址到实际物理地址的每个软件的映射(注意:这是我们称之为Virtual Memory概念的两个原因之一。软件并不关心存储数据的实际内存地址,它们只是动态地吐出地址,操作系统找到适合它的地方并找到它以后如果需要)。

假设设备刚刚打开,操作系统刚刚启动,现在没有其他进程在运行(忽略操作系统,这也是一个进程!),并且您决定启动VLC。因此,VLC从最低字节地址分配RAM的一部分。好。现在,当视频正在运行时,您需要启动浏览器才能查看某个网页。然后你需要启动记事本来涂写一些文字。然后Eclipse做一些编码..很快你对4 GB的记忆就用完了,RAM看起来像这样:

enter image description here

问题1:现在你无法启动任何其他进程,因为所有的RAM都用完了。因此,必须编写程序,保持最大可用内存(实际上甚至更少,因为其他软件也将并行运行!)。换句话说,你不能在摇摇欲坠的1 GB PC中运行高内存耗费的应用程序。

好的,现在您决定不再需要保持Eclipse和Chrome打开,关闭它们以释放一些内存。这些进程在RAM中占用的空间由OS回收,现在看起来像这样:

enter image description here

假设这两个释放了700 MB空间 - (400 + 300)MB。现在你需要启动Opera,它将占用450 MB空间。嗯,你确实有超过450 MB空间可用,但是......它不是连续的,它被分成单独的块,其中没有一个足够大以适合450 MB。所以你想出了一个绝妙的想法,让我们将下面的所有过程尽可能地移动到上面,这将使700 MB空白区域位于底部的一个块中。这叫做compaction。太好了,除了...所有进程都在运行。移动它们将意味着移动所有内容的地址(记住,操作系统维护软件的内存吐出到实际内存地址的映射。想象一下,软件用数据45吐出了123的地址,操作系统已经存储了它在位置2012并在地图中创建了一个条目,将45映射到2012。如果软件现在在内存中移动,那么曾经位于2012的地方将不再是2012,而是在新的位置,操作系统必须更新地图相应地将45映射到新地址,以便软件在查询内存位置123时可以获得预期数据(45)。就软件而言,它只知道地址45包含数据123 !)!想象一下引用局部变量i的过程。当它再次被访问时,它的地址已经改变,它将无法再找到它。对于所有函数,对象,变量都是一样的,基本上所有东西都有一个地址,移动一个进程意味着改变所有这些的地址。这导致我们:

问题2:您无法移动流程。该进程中的所有变量,函数和对象的值都具有硬编码值,在编译期间由编译器吐出,该进程依赖于它们在其生命周期内处于相同位置,并且更改它们是昂贵的。结果,当他们退出时,流程留下了大的“holes”。这叫做External Fragmentation

精细。假设某种方式,通过一些奇迹般的方式,你确实设法将进程向上移动。现在底部有700 MB的自由空间:

enter image description here

Opera平稳地适应底部。现在你的RAM看起来像这样:

enter image description here

好。一切都很好看。但是,剩下的空间不大,现在你需要重新启动Chrome,这是一个已知的记忆猪!它需要大量的内存才能启动,你几乎没有剩下任何东西......除了......你现在注意到一些最初占据大空间的进程现在不需要太多空间。可能你已经在VLC中停止了你的视频,因此它仍然占用了一些空间,但没有运行高分辨率视频时所需的那么多。同样适用于记事本和照片。你的RAM现在看起来像这样:

enter image description here

Holes,再一次!回到原点!除了以前,由于过程终止而发生了漏洞,现在这是因为过程需要的空间比以前少!并且你再次遇到同样的问题,holes合并产生的空间超过了所需的空间,但是它们分散在一起,没有太多的孤立使用。因此,您必须再次移动这些流程,这是一项昂贵的操作,而且非常频繁,因为流程在其生命周期内的规模经常会缩小。

问题3:进程在其生命周期内可能会减小尺寸,留下未使用的空间,如果需要使用,则需要移动许多进程的昂贵操作。这叫做Internal Fragmentation

很好,所以现在,你的操作系统完成所需的操作,移动进程并启动Chrome,一段时间后,你的RAM看起来像这样:

enter image description here

凉。现在假设你再次继续观看VLC中的阿凡达。它的内存需求将会上升!但是......没有留下任何空间让它成长,因为记事本在它的底部依偎着。因此,所有流程都必须向下移动,直到VLC找到足够的空间!

问题4:如果流程需要增长,那将是一项非常昂贵的操作

精细。现在假设,照片用于从外部硬盘加载一些照片。访问硬盘会使您从缓存和RAM的范围转移到磁盘的范围,磁盘的数量级会慢一些。痛苦,不可逆转,超越性。它是一个I / O操作,这意味着它不受CPU限制(它恰恰相反),这意味着它现在不需要占用RAM。但是,它仍然固执地占用RAM。如果你想在此期间启动Firefox,你不能,因为没有太多的可用内存,而如果在I / O绑定活动期间照片被占用内存,它将释放大量内存,然后是(昂贵的)压缩,然后是Firefox适合。

问题5:I / O绑定作业继续占用RAM,导致RAM利用率不足,同时可能被CPU绑定作业使用。

因此,正如我们所看到的,即使采用虚拟内存的方法,我们也遇到了很多问题。


有两种方法可以解决这些问题 - pagingsegmentation。让我们讨论一下paging。在这种方法中,进程的虚拟地址空间以块的形式映射到物理内存 - 称为pages。典型的page尺寸是4 kB。映射由称为page table的东西维护,给定一个虚拟地址,现在我们要做的就是找出地址所属的page,然后从page table找到实际物理内存中page的相应位置(称为frame),并且鉴于page中的虚拟地址的偏移对于page以及frame是相同的,通过将该偏移量添加到page table返回的地址来找出实际地址。例如:

enter image description here

左侧是进程的虚拟地址空间。假设虚拟地址空间需要40个单元的内存。如果物理地址空间(右侧)也有40个单位的内存,则可以将所有位置从左侧映射到右侧的位置,我们会非常高兴。但是,幸运的是,物理内存不仅具有较少的(24个)存储单元,它还必须在多个进程之间共享!好吧,让我们看看我们如何处理它。

当进程开始时,请说出位置35的内存访问请求。这里的页面大小是8(每个page包含8位置,因此40位置的整个虚拟地址空间包含5页面)。所以这个位置属于第页。 435/8)。在这个page,这个位置有335%8)的偏移。所以这个位置可以由元组(pageIndex, offset) = (4,3)指定。这只是一个开始,所以过程的任何部分都没有存储在实际的物理内存中。所以page table,它保持左边页面到右边实际页面的映射(它们被称为frames)目前是空的。因此OS放弃CPU,让设备驱动程序访问磁盘并获取页面号。 4用于此过程(基本上是磁盘上程序的内存块,其地址范围从3239)。当它到达时,OS将页面分配到RAM中的某个位置,比如第一帧本身,并且此过

以上是关于虚拟内存和物理内存有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

电脑是先使用内存条实际内存,还是先用虚拟内存

Linux中关于swap,虚拟内存和page的区别

CMD中的虚拟内存的命令是啥

虚拟内存与物理内存的联系与区别

虚拟内存与物理内存的联系与区别

虚拟内存与物理内存的联系与区别