我目前正在上操作系统课程,并且遇到了地址虚拟化。我将简要介绍我的知识,然后再提出问题。
基本上,CPU(现代微处理器)生成虚拟地址,然后MMU(内存管理单元)负责将这些虚拟地址转换为RAM中的相应物理地址。教授给出的示例是需要虚拟化的,因为例如:编译C程序。您运行它。然后,您编译另一个C程序。您尝试运行它,但是即使有可用空间,内存中驻留的正在运行的程序也会阻止加载较新的程序。
根据我的理解,我认为没有虚拟化功能,如果编译器生成两个相同的物理地址,则第二个将不会运行,因为它认为没有足够的空间供其使用。当我们对其进行虚拟化时,因为在CPU中仅生成虚拟地址,所以MMU将处理此“冲突”并在RAM中找到其他程序的位置。(我们的教授给出了MMU作为映射表的示例,虚拟地址并将其映射到物理地址)。我认为这个想法与解决哈希表中的冲突非常相似。
请提供一些有关我的理解的意见,并希望进一步澄清。
请提供一些有关我的理解的意见,并希望进一步澄清。
您的理解大致正确。
说明:
数据结构与哈希表完全不同。
如果有的话,数据结构更接近于BTree,但是即使如此,它也存在重要的区别。它实际上最接近已稀疏分配的(Java)N维数组。
它是在映射页面,而不是完整的虚拟/物理地址。(完整地址是页面地址+页面内的偏移量。)。
碰撞没有问题。在任何时间点,所有用户/进程的虚拟->物理映射都会提供从(进程ID +虚拟页面)到物理RAM页面或磁盘页面(或两者)的一对一映射。
我们使用虚拟内存的原因是:
流程隔离;即一个进程看不到或干扰另一进程的内存
简化应用程序编写;也就是说,每个进程都认为它具有连续的内存地址,并且每次都设置相同的内存地址。(至第一个近似值...)
简化编译,链接,加载;也就是说,编译器等无需在编译时或运行时“重定位”代码来考虑其他代码。
允许系统容纳比物理RAM更多的进程...尽管这会带来潜在的风险和性能损失。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句