Memory management 虚拟内存-除了安全原因,我们还不完全理解为什么需要它?

Memory management 虚拟内存-除了安全原因,我们还不完全理解为什么需要它?,memory-management,operating-system,paging,virtual-memory,Memory Management,Operating System,Paging,Virtual Memory,在几本书和一些网站上,虚拟内存管理的一个原因是它只允许程序的一部分加载到RAM中,因此可以更有效地使用RAM 1为什么我们需要虚拟内存管理来只加载程序的一部分?为什么我们不能使用物理地址加载程序的一部分 2除了将进程内存的不同部分堆栈、堆等分离到不同物理位置的安全原因之外,我真的不知道虚拟内存还有什么其他好处 3为什么流程认为虚拟地址是连续的,而实际上它们是不连续的,这一点很重要 编辑:我知道一个明显的原因,即虚拟内存允许将更多内存当作RAM来处理 1为什么我们需要虚拟内存管理来只加载一部分内存

在几本书和一些网站上,虚拟内存管理的一个原因是它只允许程序的一部分加载到RAM中,因此可以更有效地使用RAM

1为什么我们需要虚拟内存管理来只加载程序的一部分?为什么我们不能使用物理地址加载程序的一部分

2除了将进程内存的不同部分堆栈、堆等分离到不同物理位置的安全原因之外,我真的不知道虚拟内存还有什么其他好处

3为什么流程认为虚拟地址是连续的,而实际上它们是不连续的,这一点很重要

编辑:我知道一个明显的原因,即虚拟内存允许将更多内存当作RAM来处理

1为什么我们需要虚拟内存管理来只加载一部分内存 程序为什么我们不能用物理方法加载程序的一部分 地址

很明显,您知道程序的大小可以从一些KB到几个GB甚至更多。但是,由于成本问题,我们对主存(也称RAM)有一定的限制,因此,超过RAM大小的整个程序不能同时作为一个整体加载。因此,为了达到预期的结果,计算机科学家开发了一种虚拟内存的方法。这将有助于实现目标

第一个空间等于硬盘的某一部分的大小不是全部,而是可以轻松容纳部分运行程序的主要部分。比如说,如果正在运行的程序的大小超过了RAM的大小,那么程序就有点像是被分割成了段,而不是真的,只调用可以很容易地放入内存的相关部分,然后按照地址顺序或按照指令调用调用后续的代码

减少物理内存的负担,从而使主内存中的其他程序保持运行。还有几个原因

2除安全原因外,分离不同部分 将进程内存的堆栈、堆等放到各种物理内存中 位置,我真的不知道虚拟化还有什么好处 记忆

堆、堆栈等的分离用于存储多次运行的多种操作。它们都是不同的数据结构,因此它们可能存储不同的程序值,或者,即使是类似的程序值,也存储不同的指令序列地址!比如说,堆栈将存储递归调用的返回地址——调用地址,而堆将指向程序的当前执行代码

而且,具有这种存储方案的不是虚拟内存,而是它实际上适合于主内存。此外,堆还有几个部分,它们完全执行不同的功能!另外,我已经提到了虚拟内存的好处——有助于同时运行多个程序、优化缓存、使用分页寻址、分段等

3为什么流程认为地址是连续的很重要 提供虚拟地址,但实际上是 不连续的

如果有我们熟悉的像1,2,3,4,5等那样的计数,或者像1,5,2,4,3等那样开始计数,即使知道真实的模式拒绝了使其不连续的选择,这会更好吗?好吧,至少我会选择模式选项来执行任何任务。物理主内存也是如此!物理内存呈现准确的地址,它以一种不连续的方式清晰地获取地址——有点混合


但是等等,哇,我们有一个类似虚拟内存的机制,它导致了实际的不连续内存位置形成固定的规则/连续内存位置!虚拟内存使用分页、分段使工作相同,但使我们更容易理解。此外,由于分页中的相对索引和分段,虽然实际地址始终由分页方案或段的起始地址确定,但地址/内存位置似乎是连续的!因此,虚拟内存呈现为我们正在处理一个连续的内存位置。这不是很好/更好吗

与严格的物理内存相比,使用虚拟内存有许多优势,您已经列出了其中一些优势。基本上,它允许您的程序只使用内存,而不必担心内存来自何处,或者其他什么东西可能会争夺内存。它使内存看起来平坦且连续,即使它分布在物理内存的各个部分和磁盘上

1为什么我们需要虚拟内存管理来只加载一部分内存 程序为什么我们不能用物理方法加载程序的一部分 地址

您可以尝试使用纯物理地址,但如果没有足够大的单个块可用呢 E使用虚拟地址,您可以桥接物理RAM的各个部分,并使它们显示为一个大块。您还可以在内存中移动对象,而不会中断发生这种情况时会感到意外的进程

2除安全原因外,分离不同部分 将进程内存的堆栈、堆等放到各种物理内存中 位置,我真的不知道虚拟化还有什么好处 记忆

它还有助于防止记忆变得过于零碎。使一个进程使用的内存与另一个进程使用的内存更容易分离

3为什么流程认为地址是连续的很重要 提供虚拟地址,但实际上是 不连续的

尝试迭代一个被分割为两个不连续内存段的数组,然后再次询问。或者为某些串行通信分配缓冲区,或者软件需要单个内存块的任意次数

1为什么我们需要虚拟内存管理来只加载程序的一部分?为什么我们不能使用物理地址加载程序的一部分

我们中的一些人已经足够大,能够记住具有8MB内存的32位系统。即使压缩一个小的图像文件也会超出系统的物理内存

未来,随着系统内存和存储的合并,虚拟内存的分页功能可能会消失

2除了将进程内存的不同部分堆栈、堆等分离到不同物理位置的安全原因之外,我真的不知道虚拟内存还有什么其他好处

见1。程序所需的内存量可能超过可用的物理内存

也就是说,主要的安全原因是将各个进程和系统地址空间分开。堆栈、堆、代码的任何分离通常都是为了方便和错误检测

这样做的好处包括:

处理超出物理内存的内存 过程分离 管理对内核的访问,以及在某些系统和其他模式下的访问 防止执行非可执行页。 防止写入只读页代码、数据。 易于编程 3为什么流程认为虚拟地址是连续的,而实际上它们是不连续的,这一点很重要


我想你指的是虚拟地址。这只是一个方便的问题。让它们不连续是没有意义的。

在一台只有8G RAM的计算机上运行一个需要16G内存的程序。如果没有虚拟内存,有很多其他方法可以做到这一点,主要是覆盖。想象一下,你所在城市的地址是随机分配的,第四街213号紧挨着核桃街952号,等等。如果没有地址到物理坐标的某种自动转换,你将很难找到自己的方向。@HotLicks我不明白为什么在你的类比中,底层的物理内存地址必须是无序的?想象一下,建造房子的人选择了他们想要找的位置在一张理想化的城市地图上,一个人在山上选择一个位置,另一个人在山上选择另一个位置,可以俯瞰夜景,但出于效率的考虑,这些房子是从城市的一个角落开始并排建造的。@mezamorphic-我希望这能澄清你的疑问!如果您有任何疑问/问题,请随时指向!