我目前正在攻读操作系统课程,我遇到了地址虚拟化。我将简要介绍一下我所知道的内容并按照我的问题进行操作。
基本上,CPU(现代微处理器)生成虚拟地址,然后MMU(存储器管理单元)负责将这些虚拟地址转换为RAM中对应的物理地址。教授给出的例子是需要虚拟化,例如:你编译一个C程序。你运行它。然后你编译另一个C程序。您尝试运行它,但内存中的常驻运行程序阻止加载较新的程序,即使空间可用。
根据我的理解,我认为没有虚拟化,如果编译器生成两个相同的物理地址,第二个不会运行,因为它认为没有足够的空间。当我们虚拟化它时,就像在CPU中只生成虚拟地址一样,MMU将处理这个"碰撞"并找到RAM中其他程序的位置。(我们的教授给出了MMU作为映射表的示例,它采用虚拟地址并将其映射到物理地址)。我认为这个想法非常类似于解决哈希表中的冲突。
我能否就我的理解得到一些意见,我们对此表示赞赏。
答案 0 :(得分:2)
我能否就我的理解得到一些意见,我们对此表示赞赏。
您的理解大致正确。
澄清:
数据结构与哈希表完全不同。
如果有的话,数据结构更接近BTree,但即便有重要的差异。它实际上最接近稀疏分配的(Java)N维数组。
映射页面而不是完整的虚拟/物理地址。 (完整的地址是页面地址+页面内的偏移量。)。
碰撞没有问题。在任何时间点,虚拟 - >所有用户/进程的物理映射都提供从(进程ID +虚拟页面)到物理RAM页面或磁盘页面(或两者)的一对一映射。
我们使用虚拟内存的原因是:
过程隔离;即一个进程无法查看或干扰另一个进程内存
简化应用程序编写;即每个进程认为它具有连续的内存地址,并且每次都有相同的设置。 (初步估算......)
简化编译,链接,加载;即编译器等,无需在编译时或运行时“重新定位”代码以考虑其他代码。
允许系统容纳比物理RAM更多的进程......但这会带来潜在的风险和性能损失。
答案 1 :(得分:0)
我认为你对操作系统中存在的内容有一个基本的误解。
(1)您正在描述逻辑内存,而不是虚拟内存。虚拟内存是指使用磁盘存储来模拟内存。未映射的逻辑内存页面将映射到磁盘空间。
可悲的是,逻辑内存和虚拟内存这两个术语变得混杂在一起,但它们是截然不同的概念,区别变得越来越重要。
(2)程序在PROCESS中运行。一个进程一次只运行一个程序(在unix中,每个进程一般只运行一个程序(如果你计算克隆的调用者,则运行两个)。
在现代系统中,每个流程流程都会获得一个逻辑地址空间(顺序地址),可以映射到物理位置或根本不会映射到任何位置。通常,该逻辑地址空间的一部分映射到所有进程共享的内核区域。逻辑地址空间是使用进程创建的。没有地址空间 - 没有进程。
在32位系统中,地址0-7FFFFFFF可能是(通常)映射到唯一物理位置的用户地址,而80000000-FFFFFFFF可能会映射到对所有进程都相同的系统地址空间。
(3)逻辑内存管理主要用作安全手段;不是作为程序加载的手段(尽管它在这方面确实有帮助)。
(4)这个例子对我没有意义:
您编译C程序。你运行它。然后你编译另一个C程序。您尝试运行它,但内存中的常驻运行程序会阻止加载较新的程序,即使空间可用。
您忽略了PROCESS的概念。一个进程一次只能运行一个程序。在允许以相同过程(例如,VMS)串行运行程序的系统中,执行程序防止加载另一程序(或加载另一程序导致运行程序的终止)。这不是记忆问题。
(5)这根本不正确:
根据我的理解,我认为没有虚拟化,如果编译器生成两个相同的物理地址,第二个将无法运行,因为它认为没有足够的空间。当我们虚拟化这个时,就像在CPU中只生成虚拟地址一样,MMU将处理这个“冲突”,并为RAM中的其他程序找到一个位置。
MMU不处理碰撞。操作系统设置表,用于在进程启动时定义逻辑地址空间。逻辑内存与哈希表无关。
当程序访问逻辑存储器时,粗略序列为: