为什么寄存器比内存快?

2023-11-13

原文出处: Mike Ash 译文出处: 阮一峰

计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。




同样都是晶体管存储设备,为什么寄存器比内存快呢?




Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解。下面就是我的简单翻译。

原因一:距离不同

距离不是主要因素,但是最好懂,所以放在最前面说。内存离CPU比较远,所以要耗费更长的时间读取。

以3GHz的CPU为例,电流每秒钟可以振荡30亿次,每次耗时大约为0.33纳秒。光在1纳秒的时间内,可以前进30厘米。也就是说,在CPU的一个时钟周期内,光可以前进10厘米。因此,如果内存距离CPU超过5厘米,就不可能在一个时钟周期内完成数据的读取,这还没有考虑硬件的限制和电流实际上达不到光速。相比之下,寄存器在CPU内部,当然读起来会快一点。

距离对于桌面电脑影响很大,对于手机影响就要小得多。手机CPU的时钟频率比较慢(iPhone 5s为1.3GHz),而且手机的内存紧挨着CPU。

原因二:硬件设计不同

苹果公司新推出的iPhone 5s,CPU是A7,寄存器有6000多位(31个64位寄存器,加上32个128位寄存器)。而iPhone 5s的内存是1GB,约为80亿位(bit)。这意味着,高性能、高成本、高耗电的设计可以用在寄存器上,反正只有6000多位,而不能用在内存上。因为每个位的成本和能耗只要增加一点点,就会被放大80亿倍。



事实上确实如此,内存的设计相对简单,每个位就是一个电容和一个晶体管,而寄存器的设计则完全不同,多出好几个电子元件。并且通电以后,寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没用到的就没电,这样有利于省电。这些设计上的因素,决定了寄存器比内存读取速度更快。

原因三:工作方式不同

寄存器的工作方式很简单,只有两步:(1)找到相关的位,(2)读取这些位。

内存的工作方式就要复杂得多:

(1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)

(2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。

(3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。

(4)确定数据在哪一个内存块(chunk)上,从该块读取数据。

(5)数据先送回内存控制器,再送回CPU,然后开始使用。

内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

为了缓解寄存器与内存之间的巨大速度差异,硬件设计师做出了许多努力,包括在CPU内部设置缓存、优化CPU工作方式,尽量一次性从内存读取指令所要用到的全部数据等等。

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

为什么寄存器比内存快? 的相关文章

  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • chatgpt赋能python:制作简单动画:Python带你飞

    制作简单动画 Python带你飞 Python不只是一门编程语言 它还能制作简单的动画 Python用于动画的库 有很多种 包括turtle graphics py和pygame等等 本文将以turtle为例 介绍如何使用Python制作简
  • (文件上传upload) [极客大挑战 2019]Upload1 和 [ACTF2020新生赛]Upload1

    前言 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行 这里上传的文件可以是木马 病毒 恶意脚本或者WebShell等 由于程序员在对用户文件上传部分的控制不足或者处理缺陷 而导致用户可以越过其本身权限向服务器上传可执行的动态
  • Docker学习高级篇-重量级监控工具CIG

    目录 背景问题 1 Docker监控三剑客简介 CAdvisor InfluxDB Grafana Metrics Dashboard 2 Docker compose部署CIG 3 Grafana配置 背景问题 通过docker stat
  • L1、L2、smooth L1三类损失函数

    一 常见的MSE MAE损失函数 1 1 均方误差 平方损失 均方误差 MSE 是回归损失函数中最常用的误差 它是预测值与目标值之间差值的平方和 其公式如下所示 下图是均方根误差值的曲线分布 其中最小值为预测值为目标值的位置 优点 各点都连
  • 防火墙的目标地址转换和源地址转换

    遇到一起防火墙故障 对防火墙的工作原理和目标地址转换 源地址转换有了进一步的了解 记录于此 结果说在前面 网络结构非常简单 外网 防火墙 内网 内网中架有网站 在外网使用域名访问 内网中机器需要上外网 也需要用域名互访 在这种情况下 地址转
  • 熵最大定理 两种理解

    在信息论中 我们会关注一个信息源熵的大小 简单的说 熵表征了一个信源的不确定度 我们已经对下面这个定理烂熟于心 在所有定义在有限字符集上的随机符号中 熵最大发生在等概时 为H x logM M为符号个数 首先我们可以从直观上理解熵最大定理
  • FlatBuffer在JAVA下的使用

    早听说FatBuffer的大名 据说比Protobuffer效率还要高 出于当初对Protobuf良好的印象 FlatBuffer同样是Google出品 因此在一个项目中尝试使用了FlatBuffer IDL之类的描述语言 轻车熟路地过了
  • IntelliJ IDEA快速自动生成Junit测试类

    前言 之前在写业务逻辑的时候 都很少有写单元测试 因公司项目用的分布式架构 将整个系统抽成了很多微服务 测试一个接口 需要启动好几个服务 才能进行测试 并且有时候 我们只是改了一点代码 并不需要全部启动 太耗时 这个时候 就可以编写单元测试
  • 数字图像处理——图像锐化

    图像增强是图像处理的一个重要环节 早期的图像处理就是从图像增强开始的 人们研究对质量低的图像进行处理以获得改善质量后的图像 现今的图像增强还为后续的图像处理 如图像信息提取 图像识别等 提供更高识别度的图像 从图像处理技术来看 图像的摄取
  • 关于fiddler手机(APP)抓包时无法连接网络问题处理

    个人在新入职公司 想安装fiddler 尝试通过手机连接本地电脑访问服务器网络 然后再通过fidder在本地和与服务器之间抓取数据 之前也有在上家公司用过 但不知是网络认证的原因 还是这次下载的fidder自身的问题 当我将认证书传到手机端
  • ubuntu 下 screenfetch 的安装及使用

    ubuntu 下 screenfetch 的安装及使用 origin link https linux cn article 1947 1 html screenfetch 是一个CLI bash 脚本 用于在屏幕截图中显示系统 主题信息
  • 【数据库系统概论】第七章:数据库设计

    视频 参考 文章目录 概念设计 E R图 逻辑结构设计 把E R图转化为表 物理结构设计 概念设计 E R图 E R图 矩形 实体 椭圆 属性 菱形 联系 联系 两个实体之间的联系 1 1 一对一的联系 身份证和人民 1 N 一对多的联系
  • Java 基于Excel模板实现导出Excel并插入数据

    本案例基于spring boot架构 一 需求介绍 给定一个Excel模板 在指定位置插入数据 然后将生成的excel导出 二 实现方法介绍 1 准备Excel模板 模板中要插入数据的地方用 代替 其实就是占位符 与mybatis的sql语
  • openwrt luci使用本地软件源更新软件包,更新package.sig签名

    官方的源在国外 一般访问速度比较慢 本地源可以快速解决这个问题 有时自己编译的软件升级发布版本使用本地源 能够更好的维护与安装 为了保证兼容性 尽量使用同一个源提供的SDK打包的源软件 把编译出来的ipk文件上传到本地服务器 在索引中添加新
  • HBase讲解

    1 HBase在Hadoop中的位置 HBase Hadoop Database 是一个开源的 面向列 Column Oriented 适合存储海量非结构化数据或半结构化数据的 具备高可靠性 高性能 可灵活扩展伸缩的 支持实时数据读写的分布
  • 竞赛选题 基于机器视觉的车道线检测

    文章目录 1 前言 2 先上成果 3 车道线 4 问题抽象 建立模型 5 帧掩码 Frame Mask 6 车道检测的图像预处理 7 图像阈值化 8 霍夫线变换 9 实现车道检测 9 1 帧掩码创建 9 2 图像预处理 9 2 1 图像阈值
  • Vue+elementUI el-input输入框手机号校验

    1 限制input框内只能输入数字 且为11位 type number 数字类型 maxlength属性对type number 类型的输入框无效 ninput if value length gt 11 value value slice
  • 达梦数据库教程:docker安装DM8数据库

    安装前准备 软硬件 版本 终端 X86 64 架构 Docker 2023 年 6 月版 下载 Docker 安装包 请在达梦数据库官网下载 Docker 安装包 导入安装包 拷贝安装包到 opt 目录下 执行以下命令导入安装包 docke
  • windows下nginx的安装及使用

    1 下载nginx http nginx org en download html 下载稳定版本 以nginx Windows 1 12 2为例 直接下载 nginx 1 12 2 zip 下载后解压 解压后如下 2 启动nginx 有很多
  • 为什么寄存器比内存快?

    原文出处 Mike Ash 译文出处 阮一峰 计算机的存储层次 memory hierarchy 之中 寄存器 register 最快 内存其次 最慢的是硬盘 同样都是晶体管存储设备 为什么寄存器比内存快呢 Mike Ash写了一篇很好的解