逻辑地址和物理地址之间的区别?

2024-03-01

我正在阅读《操作系统概念》,现在正在读第 8 章!不过,我可以做一些澄清,或者保证我的理解是正确的。

逻辑地址:根据书中所述,逻辑地址是由CPU生成的。这到底是什么意思? (在执行生成的地址系统中..)我假设当为程序编译代码时,该程序具有no知道代码将加载到内存中的位置。编译器所做的只是设置程序布局的总体草图以及图像的布局方式,但不会为其分配任何实际地址。当程序执行时,CPU 获取编译器生成的布局图像,并将一些地址(逻辑地址)分发给代码生成的地址。

物理地址:直到CPU生成一组逻辑地址(由基地址和偏移量组成)之后才会生成物理地址。逻辑地址通过 MMU 或其他设备,并且沿线的某个位置将逻辑地址映射到物理 RAM 地址。

那么实际的区别是什么呢?我可以看到一个好处。使用逻辑地址为应用程序提供了更多自由。如果物理地址是硬编码的,那么程序的成功将在很大程度上取决于物理计算机、可用的 RAM 地址等。

使用转换为物理地址的逻辑地址是否会强加两个步骤而不是一对一的步骤,因此会产生更多的开销?

那么生成后逻辑地址驻留在哪里呢?当 CPU 为进程提供服务时,它们可能存在于 CPU 的寄存器中,但是在此之前和之后,它们去了哪里?我知道这是依赖于实现的。我假设它们可能存储在 CPU 上的某些特殊寄存器空间或缓冲区中,例如 TLB,对吗?如果不是,那么该表可能存在于实际的 RAM 本身中,并且 CPU 仅保存指向 RAM 中表的基地址的指针/地址,对吗?

将地址保存在 RAM 中似乎与逻辑内存地址的目的适得其反。我只能假设我的理解是不正确的。


这个答案绝不是详尽无遗的,但它足以解释它,让事情变得顺利。

在虚拟内存系统中,逻辑地址和物理地址之间存在脱节。

可以为应用程序提供(比方说)4G 的虚拟地址空间。这是它的可用内存,它可以随意使用它。这是一个很好的连续内存块(从应用程序的角度来看)。

然而,这并不是only应用程序正在运行,操作系统必须在它们之间进行协调。在这个漂亮的连续模型下,需要进行大量映射来将逻辑地址转换为物理地址。

通过这种映射,操作系统和硬件(从这里开始我将这些称为较低层)可以自由地将应用程序页面放置在它想要的任何地方(无论是在物理内存中还是换出到辅助存储)。

当应用程序尝试访问逻辑地址 50 处的内存时,较低级别可以使用转换表将其转换为物理地址。而且,如果它尝试访问已换出到磁盘的逻辑内存,则会引发页面错误,并且较低级别可以将相关数据带回内存,无论怎样physical它想要的地址。

在过去的糟糕日子里,当你拥有物理地址时,代码必须是可重新定位的(或在加载时修复),因为它可以加载到任何地方。使用虚拟内存,该代码(和数据)可以同时位于十几个不同进程中的逻辑内存位置 50 - 这是实际的physical但地址会有所不同。

它甚至可以共享,以便一个人physical副本同时存在于许多进程的地址空间中。这是共享代码(因此我们不会使用超出需要的物理内存)和共享内存以允许轻松的进程间通信的关键。

当然,它的效率低于纯物理地址环境,但 CPU 制造商试图使其尽可能高效,因为它被大量使用。优点far胜过缺点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逻辑地址和物理地址之间的区别? 的相关文章

  • 为什么我们的 MonoTouch 应用程序会破坏垃圾收集器?并不是内存不足

    我们的问题很简单 但原因却很复杂 我们是经验丰富的开发人员 并且对可能导致此问题的原因进行了大量研究 我们希望 MonoTouch 开发人员能够与我们合作 找出人们所遇到的常见问题 以及目前尚无解决方案的问题 我们已经为此工作了两个多星期
  • Actionscript 内存管理、垃圾收集

    这个博客 http blogagic com 163 flex memory management and memory leaks varref 和其他人 指出 在清理对象时 您应该在 dispose 方法中将对象引用设置为 null 但
  • fork() & 内存分配行为

    我在一个禁用交换和禁用内存过量使用的系统上工作 假设我的进程当前消耗 100 MB 内存 而系统可用内存小于 100 MB 如果我执行 fork 它会失败 因为内核也尝试为子进程分配 100 MB 的空间吗 我读过 Linux 在分叉时使用
  • Linux Slab 分配器和缓存性能

    来自指南理解Linux内核第三版 第 8 2 10 章 板坯着色 从第 2 章我们知道 同一个硬件缓存行映射许多不同的 RAM 块 在这个 在本章中 我们还看到相同大小的对象最终存储在缓存中的相同偏移量处 不同板内具有相同偏移量的对象将以相
  • Java - 堆与直接内存访问

    我最近遇到sun misc Unsafe类 允许用户以类似于 C 的方式分配 解除分配和一般访问内存 我读过一些解决这个问题的博客 例如 堆内存和直接内存哪个更快 http mentablog soliveirajr com 2012 11
  • 重写标准库使用的内存分配方法? [复制]

    这个问题在这里已经有答案了 是否可以覆盖 STL 分配 管理和释放内存的方式 如果可能的话 人们会怎样做呢 有没有一种方法可以将处理原始内存的代码保留在一个类或文件中 我想对我的整个程序执行此操作 以便我可以跟踪内存使用情况 时间和生命周期
  • 无法修改 char 数组

    考虑以下代码 char message foo void main void message bar 为什么 MPLAB IDE v8 63 中出现语法错误 我只是想改变字符数组的值 声明后不能像这样使用字符数组 如果您想为字符数组分配新值
  • 释放指针向量,但内存仍在使用中

    我不知道下面的代码有什么问题 我正在删除所有指针 但是当我使用 top 命令查看内存时 我可以看到仍然有大量内存分配给程序 我在这里缺少一些东西来释放内存吗 include
  • 诊断 Mac OS X 上的堆碎片?

    我正在编写的核心基础应用程序似乎消耗的内存比我实际分配的内存多 根据活动监视器中的 真实内存 计数 我已通过 Instruments 中的 实时字节分配 视图确认我的实际分配符合我的预期 大约 10MB 但活动监视器中的 真实内存 计数显示
  • 释放 Javascript 中未附加 DOM 节点使用的内存

    作为我的应用程序的一部分 我将一组小型 Dom 节点放在一起 这些节点不会一次全部显示 我将它们存储在内部数组中 用户可以调用它们的显示 在这种情况下 我将它们重新设置为用于显示它们的 div 这一切都很好 但是 当需要用新的替换所有它们时
  • .net框架中值类型和引用类型的内存分配

    我可以阅读一篇高级文章来解释如何在 net 框架中为不同类型 值和引用 分配内存 例如 我们知道值类型是在堆栈上分配空间的 但它是如何管理的呢 另外 如何在堆中管理引用类型以及实际值存储在哪里 引用类型像任何Class一样都会包含很多值类型
  • iPhone应用程序NSNumber内存泄漏

    我遇到了内存泄漏 但我不知道它从哪里来以及如何修复它 在某些时候 我计算两个位置之间的距离 double calc self getDistance location to otherLocation NSNumber distance N
  • SQL Server在查询执行后不释放内存

    我想我在这里有一个很多人可能遇到过的基本问题 当我在 SQL Server 中运行查询时 它将在内存中加载查询执行所需的所有数据 例如 如果存在联接 那么它将从这两个表加载必要的数据 但是当查询完成执行内存时SQL Server 消耗的数据
  • 我的程序有内存泄漏

    IBAction play2 CFBundleRef mainBundle CFBundleGetMainBundle CFURLRef soundFileURLRef soundFileURLRef CFBundleCopyResourc
  • 使用工厂方法设置 __weak 变量似乎会使对象存活时间过长

    我创建了一个 Person 类 在其中实例化了两个对象 int main int argc const char argv autoreleasepool Person weak pweak Person new Person p Pers
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • Java 6 内存使用过多

    对于大型应用程序 Java 6 消耗的内存是否比您预期的要多 我有一个已经开发多年的应用程序 到目前为止 在我的特定测试配置中 该应用程序占用了大约 30 40 MB 的空间 现在 对于 Java 6u10 和 11 活动时需要数百个时间
  • FreeMM 与 ShareMem

    我们有很多用 delphi 和 c builder 编写的 dll 库 并使用 sharemem 和 borlndmm dll 3d party 库中的对齐问题迫使我们转向 delphi 2007 中的新内存管理器 有人可以帮我解释一下 共
  • laravel 基本查询中“允许的内存大小已耗尽 134217728 字节”

    我不知道为什么我无法让以下工作正常工作 DB table twitter hashtags gt paginate 5 每次我得到 第二个数字往往不同 Allowed memory size of 134217728 bytes exhau
  • 静态方法是否会立即编译(JIT)?

    根据我的理解 CLR 编译器对实例方法和静态方法的处理方式相同 并且每当首次调用该方法时 IL 代码都会进行 JIT 编译 今天我和同事讨论了 他告诉我静态方法与实例方法的处理方式不同 即 静态方法在程序集加载到应用程序域后立即进行 JIT

随机推荐