【问题标题】:What does the memory address mean?内存地址是什么意思?
【发布时间】:2011-01-18 14:08:13
【问题描述】:

十六进制内存地址是否代表了整个内存中的位置?

例如4 gb ram,有一个内存地址。它是否指向数据开始的位置(以字节为单位)?例如2.1 GB。

在数据加载到内存之前,内存地址在硬盘上是如何工作的?

是否有过从内存中获取部分数据而从磁盘中获取其他数据的情况?位置如何区分?

谢谢

【问题讨论】:

    标签: memory computer-science byte


    【解决方案1】:

    十六进制内存地址(就像打印出指针的值一样)指向虚拟内存中的一个位置。

    在 32 位系统上,每个进程都有完整的 4GB 虚拟内存。该虚拟内存由 CPU 和操作系统管理。当您访问虚拟内存中的某个位置时,CPU 和操作系统会确定该位置在系统实际物理内存中的映射位置,并从那里检索数据。

    操作系统也可以从物理内存中取出一些东西并将它们交换到磁盘上,以便为其他东西腾出物理内存空间。然后,如果您尝试访问从物理内存交换到磁盘的内容的虚拟内存位置,则会生成“页面错误”,导致操作系统将页面从磁盘重新加载到物理内存中。

    【讨论】:

    • 谢谢。那么虚拟内存是存储在磁盘还是内存中呢?
    • @aljaree 虚拟内存是“虚拟的”,不存在。它没有存储在任何地方。在任何特定时刻,它都可以映射到物理 RAM 位置、交换地址、mmap-ed 文件中的地址等。有趣的情况是,当某些虚拟内存地址不是 i> 映射到任何地方,而您正试图访问它。在这种情况下,会生成访问冲突(也称为分段错误)。
    • 我现在有点困惑。我是从程序员的角度来看的。如果必须编写程序集,那么虚拟内存从何而来?虚拟机中的virtual这个词和虚拟内存的概念是一样的吗?关于虚拟内存的最佳书籍?谢谢
    • 不,虚拟机与虚拟内存概念没有任何共同之处,除了这个词。作为程序员,您通过在可执行映像中分配段来请求操作系统将一些虚拟页面与实际存储关联。然后操作系统可执行加载程序将完成这项工作,使堆栈和堆段可用。这两个区域都可以在以后扩展。
    • 您是否建议使用反汇编程序来了解更多信息?另外,反汇编程序中显示的内存地址是什么?物理内存地址?虚拟内存与此有何关系?谢谢。
    【解决方案2】:

    现代操作系统有virtual memory

    这意味着使用您的程序访问内存中某个字节的地址纯粹是“虚拟的”,不存在。操作系统通过特殊的硬件控制器将其映射到完全不同的真实内存位置,并且对于给定的地址可能根本没有物理内存位置。例如,您可以mmap() 将文件放入(虚拟)内存中,访问虚拟地址处的字节意味着访问 file 的字节。类似地,如果某些memory page 长时间未使用,操作系统可能会swap off 从物理RAM 到磁盘的页面。在这种情况下,虚拟内存也不会指向物理内存位置。

    【讨论】:

    • @aljaree 我认为处理虚拟内存的策略在某种程度上是特定于操作系统的。您对什么具体情况感兴趣?
    • @mitch-wheat 是的,我在发帖之前没有阅读它(因为我熟悉虚拟内存概念)。糟糕的是,这篇文章的状态如此糟糕。 :/
    【解决方案3】:

    在大多数情况下 - 是的。但是有些处理器使用 2 个值来计算实际地址。例如英特尔 8086。 硬盘只是存储,它有自己的系统来存储信息。因此,在执行任何 CPU 操作之前,必须将数据加载到 RAM 中。

    【讨论】:

    • 谢谢。因此,当计算机的内存很小时以前,如果需要超过可用内存的数据怎么办?我的意思是,实时字节导致的系统超过了没有可释放内存的系统。他们必须等待新硬件?
    • 嗯,虚拟内存系统有点帮助。但是,如果您的应用程序是内存密集型的,那么系统最终可能会进行交换。我建议验证换出多少页。使用 Windows 中的任务管理器进行查找。
    • 不,我还不知道这些东西。我很感兴趣,只是想知道这个问题。谢谢。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多