为什么我们需要在操作系统中进行地址虚拟化?

拉尔夫

我目前正在上操作系统课程,并且遇到了地址虚拟化。我将简要介绍我的知识,然后再提出问题。

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

根据我的理解,我认为没有虚拟化功能,如果编译器生成两个相同的物理地址,则第二个将不会运行,因为它认为没有足够的空间供其使用。当我们对其进行虚拟化时,因为在CPU中仅生成虚拟地址,所以MMU将处理此“冲突”并在RAM中找到其他程序的位置。(我们的教授给出了MMU作为映射表的示例,虚拟地址并将其映射到物理地址)。我认为这个想法与解决哈希表中的冲突非常相似。

请提供一些有关我的理解的意见,并希望进一步澄清。

斯蒂芬·C

请提供一些有关我的理解的意见,并希望进一步澄清。

您的理解大致正确。

说明:

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

  • 如果有的话,数据结构更接近于BTree,但是即使如此,它也存在重要的区别。它实际上最接近已稀疏分配的(Java)N维数组。

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

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


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

  • 流程隔离;即一个进程看不到或干扰另一进程的内存

  • 简化应用程序编写;也就是说,每个进程都认为它具有连续的内存地址,并且每次都设置相同的内存地址。(至第一个近似值...)

  • 简化编译,链接,加载;也就是说,编译器等无需在编译时或运行时“重定位”代码来考虑其他代码。

  • 允许系统容纳比物理RAM更多的进程...尽管这会带来潜在的风险和性能损失。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要在multiSVM方法中进行交叉验证以进行图像分类?

来自分类Dev

谁能解释为什么我们需要在SpriteKit中进行缩放?

来自分类Dev

为什么我们需要在sis中进行合并联接转换之前使用排序转换

来自分类Dev

为什么我们不能在操作系统的内核中添加最大的功能?

来自分类Dev

为什么我们需要在二叉树子类中进行前序、中序和后序遍历的字段?

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要虚拟内存?

来自分类Dev

如果必须在if语句中添加中断,为什么我们需要在while操作中注意条件呢?

来自分类Dev

为什么我们需要对这些载体进行均质化?

来自分类Dev

为什么我们需要在终端中以root用户身份进行关机和重新启动?

来自分类Dev

为什么我们需要在终端中以root用户身份进行关机和重新启动?

来自分类Dev

为什么我们需要在运行时实例化一个类型?

来自分类Dev

是什么使我们无法在GPU上运行操作系统?

来自分类Dev

为什么GCM要在4.0.4操作系统以下的设备上运行,需要Google帐户登录?

来自分类Dev

什么时候以及为什么我们需要在bash上使用“ wait”命令?

来自分类Dev

为什么每次要在两个操作系统之间进行选择时都需要按F9键?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们需要在图灵的暂停证明中使用否定部分?

来自分类Dev

为什么我们需要在MSIL中显式调用父构造函数?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我们需要在Android应用中存储Goefence数据?

来自分类Dev

为什么我们需要在JavaScript中定义构造函数

来自分类Dev

为什么我们需要在getline(cin,string)之前使用cin.ignore()?

来自分类Dev

为什么我们需要在Kafka Consumer Configuration中添加所有Zookeeper节点

来自分类Dev

为什么我们需要在民意调查中调用poll_wait?

来自分类Dev

为什么我们需要在ConnectionString中设置最小池大小

来自分类Dev

为什么我们需要在famo.us中使用TransitionableTransform类?

Related 相关文章

  1. 1

    为什么我们需要在multiSVM方法中进行交叉验证以进行图像分类?

  2. 2

    谁能解释为什么我们需要在SpriteKit中进行缩放?

  3. 3

    为什么我们需要在sis中进行合并联接转换之前使用排序转换

  4. 4

    为什么我们不能在操作系统的内核中添加最大的功能?

  5. 5

    为什么我们需要在二叉树子类中进行前序、中序和后序遍历的字段?

  6. 6

    为什么我们需要在Linux上挂载?

  7. 7

    为什么我们需要在Linux上挂载?

  8. 8

    为什么我们需要虚拟内存?

  9. 9

    如果必须在if语句中添加中断,为什么我们需要在while操作中注意条件呢?

  10. 10

    为什么我们需要对这些载体进行均质化?

  11. 11

    为什么我们需要在终端中以root用户身份进行关机和重新启动?

  12. 12

    为什么我们需要在终端中以root用户身份进行关机和重新启动?

  13. 13

    为什么我们需要在运行时实例化一个类型?

  14. 14

    是什么使我们无法在GPU上运行操作系统?

  15. 15

    为什么GCM要在4.0.4操作系统以下的设备上运行,需要Google帐户登录?

  16. 16

    什么时候以及为什么我们需要在bash上使用“ wait”命令?

  17. 17

    为什么每次要在两个操作系统之间进行选择时都需要按F9键?

  18. 18

    我们为什么需要容器?

  19. 19

    为什么我们需要IO?

  20. 20

    为什么我们需要在图灵的暂停证明中使用否定部分?

  21. 21

    为什么我们需要在MSIL中显式调用父构造函数?

  22. 22

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  23. 23

    为什么我们需要在Android应用中存储Goefence数据?

  24. 24

    为什么我们需要在JavaScript中定义构造函数

  25. 25

    为什么我们需要在getline(cin,string)之前使用cin.ignore()?

  26. 26

    为什么我们需要在Kafka Consumer Configuration中添加所有Zookeeper节点

  27. 27

    为什么我们需要在民意调查中调用poll_wait?

  28. 28

    为什么我们需要在ConnectionString中设置最小池大小

  29. 29

    为什么我们需要在famo.us中使用TransitionableTransform类?

热门标签

归档