C 为什么我们需要在操作系统中解决虚拟化问题?

C 为什么我们需要在操作系统中解决虚拟化问题?,c,operating-system,virtual-address-space,C,Operating System,Virtual Address Space,我目前正在学习操作系统课程,我遇到了地址虚拟化。我将简要介绍一下我所知道的情况,然后提出我的问题 基本上,CPU现代微处理器生成虚拟地址,然后MMU内存管理单元负责将这些虚拟地址转换为RAM中相应的物理地址。教授给出的例子是需要虚拟化,因为例如:编译一个C程序。你来管理它。然后编译另一个C程序。您尝试运行它,但内存中驻留的运行程序阻止加载更新的程序,即使空间可用 根据我的理解,我认为在没有虚拟化的情况下,如果编译器生成两个相同的物理地址,那么第二个不会运行,因为它认为没有足够的空间来运行它。当我

我目前正在学习操作系统课程,我遇到了地址虚拟化。我将简要介绍一下我所知道的情况,然后提出我的问题

基本上,CPU现代微处理器生成虚拟地址,然后MMU内存管理单元负责将这些虚拟地址转换为RAM中相应的物理地址。教授给出的例子是需要虚拟化,因为例如:编译一个C程序。你来管理它。然后编译另一个C程序。您尝试运行它,但内存中驻留的运行程序阻止加载更新的程序,即使空间可用

根据我的理解,我认为在没有虚拟化的情况下,如果编译器生成两个相同的物理地址,那么第二个不会运行,因为它认为没有足够的空间来运行它。当我们将其虚拟化时,正如CPU只生成虚拟地址一样,MMU将处理此冲突,并在RAM中找到另一个程序的位置。我们的教授给出了MMU是一个映射表的示例,它获取一个虚拟地址并将其映射到一个物理地址。我认为这个想法非常类似于在哈希表中解析冲突

请允许我就我的理解提出一些意见,如有任何进一步的澄清,我将不胜感激

请允许我就我的理解提出一些意见,如有任何进一步的澄清,我将不胜感激

你的理解大致正确

澄清:

数据结构与哈希表完全不同

如果说有什么区别的话,数据结构更接近于BTree,但即使与BTree也有重要的区别。它实际上最接近于一个已被稀疏分配的Java N维数组

它正在映射页面,而不是完整的虚拟/物理地址。完整地址是页面地址+页面内的偏移量

碰撞没有问题。在任何时间点,所有用户/进程的虚拟->物理映射都提供了从进程id+虚拟页到物理RAM页或磁盘页或两者的一对一映射

我们使用虚拟内存的原因是:

过程隔离;i、 e.一个进程无法看到或干扰另一个进程的内存

简化应用程序编写;i、 每个进程都认为它有一组连续的内存地址,每次都是相同的。一级近似

简化编译、链接、加载;i、 e.编译器等不需要在编译时或运行时重新定位代码以考虑其他因素

允许系统容纳超过其物理RAM的进程,以便。。。尽管这会带来潜在的风险和性能损失

请允许我就我的理解提出一些意见,如有任何进一步的澄清,我将不胜感激

你的理解大致正确

澄清:

数据结构与哈希表完全不同

如果说有什么区别的话,数据结构更接近于BTree,但即使与BTree也有重要的区别。它实际上最接近于一个已被稀疏分配的Java N维数组

它正在映射页面,而不是完整的虚拟/物理地址。完整地址是页面地址+页面内的偏移量

碰撞没有问题。在任何时间点,所有用户/进程的虚拟->物理映射都提供了从进程id+虚拟页到物理RAM页或磁盘页或两者的一对一映射

我们使用虚拟内存的原因是:

过程隔离;i、 e.一个进程无法看到或干扰另一个进程的内存

简化应用程序编写;i、 每个进程都认为它有一组连续的内存地址,每次都是相同的。一级近似

简化编译、链接、加载;i、 e.编译器等不需要在编译时或运行时重新定位代码以考虑其他因素

允许系统容纳超过其物理RAM的进程,以便。。。尽管这会带来潜在的风险和性能损失


我认为你对操作系统中内存的情况有一个基本的误解

1您描述的是逻辑内存,而不是虚拟内存。虚拟内存是指使用磁盘存储来模拟内存。未映射的逻辑内存页映射到磁盘空间

遗憾的是,逻辑内存和虚拟内存这两个术语被混为一谈,但它们是截然不同的概念,这种区别正变得越来越重要

2个程序在一个进程中运行。在unix中,一个进程一次只运行一个程序。如果将克隆的调用方计入其生命周期,则每个进程通常只运行一个程序

在现代系统中,每个进程都会获得一个逻辑地址空间,即可以映射到物理位置或根本不映射到任何位置的顺序地址。通常,该逻辑地址空间的一部分映射到所有进程共享的内核区域。逻辑地址空间随进程一起创建。没有地址空间,没有进程

在32位系统中,地址0-7FFFFFFF可能是通常映射到唯一物理位置的用户地址,而80000000-FFFFFFFF可能映射到所有进程都相同的系统地址空间

3逻辑内存管理主要作为一种安全手段;不是作为程序加载的一种手段,尽管它确实在这方面有所帮助

4这个例子对我来说毫无意义:

你可以编译一个C程序。你来管理它。然后编译另一个C程序。您尝试运行它,但内存中驻留的运行程序阻止加载更新的程序,即使空间可用

您忽略了流程的概念。一个进程一次只能运行一个程序。在允许使用相同进程串行运行程序的系统中,例如VM,执行程序阻止加载另一个程序,或加载另一个程序导致运行程序终止。这不是内存问题

5这一点都不正确:

根据我的理解,我认为在没有虚拟化的情况下,如果编译器生成两个相同的物理地址,那么第二个不会运行,因为它认为没有足够的空间来运行它。当我们将其虚拟化时,就像CPU只生成虚拟地址一样,MMU将处理此冲突,并在RAM中找到另一个程序的位置

MMU不处理碰撞。操作系统设置了一些表,这些表定义了进程启动时的逻辑地址空间。逻辑内存与哈希表无关

当程序访问逻辑内存时,大致顺序为:

将地址分解为页面和页面内的偏移量。 页面表中是否有相应的条目?如果不是错的话。 页面表中的条目有效吗?如果不是错的话。 页表条目是否允许当前操作模式kernel/user/…中请求的读/写/执行访问类型。。。?如果不是错的话。 条目是否映射到物理页面?如果不是页面错误,请从磁盘虚拟内存加载页面,然后重试。 访问页表引用的物理内存。
我认为你对操作系统中内存的情况有一个基本的误解

1您描述的是逻辑内存,而不是虚拟内存。虚拟内存是指使用磁盘存储来模拟内存。未映射的逻辑内存页映射到磁盘空间

遗憾的是,逻辑内存和虚拟内存这两个术语被混为一谈,但它们是截然不同的概念,这种区别正变得越来越重要

2个程序在一个进程中运行。在unix中,一个进程一次只运行一个程序。如果将克隆的调用方计入其生命周期,则每个进程通常只运行一个程序

在现代系统中,每个进程都会获得一个逻辑地址空间,即可以映射到物理位置或根本不映射到任何位置的顺序地址。通常,该逻辑地址空间的一部分映射到所有进程共享的内核区域。逻辑地址空间随进程一起创建。没有地址空间,没有进程

在32位系统中,地址0-7FFFFFFF可能是通常映射到唯一物理位置的用户地址,而80000000-FFFFFFFF可能映射到所有进程都相同的系统地址空间

3逻辑内存管理主要作为一种安全手段;不是作为程序加载的一种手段,尽管它确实在这方面有所帮助

4这个例子对我来说毫无意义:

你可以编译一个C程序。你来管理它。然后编译另一个C程序。您尝试运行它,但内存中驻留的运行程序阻止加载更新的程序,即使空间可用

您忽略了流程的概念。一个进程一次只能运行一个程序。在允许使用相同进程串行运行程序的系统中,例如VM,执行程序阻止加载另一个程序,或加载另一个程序导致运行程序终止。这不是内存问题

5这一点都不正确:

根据我的理解,我认为在没有虚拟化的情况下,如果编译器生成两个相同的物理地址,那么第二个不会运行,因为它认为没有足够的空间来运行它。当我们将其虚拟化时,就像CPU只生成虚拟地址一样,MMU将处理此冲突,并在RAM中找到另一个程序的位置

MMU不处理碰撞。操作系统设置定义逻辑地址空间w的表 当这个过程开始时。逻辑内存与哈希表无关

当程序访问逻辑内存时,大致顺序为:

将地址分解为页面和页面内的偏移量。 页面表中是否有相应的条目?如果不是错的话。 页面表中的条目有效吗?如果不是错的话。 页表条目是否允许当前操作模式kernel/user/…中请求的读/写/执行访问类型。。。?如果不是错的话。 条目是否映射到物理页面?如果不是页面错误,请从磁盘虚拟内存加载页面,然后重试。 访问页表引用的物理内存。
过程隔离,简单明了。一个进程可以对另一个进程没有意外影响,无论是负载地址冲突、内存损坏等。进程隔离,简单明了。一个进程可以对另一个进程没有意外影响,无论是加载地址冲突、内存损坏等。所以一个进程认为它拥有自己的所有内存,没有任何限制。然而,对于实际潜在的实际限制,MMU处理它。我想限制是RAM中的可用空间,以及在某些辅助存储中对该空间的扩展?是的,是的,是的。还有一个问题是,如果很多进程都试图同时使用大量内存,您可能会受到打击。谢谢。所以一个进程认为它拥有自己的所有内存,没有任何限制。然而,对于实际潜在的实际限制,MMU处理它。我想限制是RAM中的可用空间,以及在某些辅助存储中对该空间的扩展?是的,是的,是的。此外,还有一个问题,如果许多进程都试图同时使用大量内存,那么您可能会受到冲击。