RAM 如何以 O(1) 的速度访问内存中的任何位置

2024-01-28

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

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

我个人的猜测是,你可以以 O(log(n)) 的速度实现对任何内存的访问,其中 n 是内存的大小。因为每个门都会将内存分成两部分,并将内存访问指令发送到下一个将内存分成两个门的部分。但这需要很多门。我无法提出任何其他有根据的猜测,我什至不知道我应该在谷歌中查找的设备的名称。

请帮助我痛苦的好奇心,并提前致谢。

编辑

引用你的“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) ,这要好得多,我认为这可能是一个商业秘密。

/编辑


到底是什么,我不妨以此作为答案。

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

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

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

但即使这样也是错误的。如果你想谈论我们宇宙的实际局限性物理朋友说 https://physics.stackexchange.com/questions/2281/在任何球体中可以存储的绝对最大位数与球体的表面积成正比,而不是其体积。因此,包含 n 位信息的最小球体的实际半径是 O(sqrt(n))。

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

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

RAM 如何以 O(1) 的速度访问内存中的任何位置 的相关文章

  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 无论如何,为什么要处置一个肯定很快就会被处置的物体呢?

    假设我有一个程序 例如单击按钮 我创建了一个 Graphics 对象 显然我应该处理掉它 例如 using Graphics gr this CreateGraphics 或通过调用 Dispose in the finallytry ca
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • printf() var-arg 引用如何与堆栈内存布局交互?

    给出代码片段 int main printf Val d 5 return 0 是否有任何保证编译器会存储 Val d and 5 连续地 例如 d l a V 5 Format String
  • 运行时之前初始化的数据段值将存储在哪里?

    通常数据段在C code位于RAM易失性存储器 由初始化数据段组成 未初始化数据段 BSS 堆栈内存和堆 堆栈内存仅在运行时调用例程和在push and pull的价值观 堆用于动态内存分配调用malloc calloc and reall
  • 使用 parse.com 并遇到分配内存问题

    我是编程新手 过去 3 个月我一直在制作应用程序 并学到了一些东西 但我还没有遇到如何解决这个问题 我一直使用 Parse com 作为我的服务器 发送图片 保存用户数据等 有了所有这些数据 如果我多次打开某些活动 特别是带有图片的活动 应
  • boost::serialization 序列化期间内存消耗较高

    正如主题所示 在将大量数据序列化到文件时 我遇到了 boost serialization 的一个小问题 问题在于应用程序序列化部分的内存占用量大约是要序列化的对象内存的 3 到 3 5 倍 值得注意的是 我拥有的数据结构是基类指针和指向该
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • JVM内存段分配

    好吧 我有一个关于 JVM 内存段的问题 我知道每个 JVM 都会选择稍微不同地实现这一点 但这是一个总体概念 在所有 JVM 中应该保持相同 一个在运行时不使用虚拟机执行的标准C C 程序在运行时有四个内存段 代码 堆栈 堆 数据 所有这
  • 可以禁用“应用程序错误”对话框吗?

    我使用 Hudson 作为持续集成服务器来测试 C C 代码 不幸的是 我在某个地方有一个错误导致内存损坏 因此在某些 Windows 计算机上我有时会收到一个 应用程序错误 对话框 解释一条指令引用了无法读取的内存 弹出此对话框并基本上挂
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons

随机推荐

  • 修改flexdashboard的shinyauthr

    我已经构建了一个使用运行时闪亮的交互式 Flexdashboard 我想创建一个用户身份验证登录模块 页面 我偶然发现保罗 坎贝尔 Paul Campbell 的闪亮作者包 https paul rbind io 2018 11 04 in
  • 对 Java 8 可选* 值的操作。

    Java 8 有许多可选类 例如OptionalDouble OptionalInt OptionalLong 有没有一种使用同类可选值的好方法 也就是说 我希望能够做到 OptionalDouble d1 OptionalDouble o
  • 列出有关 SQL Server 中所有数据库文件的信息

    是否可以列出 SQL Server 上所有数据库的文件 MDF LDF 信息 我想获得一个列表 显示哪个数据库正在使用本地磁盘上的哪些文件 我尝试过的 exec sp databases所有数据库 select from sys datab
  • 如何去除图像中的小颗粒背景噪声?

    我正在尝试从我拥有的图像中消除渐变背景噪音 我尝试了很多方法cv2没有成功 首先将图像转换为灰度 使其失去一些可能有助于找到轮廓的梯度 有人知道处理这种背景的方法吗 我什至尝试从角落取样并应用某种内核过滤器 消除梯度的一种方法是使用cv2
  • 如何导航到同级路线?

    假设我有这个路由器配置 export const EmployeeRoutes path sales component SalesComponent path contacts component ContactsComponent 并已
  • 开发 Eclipse RCP 应用程序

    这是我第一次使用 Eclipse 3 8 开发 RCP 应用程序 我的问题可能看起来很奇怪 但对我来说确实很困惑 我可以在哪里放置应用程序的代码 如果我为我的应用程序创建所需的类 我可以在哪里使用它们的对象 在里面Application j
  • 将一系列图像从 java 应用程序传输到 ffmpeg 子进程

    我正在寻找一种将一系列图像 jpeg 从java应用程序流式传输到FFMpeg STDIN管道的方法 FFMpeg 应该处理这些图像并创建一个视频文件作为输出 FFMpeg 作为 java 应用程序的子进程执行 使用以下命令 ffmpeg
  • 使用 PHP/MySQL 日期查询向 Google 可视化页面提交表单

    我使用从 PHP MySQL 提取的数据在谷歌可视化上创建饼图 该图表看起来不错 但我想添加一个日历 日期选择器 以使饼图动态化 我的日期范围选择器似乎正在工作 它从我的数据库中提取正确的数据 选择日期 提交查询后 它返回此字符串 over
  • 如何知道节点是 Virtual TreeView 中的根节点?

    我正在使用虚拟树视图 有没有可靠的方法来知道节点是否是根节点 我尝试使用 if not Assigned Node Parent then Output This is root else Output This is not root 但
  • 在表格布局中显示动态行的问题:Android

    我想以表格布局显示数据 数据数量是动态的 所以我需要在表中实现动态行 为此 我想在一行中显示 4 个 TextView Problem 目前 我能够在表中和四个 TextView 中显示数据 但我希望所有四个 EditText 之间有一些空
  • 在不使用排序功能的情况下按某个元素对嵌套列表进行排序。

    如果我有一个像这样的嵌套列表 L James 1 2 Alan 1 1 Henry 1 5 如何在不使用排序或排序函数的情况下根据每个子列表中的最后一个数字从最高到最低对它进行排序 Output final Henry 1 5 James
  • SAS 替换所有列中的字符

    我有一个 SAS 数据集 必须导出到 csv 文件 我有以下两个相互矛盾的要求 我必须使用分号作为 csv 文件中的分隔符 一些字符变量是从公式中手动输入的字符串 因此它们可能包含分号 我对上述问题的解决方案是转义分号或用逗号替换它 我怎样
  • OpenCV Mat 对象 - 获取数据长度

    在 OpenCV 中 我可以使用 C 中的 VideoCapture 捕获帧 但是 当我尝试从帧中获取数据并计算长度时 它只返回 0 下面是我的示例代码 VideoCapture cap 0 for Mat frame cap gt gt
  • Codeigniter:执行 $this->db->last_query();执行查询?

    查询执行是否发生在get where 以下 codeigniter 活动记录语句的子句 this gt db gt select q this gt db gt get where Contacts array id gt contact
  • 在 JavaScript 正则表达式中使用 {1}+ 所有格量词时出现正则表达式错误

    由于我同时学习 Javascript 和 Express js 因此我在发出 get 请求时尝试使用正则表达式 为了熟悉正则表达式 我使用了这个chart http docs oracle com javase tutorial essen
  • 如何使用信号更新另一个模型字段来更新模型字段?

    我正在尝试添加所有total值在Transaction模型并将它们放入Sale模型的第一个实例 pk 1 gross total场地 这是我的代码 模型 py class Sale models Model gross total mode
  • 为什么应用程序有时会在killProcess 上重新启动?

    通常 通过调用以下命令退出我的应用程序 android os Process killProcess android os Process myPid 表现良好 没有发生任何事故 但每隔一段时间 应用程序就会再次重新启动 退出后 相关日志片
  • 如何使用Android MediaCodec编码相机数据(YUV420sp)

    感谢您的关注 我想使用Android MediaCodec API对从Camera获取的视频帧进行编码 不幸的是 我没有成功做到这一点 我对 MediaCodec API 还不太熟悉 以下是我的代码 我需要你的帮助来弄清楚我应该做什么 1
  • 将参数传递给正在运行的应用程序

    我正在制作一个图像上传器 将图像上传到图像托管网站 并且在传递参数时遇到一些问题 图像位置到已运行的应用程序 首先 假设 MyApp exe 始终运行 每当我右键单击图像时 我都会在默认 Windows 上下文菜单中添加一个项目 显示 上传
  • RAM 如何以 O(1) 的速度访问内存中的任何位置

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