【问题标题】:How is RAM able to acess any place in memory at O(1) speedRAM 如何以 O(1) 的速度访问内存中的任何位置
【发布时间】:2014-01-06 22:21:25
【问题描述】:

我们被告知 RAM 内存的抽象是一个长字节数组。对于 CPU 来说,访问它的任何部分都需要相同的时间。什么设备能够同时访问 4 GB(在我的计算机上)中的任何字节?因为这对我来说似乎不是一项微不足道的任务。

我问过同事和我的教授,但没有人能确定如何使用简单的逻辑门来完成这项任务,如果它不仅仅是逻辑门的复杂组合,那是什么?

我个人的猜测是,您可以以 O(log(n)) 的速度访问任何内存,其中 n 是内存的大小。因为每个门都会将内存一分为二,并将内存访问指令发送给下一个将内存一分为二的门。但这需要很多门。我想不出任何其他有根据的猜测,我什至不知道我应该在 Google 中查找的设备的名称。

请帮助我痛苦的好奇心,并在此先感谢。

编辑

引用您的“RAM 可以将地址为 X 的单元格中的值发送到某些输出引脚”,这是每个人(再次)跳过对我来说并非微不足道的事情的地方。在我看来,为了构建一个从 64 个引脚决定要获取 2^64 中的哪个字节的门,每个引脚需要将整个可能的内存范围分成两部分。如果索引 0 的位是 0 -> 那么地址在内存 0-2^64/2,否则地址在内存 2^64/2-2^64。依此类推,但是内存获取将通过的门数(让我们称之为)将是 64,(一个常数)。然而,所需的门数量是 N,其中 N 是内存字节数。

仅仅因为有 64 个引脚,并不意味着您仍然可以将其解码为 2^64 范围内的单个提取。 4GB内存是否在内存控制中带有4GB门???

现在这可以改进,因为随着我越来越多地阅读有关此内存如何架构的内容,如果将内存放入具有 sqrt(N) 行和 sqrt(N) 列的矩阵中,那么获取内存需要经过 O(log(sqrt(N)*2) 并且需要的门数量将是 2*sqrt(N),这要好得多,我认为它可能是商业秘密。

/编辑

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于硬件架构的
  • 什么是n?内存大小?
  • 如果它跑题了,那么它跑题了?我不知道应该是什么话题,顺便说一句,这里的第一个问题。
  • @user3167049 请参阅help center 了解此处的主题。
  • 实际上最好的渐近访问速度是O(sqrt(n))。我们的宇宙是 3D 的,但最大信息密度与空间的表面积(而不是体积)成正比(参见 physics.stackexchange.com/questions/2281)。信息的传播速度不能超过光速。但在实践中,我们将所有这些问题都抛在脑后,并假设 RAM 是持续访问的,因为 (a) 它在实践中足够接近,并且 (b) 它仍然允许我们比较竞争算法的相对优点。

标签: memory ram computer-architecture


【解决方案1】:

什么鬼,我不妨把这个作为答案。

是的,在物理世界中,内存访问不可能是常数时间。

但它甚至不能是对数时间。您想到的 O(log n) 电路最终涉及某种二叉树(或其他),并且您无法在 3D 宇宙中制作具有恒定长度导线的二叉树。

无论您的技术的“单位体积位数”容量是多少,存储 n 位需要一个半径为 O(n^(1/3)) 的球体。由于信息只能以光速传播,因此访问球体另一端的位需要时间 O(n^(1/3))。

但即使这样也是错误的。如果您想谈论我们宇宙的实际限制,我们的physics friends say 可以存储在任何球体中的绝对最大位数与球体的表面积成正比,而不是其体积。所以包含 n 位信息的最小球体的实际半径是 O(sqrt(n))。

正如我在评论中提到的,所有这些都没有实际意义。我们通常用于分析算法的计算模型假定访问时间恒定的 RAM,这在实践中足够接近事实,并允许对竞争算法进行公平比较。 (尽管从事高性能代码的优秀工程师非常关心局部性和内存层次结构......)

【讨论】:

  • 你们使用 big-O 有意义吗?在这些情况下,n 代表什么?
  • @Celeritas:是的,这是有道理的。在这种情况下,n 是内存的总大小(以位为单位)。 (即可能的地址总数。)
  • @Celeritas:顺便说一句,这并不完全是学术性的。访问 32k 内存总是比 4G 内存快。这就是为什么即使有无限的预算,你也不想要一个巨大的 L1 缓存(例如)。这也是为什么大多数其他答案都是错误的。这就是我对“内存层次结构”评论的理解。从现在到时间结束,实现 RAM 模型的计算机将始终具有内存层次结构。因此,如果您关心速度,编写适合他们的代码是明智之举。
【解决方案2】:

假设您的 RAM 有 2^64 个单元(可以存储单个值的地方,比如说 8 位)。然后它需要 64 个引脚来寻址具有不同编号的每个单元。当在 RAM 的输入引脚上“出现”一个二进制数 X 时,RAM 可以将地址为 X 的单元格的值发送到某些输出引脚,您的 CPU 可以从那里获取值。在硬件中,寻址可以很容易地完成,例如通过使用多个与非门(这种来自某些逻辑门的“寻址设备”称为解码器)。

所以这一切都发生在硬件级别,这只是直接寻址。如果 CPU 能够为 RAM 的 64 个引脚提供 64 位,则它可以寻址每个内存单元(因为 64 位足以表示高达 2^64 -1 的任何数字)。您没有立即获得值的唯一原因是一种“传播时间”,因此信号通过电路中的所有逻辑门需要时间。

【讨论】:

  • 这条评论解释了为什么我的答案被写出来。这是他们要理解的原则。
【解决方案3】:

负责处理内存访问的组件是memory controller。它被 CPU 用来读取和写入内存。

访问时间是恒定的,因为内存字真正以矩阵形式布局(因此,“字节数组”抽象非常现实),其中有行和列。为了获取给定的内存位置,将所需的内存地址传递给控制器​​,然后激活右列。

来自http://computer.howstuffworks.com/ram1.htm

存储单元被蚀刻到硅晶片上的列阵列中 (位线)和行(字线)。位线的交点和 wordline 构成内存单元的地址。

所以,基本上,您的问题的答案是:内存控制器可以解决这个问题。当然,给定一个内存地址,到列和行的映射必须很容易在常数时间内计算出来。

为了完全理解这个话题,我建议你阅读这篇关于内存工作原理的指南:http://computer.howstuffworks.com/ram.htm

要掌握的概念太多,很难用一个答案来解释。

【讨论】:

  • 谢谢你,我学到了很多,但是请注意我的问题还是一样的。因为如果确实内存被组织成一个矩阵,有行和列。然后就像我们的好朋友@Nemo 所说,它的 O(sqrt(n)) 速度或门。因为如果您有 4 GB 内存,那么您将拥有 sqrt(4*10^9) 行和列。因此,在给定地址 0x(*&&^(*& 无论如何,行/列解码器仍然需要通过 sqrt(4*10^9) 选择,它是如何做到的?不要告诉我它是另一个矩阵:)
  • @user3167049 - 限制是 logN(N 是可能的最大地址),因为地址解码器有许多与之成比例的门级。
【解决方案4】:

在我回答之前,我一直在阅读您的 cmets 和问题。我认为你在正确的轨道上,但这里有一些混乱。您所暗示的随机访问并不像您认为的那样存在。

读取、写入和刷新是在一个连续的循环中完成的。如果在该周期内检测到信号,则仅在特定间隔内读取或写入内存中的特定单元。将会有支持电路,其中包括“用于放大在存储单元上检测到的信号或电荷的感应放大器”。

除非我误解了您的意思,否则您的困惑在于读取/写入单元格是多么容易。它因芯片设计而异,但读取或写入数据到单元所需的最少周期数。

这些是我的来源:

http://www.doc.ic.ac.uk/~dfg/hardware/HardwareLecture16.pdf
http://www.electronics.dit.ie/staff/tscarff/memory/dram_cycles.htm
http://www.ece.cmu.edu/~ece548/localcpy/dramop.pdf

为了避免冗长的答案,我省略了大部分细节,但所有这三个都将描述您正在寻找的过程。

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2016-09-09
    • 2012-06-15
    • 2011-03-15
    • 2020-10-05
    • 2012-09-30
    • 2020-04-16
    • 2018-09-25
    相关资源
    最近更新 更多