zoukankan      html  css  js  c++  java
  • 虚拟内存

    背景

    我们一般把内存看成一块连续的字节数组。我们通过指定地址来访问其中的内容。

    我们看到图上,0KB-64KB 地址范围内,存放着操作系统。

    如果现在 A 同学想要写一个程序,它指定代码放在64KB-128KB的位置。

    现在B同学也写了一个程序,为了避免覆盖A同学程序,需要指定将代码放在128KB以后的位置。

    这样,就很麻烦了,你需要提前知道其他程序所在的位置,这样写代码就特别痛苦。

    为此,引入了虚拟内存的概念。

    地址空间的引入

    为此,引入了地址空间的概念,或者叫做虚拟地址。

    现在,对每一个程序,进程,都提供一个虚拟的地址空间。也就是认为,每一个程序可以放在 0KB-任意大小 的虚拟的连续空间上。如下图所示。

    通过这种方式,我们写程序就比较方便了。A同学写代码的时候,可以把变量放在0-64KB的位置,B同学也可以把变量放在0-64KB的位置。

    注意,这里的0-64KB的位置是虚拟的,最后映射到不同的物理内存中。

    虚拟地址(地址空间)的引入,让程序的编写更加容易。

    不同进程的虚拟地址,经过地址转换,映射到不同的物理内存地址。

    如果进行地址转换,就是后面所要讲解的内容。

    虚拟内存

    关于虚拟内存的定义,我感觉一直比较混乱。我觉得核心还是:

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间)。

    就像我们上面举例说明的那样,每个程序可以放在一个连续的地址空间中。但注意,这个地址空间的大小你可以指定。

    大小可以指定,意味着什么呢?

    比如你的物理内存有1G,但你可以假设地址空间有4G甚至更大。这样你编写程序的时候,就不会受到实际物理内存的影响。

    但是4G的程序怎么可以在1G的物理内存上运行呢?这就用到了局部性原理。

    所以,引入虚拟内存的概念,带来什么好处?

    • 编写程序更加简单,现在无需担心实际的内存大小,同时也不用担心程序之间在内存会互相覆盖

    可以看到,虚拟内存的引入,是为了程序的编写更加简单。

    我们后面将会重点讲解如何进行地址转换?

    我们先想想地址转换需要什么要求?

    • 要将不同进程的内容转换到不同的地址上
    • 尽可能利用内存
    • 因为引入了地址转换,相较于直接访问内存,多了转换过程,耗时更长,如何进行优化?

    接下来,我们将继续讲解~

  • 相关阅读:
    有关android UI 线程
    lang3日期工具类底层源码解析
    JSON业务模型拆解技巧
    math3底层源码解决多元方程组
    关于日期解析Scala语言
    maven仓库支持cdh版本配置
    kudu数据库个人简单的总结
    json数据入库kafka
    json数据写入hbase
    一只鸟的故事
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/12857759.html
Copyright © 2011-2022 走看看