为什么寄存器比内存快?

文章来源:点击打开链接

原因一:距离不同

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

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

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

原因二:硬件设计不同

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

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

原因三:工作方式不同

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

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

  1. 找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)
  2. 将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。
  3. 将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。
  4. 确定数据在哪一个内存块(chunk)上,从该块读取数据。
  5. 数据先送回内存控制器,再送回CPU,然后开始使用。

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

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

时间: 2024-10-06 16:58:42

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

[转帖]为什么寄存器比内存快?

为什么寄存器比内存快? http://www.ruanyifeng.com/blog/2013/10/register.html 快的原因.. 计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘. 同样都是晶体管存储设备,为什么寄存器比内存快呢? Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解.下面就是我的简单翻译. 原因一:距离不同 距离不是主要因素,但是最好懂,所以放在最前面说.内存离CPU比

寄存器与内存的区别

寄存器:寄存器是有触发器或锁存器组成,通常由触发器组成,寄存器拥有非常高的读写速度,所以在寄存器之间传递数据非常快 内存:内存就是存储器,由半导体器件构成. 计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘. 同样都是晶体管存储设备,为什么寄存器比内存快呢? Mike Ash写了一篇很好的解释,非常通俗地回答了这个问题,有助于加深对硬件的理解. 原因一:距离不同 距离不是主要因素,但是最好懂.内存离CPU比较远,所以消费更长的时间储

为什么寄存器和内存访问带宽差这么多?

原因一:距离不同 距离不是主要因素,但是最好懂,所以放在最前面说.内存离CPU比较远,所以要耗费更长的时间读取. 以3GHz的CPU为例,电流每秒钟可以振荡30亿次,每次耗时大约为0.33纳秒.光在1纳秒的时间内,可以前进30厘米.也就是说,在CPU的一个时钟周期内,光可以前进10厘米.因此,如果内存距离CPU超过5厘米,就不可能在一个时钟周期内完成数据的读取,这还没有考虑硬件的限制和电流实际上达不到光速.相比之下,寄存器在CPU内部,当然读起来会快一点. 距离对于桌面电脑影响很大,对于手机影响

汇编语言--寄存器(内存访问)

本文主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构.形成物理地址的方法.相关的寄存器以及一些指令 本文地址:http://www.cnblogs.com/archimedes/p/assembly-register-memory.html,转载请注明源地址. 内存中字的存储 在cpu中,用16位来存储一个字,高8位存放高字节,低8位存放低位字节.在内存中时,由于内存单元是字节单元,刚一个字要用2个地址连续的内存单元来存放,字的低位字节存在低地址单元. 字单元--存放一个字型数据(1

内核基础 - 寄存器与内存寻址(by quqi99)

作者:张华  发表于:2016-03-01 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 汇编 汇编编译器assembler编译目标代码二进制文件(nasm -f elf -g -F stabs *.asm),连接器linker(ld -o bin_file *.o)除了把目标代码组合成一个单个的块,还要确保模块以外的函数调用能够指向正确的内存引用(连接器必须建立一个索引,也就是符号表,里面

[Win32]一个调试器的实现(四)读取寄存器和内存

[Win32]一个调试器的实现(四)读取寄存器和内存 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在前几篇文章中,我实现的那个调试器只能被动接收调试事件并输出这些事件的信息.现在,我要将它修改成可以接收命令,并根据命令对被调试进程进行各种操作.首先从最基本的操作开始. 获取寄存器的值 每个线程都有一个上下文环境,它包

寄存器(内存访问)

节选自王爽<汇编语言>第三章内容 CPU中用16位寄存器来存储一个字,但内存单元是字节单元,一个单元存储一个字节,需要两个地址连接的内存单元来存放.字的低位字节存放在低地址单元中,高位字节存放在高地址单元中. CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成. Mov 寄存器名称 [内存地址偏移量] 默认段地址存放在DS中. 8086CPU不支持直接将数据送入段寄存器的操作.所以一般是需要把数据送到通用寄存器ax,bx,然后再送入到

[转载]来认识寄存器,内存,IO空间,IO端口,IO内存

整天说内存,寄存器,端口,他们有什么联系,有什么不同之处,你了解他们么? 第一.寄存器和内存的区别 寄存器和内存都是可以用来读写的,但寄存器的操作时有副作用,称之为(side effect 边际效果) 读取一个寄存器可能导致寄存器中的内容发生变化,比如在一些设备的中断状态寄存器中,读取了寄存器后会自动清零 第二.IO空间和内存空间 并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM体系结构就没有这种区别, 在X86上,IO空间和内存是独立的,他们各自有各自的总线,

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

疯狂的暑假学习之  汇编入门学习笔记 (二) 参考:<汇编语言> 王爽  第三章 一.寄存器(内存访问) 1.DS和[address] DS 数据段寄存器,用来存放数据段地址 [address] 用来表示数据段的偏移地址 同样跟CS一样,不可以通过 mov ds, 1000 给ds赋值 要通过通用寄存器ax等. 例如: mov ax, 1000 mov ds, ax mov al, [0] 把1000:0的内容存进al mov bx, 1000 mov ds, bx mov [0], al 把