物理内存和虚拟内存

一、 虚拟地址的由来在早期的计算机中,要运行一个程序,会把这个程序全部都加载到内存,程序是直接运行到物理内存上的。也就是说,程序运行时直接访问的就是实际的物理内

其实物理内存和虚拟内存的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享物理内存和虚拟内存的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2. 细分

为了解决以上一系列问题,人们想到了一种有效的方法,在程序和物理内存之间添加一个中间层,采用间接地址访问的方式来访问物理内存。根据这种方法,程序中访问的内存地址不再是实际的物理内存地址,而是虚拟地址,然后操作系统将这个虚拟地址映射到物理内存地址。这样,操作系统只要处理好虚拟地址和物理内存地址的映射关系,就可以保证不同程序最终访问的内存地址位于不同的区域,并且不会出现地址重叠的情况,这样可以隔离物理内存地址。作用是保护计算机不被“轻易”损坏。例如,在32位Windows操作系统中,当创建一个进程时,操作系统会为该进程分配4GB的虚拟进程地址空间。之所以是4GB,是因为在32位操作系统中,指针的长度为4字节,4字节指针的寻址能力是从0x00000000到0xFFFFFFFF。最大值0xFFFFFFFF代表4GB容量。与虚拟地址空间相反,还有物理地址空间,它对应真实的物理内存。如果你的电脑上安装了512MB的内存,那么这个物理地址空间所代表的范围就是0x00000000~0x1FFFFFFF。操作系统将虚拟地址映射到物理地址时,只能映射到这个范围,操作系统也只会映射到这个范围。当进程创建时,每个进程都会有自己的4GB虚拟地址空间。需要注意的是,这个4GB 地址空间是“虚拟的”,并不真正存在。而且每个进程只能访问自己的虚拟地址空间中的数据,不能访问其他进程中的数据。这是通过这种方法实现的。进程之间的地址隔离。这4GB的虚拟地址空间是否可供应用程序随意使用?不幸的是,在Windows系统下,这个虚拟地址空间被分为4部分:NULL指针区、用户区、隔离区和内核区。

1)NULL指针区域(0x00000000~0x0000FFFF):如果进程中的线程试图操作该分区中的数据,CPU将造成非法访问。它的作用是当调用malloc等内存分配函数时,如果找不到足够的内存空间,就会返回NULL。无需执行安全检查。它只是假设地址分配成功并开始访问内存地址0x00000000 (NULL)。由于禁止访问该内存分区,因此会发生非法访问并终止进程。

2)用户区(0x00010000~0xBFFEFFFF):该分区存储进程的私有地址空间。一个进程无法以任何方式访问驻留在该分区的另一进程的数据(同一个exe,通过写时复制完成地址隔离)。 (在Windows中,所有.exe和动态链接库都加载到这个区域。系统也会将进程可以访问的所有内存映射文件映射到这个分区)。

3)隔离区(0xBFFF0000~0xBFFFFFFF):禁止访问该分区。任何访问此内存分区的尝试都是非法的。微软保留这个分区的目的是为了简化操作系统的实际情况。

4)内核区(0xC0000000~0xFFFFFFFF):该分区存放操作系统驻留代码。线程调度、内存管理、文件系统支持、网络支持以及所有设备驱动程序代码都加载在这个分区中,该分区由所有进程共享。

虚拟地址空间

由于程序必须运行在真实的物理内存上,而直接操作物理内存比较危险,因此创建了虚拟地址空间,虚拟地址和物理地址之间存在一一对应的映射关系。程序运行地址与物理地址隔离,保证了不同进程地址空间映射到不同人的物理地址空间。这样就解决了同一台计算机上同一程序运行地址不确定的问题,也解决了程序运行时物理内存数据被其他程序修改而导致系统崩溃的问题。然而,物理内存使用效率低下的问题仍然没有得到解决。

3. 分页

为了解决物理内存使用效率低下的问题,人们提出了分页。分页的基本方法是将地址空间划分为许多页。每个页面的大小由CPU决定,然后操作系统选择执行多少个页面。有些CPU页面的大小是4KB,有些CPU页面的大小是4MB。假设页面大小为4KB,那么4GB虚拟内存空间可以分为4102410244=1048576个页面。如果此时电脑中安装的内存条为512MB,那么512MB物理内存可以分为51210244=131072页。显然,虚拟内存地址空间的页数远多于物理内存空间的页数。

在分段方法中,每次运行程序时,整个程序都会被加载到虚拟内存中;而分页方式则不同,它把大部分程序存储在硬盘中。这时,硬盘的这一部分称为“交换区”,并将一小部分要运行的东西加载到虚拟内存中,通过映射在物理内存中运行,从而提高物理内存的利用率。

物理内存和交换区

为了方便CPU高效执行和管理物理内存,每次都需要从虚拟内存中取出一页代码放入物理内存中。虚拟内存页面具有三种状态,即未分配、已缓存和未缓存。

未分配:指的是那些没有被操作系统分配或者创建的。未分配的虚拟页没有任何与之关联的数据或代码,因此不占用磁盘资源;

物理内存和虚拟内存

Cached:表示这部分已经分配了物理内存,虚拟内存和物理内存之间存在映射关系;

未缓存:指已加载到虚拟内存中,但尚未在物理内存中建立映射关系的数据。

4.页表

页表实际上是一个数组。该数组存储一个称为页表项(PTE)的结构。虚拟地址空间中的每个页在页表中都有对应的页表项(PTE)。在进行虚拟页地址转换时,会查询页表中每个虚拟页的PTE来进行地址转换。地址转换的过程如下:

假设每个PTE都有一个有效位和一个n位字段地址。有效位指示对应的虚拟页是否缓存在物理内存中。 0 表示不缓存。 1 表示已缓存。 n位地址字段表示如果没有缓存(有效字段为0)并且n位地址字段不为空,则n位地址字段表示虚拟页在磁盘上的起始位置。如果这个n位字段为空,则表示没有分配虚拟页;如果已被缓存(有效字段为1),则n位地址字段不为空,表示虚拟页在物理内存中的起始地址。

上图中,物理内存中缓存了四个虚拟页VP1、VP2、VP4、VP7。两个虚拟页VP0和VP5尚未分配。但剩余的虚拟页VP3和VP6已被分配,但尚未缓存在物理内存中以供执行。

5.内存管理单元MMU(内存管理单元)

内存管理单元MMU的主要功能是虚拟地址到物理地址的转换。此外,它还可以实现内存保护、缓存控制、总线仲裁和存储体切换。也就是说,程序运行过程所需的物理内存地址是通过一个叫做内存管理单元的东西来完成的。需要注意的是,内存管理单元是由硬件来管理的,而不是由软件来管理的。内存管理单元允许每个程序拥有自己独立的虚拟地址空间,从而提高了物理内存的利用率。它还提供了内存保护功能,可以设置特定内存块的读、写或可执行属性,可以防止内存被程序恶意篡改。其工作流程如下:

六、逻辑地址、线性地址、物理地址和虚拟地址的区别

1)逻辑地址:指程序生成的、与分段相关的偏移地址部分。例如,当你用C语言进行指针编程时,你可以读取指针变量本身的值(操作)。事实上,这个值就是逻辑地址。它是相对于你当前进程的数据段的地址,与绝对物理地址无关。只有在Intel实模式下,逻辑地址才等于物理地址(因为实模式下没有分段或分页机制,CPU不进行自动地址转换)。逻辑地址是Intel保护模式下程序执行代码的偏移地址。 (假设代码段和数据段完全相同)。程序员开发应用程序时,需要处理逻辑地址,不需要处理分段和分页机制。分段和分页是系统程序员需要处理的事情。程序员虽然可以直接操作内存,但是只能在操作系统分配给你的内存段中进行操作。

2)线性地址:是逻辑地址到物理地址转换的中间层。程序代码生成一个逻辑地址,或者说段中的偏移地址,将其与相应段的基地址相加,生成线性地址。如果启用分页,则可以转换线性地址以产生物理地址。如果没有启用分页机制,则线性地址直接是物理地址。 Intel 80386的线性地址空间容量为4G(2的32次方,即32条地址总线进行寻址)。

3)物理地址(Physical Address):是指物理内存在CPU外部地址总线上的当前地址。它是地址转换的最终结果地址,即计算机中安装的内存模块的大小。如果启用分页,则使用页目录和页表中的条目将线性地址转换为物理地址。如果不启用分页机制,则线性地址直接成为物理地址。

4)虚拟地址:指计算机呈现的比实际拥有的内存大得多的内存量。每个程序都使用自己的虚拟内存,并且一般与物理内存大小相同。这使得程序员可以使用比实际系统大得多的内存来编写和运行程序。这使得许多大型项目也可以在内存资源有限的系统上实施。一个恰当的比喻是,如果你想从深圳到北京,你不必坐火车,就像从深圳到北京的距离一样长。你只需要两段比火车稍长的铁轨就可以完成任务。火车运行时,只要铺轨速度足够快,通过在路上交替铺设两段轨道,火车就可以从深圳行驶到北京,让火车感觉像是在铁路上运行。这就是虚拟内存管理需要完成的任务。在Linux 0.11内核中,每个进程被划分为一个总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。有时我们也将逻辑地址称为虚拟地址。逻辑地址和物理地址的差是0xC0000000,因为虚拟地址-线性地址-物理地址映射正是通过这个值不同的。该值由操作系统指定。逻辑地址(或虚拟地址)到线性地址是由CPU的分段机制自动转换的。如果没有启用分页管理,则线性地址就是物理地址。如果启用分页管理,系统程序需要参与线性地址到物理地址的转换过程。具体来说,这是通过设置页目录表和页表项来完成的。

用户评论

物理内存和虚拟内存
剑已封鞘

这篇博客解释得非常清晰!以前对物理内存与虚拟内存的概念一直不太懂,阅读后我终于明白了区别和它们之间的关系。感谢作者的分享!

    有17位网友表示赞同!

物理内存和虚拟内存
莫飞霜

对于程序员来说,理解虚拟内存是至关重要的。这篇文章总结得很不错,让复杂的技术概念变得简单易懂。

    有5位网友表示赞同!

物理内存和虚拟内存
七级床震

虚拟内存是不是会影响系统运行速度呢?感觉我的电脑有时候反应很慢,不知道是不是与虚拟内存有关?

    有14位网友表示赞同!

物理内存和虚拟内存
又落空

我一直以为物理内存和虚拟内存是一样的,原来它们是不同的概念!感谢作者的讲解,让我对这方面的知识有了更深入的了解。

    有17位网友表示赞同!

物理内存和虚拟内存
(り。薆情海

文章内容很棒,但我觉得可以再详细一点,比如讲一些常见的虚拟内存管理算法,那样我们就能更全面地理解这个话题了。

    有8位网友表示赞同!

物理内存和虚拟内存
稳妥

虽然我并不是程序员,但是通过阅读这篇博客也能对物理内存与虚拟内存有一个基本的认识。感谢作者用通俗易懂的语言讲解技术知识!

    有7位网友表示赞同!

物理内存和虚拟内存
念初

学习计算机硬件真是太难了。这些概念抽象而复杂,有时候我真的需要花很多时间才能理解。

    有7位网友表示赞同!

物理内存和虚拟内存
♂你那刺眼的温柔

我觉得这篇文章写的有些过于简略了,没有深入探讨虚拟内存的一些细节问题,比如页表、换页等。 为了能让读者更全面地理解这个主题,应该提供更多具体的例子和解释。

    有15位网友表示赞同!

物理内存和虚拟内存
煮酒

我曾经遇到过系统分配不充足的物理内存的情况,导致程序运行缓慢,这篇文章让我意识到虚拟内存的重要性!

    有20位网友表示赞同!

物理内存和虚拟内存
猫腻

为什么有些网站会提示“打开网页需要消耗大量虚拟内存”?是不是虚拟内存使用过多会导致电脑运行慢?

    有6位网友表示赞同!

物理内存和虚拟内存
封心锁爱

我觉得这篇博客对于初学者来说非常实用,它能够帮助我们对物理内存与虚拟内存有一个清晰的认识。

    有8位网友表示赞同!

物理内存和虚拟内存
回到你身边

学习计算机专业,这些抽象的概念真是让人头疼! 希望以后能有更直观生动的学习方法!

    有16位网友表示赞同!

物理内存和虚拟内存
ˉ夨落旳尐孩。

如果想要提升电脑性能,需要关注哪些因素呢?除了物理内存容量,还有其他方面吗?

    有5位网友表示赞同!

物理内存和虚拟内存
ゞ香草可樂ゞ草莓布丁

" 虚拟内存机制确实很牛逼,可以有效利用硬件资源,提高系统效率!"

    有8位网友表示赞同!

物理内存和虚拟内存
一纸愁肠。

想问一下,如果物理内存不足怎么办?难道只能扩充物理内存了吗?有没有办法通过优化虚拟内存来解决这个问题?

    有14位网友表示赞同!

物理内存和虚拟内存
看我发功喷飞你

这篇文章让我对虚拟内存有了更深入的理解。原来它并不是简单的内存分配机制,还涉及到页表、换页等复杂的操作!真佩服那些计算机科学家们!

    有19位网友表示赞同!

物理内存和虚拟内存
病态的妖孽

我平时用电脑玩游戏时经常会遇到卡顿的情况,是不是因为虚拟内存不足导致的呢?

    有10位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/154608.html

(0)
小su的头像小su
上一篇 2024年9月20日 下午12:51
下一篇 2024年9月20日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注