![什么是虚拟内存?](https://linux22.com/image/1216062/%E4%BB%80%E4%B9%88%E6%98%AF%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%EF%BC%9F.png)
我仔细检查了“虚拟内存”的笔记,教科书中的定义是:
分配一部分辅助存储器作为主存储器的一部分的过程
然而维基百科说:
虚拟内存是一种计算机系统技术,它使应用程序认为它具有连续的工作内存(地址空间)
并且(维基百科也说)
请注意,“虚拟内存”不仅仅是“使用磁盘空间来扩展物理内存大小”
有人可以澄清哪一个是正确的吗?
答案1
Note that "virtual memory" is more than just "using disk space to extend physical memory size"
虚拟内存是为每个进程提供的一层抽象。计算机有 2GB 的物理 RAM,地址范围从 0 到 2G。进程可能会看到 4GB 的地址空间,它完全属于自己。从虚拟地址到物理地址的映射由内存管理单元处理,该单元由操作系统管理。通常以 4KB“页面”为单位完成。
这给出了几个特点:
- 一个进程无法看到其他进程的内存(除非操作系统希望如此!)
- 给定虚拟地址的内存可能不位于相同的物理地址
- 虚拟地址处的内存可以“分页”到磁盘,然后在再次访问时“分页”。
您的教科书将虚拟内存(错误地)定义为#3。
即使没有任何交换,如果您为执行 DMA(直接内存访问)的设备编写设备驱动程序,您也特别需要注意虚拟内存。您的驱动程序代码在 CPU 上运行,这意味着它的内存访问是通过 MMU(虚拟)进行的。该设备可能确实不是通过 MMU,因此它可以看到原始物理地址。因此,作为驱动程序编写者,您需要确保:
- 传递给硬件的任何原始内存地址都是物理的,而不是虚拟的。
- 您发送的任何大型(多页)内存块都是身体上连续。8K 阵列可能实际上是连续的(通过 MMU),但实际上是两个物理上独立的页面。如果您告诉设备将 8K 数据写入与该阵列开头对应的物理地址,它会将前 4K 写入您期望的位置,但第二个 4K 会损坏某些内存。:-(
答案2
我会试着慢慢开始,然后把这些都整理出来给你。就像这样:
虚拟内存,通常说的就是“分页”,顾名思义,分页就像是人类的记事本。
当你进行简单的计算或学习简单的信息时,你只需要在脑子里做这些事情:你只需要加载所有的信息,处理它,然后得到答案。这就像计算机从硬盘加载文件一样——它将需要处理的程序、图片或其他信息加载到它的“真实内存”(或“物理内存”)中,然后用它的“大脑”(处理器)处理它们。
然而,当你学习复杂的信息或处理复杂的算术时,你可能无法一下子记住所有的信息。你会感到困惑,开始放慢速度,无法一下子记住所有的信息,并且不得不忘记一些东西才能记住其他东西。
人类的解决方案是使用记事本。我们将无法一次性记住的所有信息都记在纸上,但在做总结时参考它们。我们可能无法记住一个月的大量销售数字,但我们可以查看这些页面,一点一点地获取信息,并处理每一位。这就像计算机“分页”其内存 - 写入充满信息的页面,并将其放入“虚拟内存”以供以后参考,并意识到它需要一个页面,然后将该页面从虚拟内存加载回实际内存。在 Linux 和 Unix 上,存储这些页面的地方实际上称为“页面文件”,内存中的数据页面实际上称为“页面”。不同的系统对这些东西有不同的名称,但一般概念大致相同。
所以,分页其实很简单。所有页面的信息都无法装入内存,因此有些页面会放在磁盘上,稍后再加载。
现在,情况变得更加复杂的是,现代系统具有内存映射和内存保护功能,这些通常由计算机中的同一硬件系统处理:内存管理单元或 MMU。
在(现代)多任务计算机中,可以同时运行多个程序,并具有内存保护功能,每个程序通常与同一系统上运行的其他程序分开。这样,一个程序就不能通过访问其内存来改变另一个程序——MMU 在物理上将一个程序的地址空间与其他程序的地址空间分开。换句话说,用户的程序看不到其他用户的程序,甚至看不到其他程序。它们看不到“真实内存”——它们看到的是自己的“虚拟内存”。
现在,内存隔离概念和页面文件概念在概念上是两个不同的东西,这可能就是您感到困惑的原因。但是,关键是它们都使用 MMU(内存管理单元)工作,它将内存分成页面,并将页面映射到虚拟地址空间。
因此,当程序请求某个“内存地址”处的内存时,实际发生的情况是查找该程序的内存页及其对应的地址(程序的“地址空间”),并找到与该内存块对应的页面。该页面可以加载到实际内存中的某个位置,在这种情况下程序将被授予访问权限,或者可以将其分页到磁盘。如果将其分页,则会触发“页面错误”——访问磁盘,并将页面加载到内存中。因此,即使内存不足,程序也可以运行,但如果必须使用磁盘进行通常非常快速的内存访问,则程序运行速度会很慢。
现在,如果没有足够的空间将该页面加载到内存中,那么您就会遇到问题。在这种情况下,必须将内存中已有的其他页面“交换”到磁盘,以便可以加载第一个程序的页面。或者,它们可能同样是来自同一程序的页面。您有时会在图形程序中看到这种情况,例如,在负载很重的系统上,当图片的一部分加载缓慢但绘制快速时,下一部分加载同样缓慢但绘制快速,当您返回处理第一部分时,它再次变慢。那是因为它们被加载进去进行处理,然后再次被交换出去,以便可以处理其他内容。显然,这是一种非常缓慢的工作方式,您真正需要的是更多的真实内存。
答案3
我知道已经太晚了......但仍然认为它有用。
- 从不同的观点看,一切都是正确的。
- 虚拟内存是一种内存管理技术,而交换内存是磁盘驱动器上的区域。交换内存通常称为交换空间。交换空间是指虚拟内存中保留为临时存储位置的部分。当可用 RAM 无法满足系统内存要求时,就会使用交换空间
- 您可以参考以下内容关联更多细节
答案4
虚拟内存是操作系统 (OS) 的一项功能,它允许计算机通过将数据页面从随机存取存储器 (RAM) 临时传输到磁盘存储器来弥补物理内存的不足。
这意味着它就像一个镜子或样本内存,可用于虚拟机或虚拟盒,无需格式化计算机即可试用操作系统。