zoukankan      html  css  js  c++  java
  • 深入解析内存原理:RAM的基本原理

    1. 寻址原理概述
    RAM 主要的作用就是存储代码和数据供CPU 在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM 等存储器来说也是一样的,虽然存储的都是代表0 和1 的代码,但是不同的组合就是不同的数据。
    让我们重新回到书和书架上来,如果有一个书架上有10 行和10 列格子(每行和每列都有0-9 的编号),有100 本书要存放在里面,那么我们使用一个行的编号加一个列的编号就能确定某一本书的位置。如果已知这本书的编号87,那么我们首先锁定第8 行,然后找到第7 列就能准确的找到这本书了。在RAM 存储器中也是利用了相似的原理。
    现在让我们回到RAM 存储器上,对于RAM 存储器而言数据总线是用来传入数据或者传出数据的。因为存储器中的存储空间是如果前面提到的存放图书的书架一样通过一定的规则定义的,所以我们可以通过这个规则来把数据存放到存储器上相应的位置,而进行这种定位的工作就要依靠地址总线来实现了。
    对于CPU 来说,RAM 就象是一条长长的有很多空格的细线,每个空格都有一个唯一的地址与之相对应。如果CPU 想要从RAM 中调用数据,它首先需要给地址总线发送地址数据定位要存取的数据,然后等待若干个时钟周期之后,数据总线就会把数据传输给CPU。下面的示意图可以帮助你很好的理解这个过程。


    上图中的小圆点代表RAM 中的存储空间,每一个都有一个唯一的地址线同它相连。当地址解码器接收到地址总线送来的地址数据之后,它会根据这个数据定位CPU 想要调用的数据所在的位置,然后数据总线就会把其中的数据传送到CPU。
    上面所列举的例子中CPU 在一行数据中每次只是存取一个字节的数据,但是在现实世界中是不同的,通常CPU 每次需要调用32bit 或者是64bit 的数据(这是根据不同计算机系统的数据总线的位宽所决定的)。如果数据总线是64bit 的话,CPU 就会在一个时间中存取8个字节的数据,因为每次还是存取1 个字节的数据,64bit 总线将不会显示出来任何的优势,工作的效率将会降低很多。
    2. 从“线”到“矩阵”
    如果RAM 对于CPU 来说仅仅是一条“线”的话,还不能体现实际的运行情况。因为如果实际情况真的是这样的话,在实际制造芯片的时候,会有很多实际的困难,特别是在需要设计大容量的RAM 的时候。
    所以,一种更好的能够降低成本的方法是让存储信息的“空格”排列为很多行--每个“空格”对应一个bit 存储的位置。这样,如果要存储1024bits的数据,那么你只要使用32x32 的矩阵就能够达到这个目的了。很明显,一个32x32 的矩阵比一个1024bit 的行设备更紧凑,实现起来也更加容易。请看下图1:

     
    图1                                                         图2
    知道了RAM 的基本结构是什么样子的,下面我们就谈谈RAM存储字节的过程是怎样的:上面的示意图1 显示的也仅仅是最简单状态下的情况,也就是当内存条上仅仅只有一个RAM 芯片的情况。
    对于X86 处理器,它通过地址总线发出一个具有22 位二进制数字的地址编码--其中11 位是行地址,另外11 位是列地址,这是通过RAM 地址接口进行分离的。
    行地址解码器(row decoder)将会首先确定行地址,然后列地址解码器(column decoder)将会确定列地址,这样就能确定唯一的存储数据的位置,然后该数据就会通过RAM 数据接口将数据传到数据总线。
    另外,需要注意的是,RAM 内部存储信息的矩阵并不是一个正方形的,也就是行和列的数目不是相同的--行的数目比列的数目少。(后面我们在讨论DRAM的过程中会讲到为什么会这样)
    上面的示意图2 粗略的概括了一个基本的SRAM 芯片是如何工作的。SRAM 是“staticRAM(静态随机存储器)”的简称,之所以这样命名是因为当数据被存入其中后不会消失(同DRAM 动态随机存储器是不同,DRAM 必须在一定的时间内不停的刷新才能保持其中存储的数据)。
    一个SRAM 单元通常由4-6 只晶体管组成,当这个SRAM 单元被赋予0 或者1的状态之后,它会保持这个状态直到下次被赋予新的状态或者断电之后才会更改或者消失。
    SRAM 的速度相对比较快,而且比较省电,但是存储1bit 的信息需要4-6 只晶体管制造成本太高了(DRAM 只要1 只晶体管就可以实现)。
    3. DRAM 基本存储单元结构
    不管你相信不相信,目前主流内存中的RDRAM(Rambus)、DDR SDRAM、SDRAM 甚至是EDO RAM 的基本结构都是相同的,它们都是属于DRAM(Dynamic RAM:动态随机访问存储器)。所有的DRAM 基本存储单元都是由一个晶体管和一个电容组成。


    这样的基本存储单元的架构是目前最经济的方式,电容的状态决定着内存基本存储单元的逻辑状态是“0”还是“1”--充满电荷的电容器代表逻辑“1”,“空”的电容器代表逻辑“0”,不过正是因为使用了电容器所以产生了一些局限性。
    电容存储的电荷一般是会慢慢泄漏的,这也就是为什么内存需要不时的刷新的缘故。电容需要电流进行充电,而电流充电的过程也是需要一定时间的,一般是0.2-0.18 微秒(由于内存工作环境所限制,不可能无限制的提高电流的强度),在这个充电的过程中内存是不能被访问的。
    从技术上讲,实现内存的定时刷新并不是什么难事,DRAM 厂商指出这种刷新操作必须每64ms 进行一次,这也就意味着DRAM 基本存储单元大约有1%的时间用在了刷新上。
    对于DRAM 来说最大的问题是,读取内存会造成内存基本存储单元中的电荷丢失,所以每当DRAM 被访问之后都要进行刷新,以维持访问之前的状态,否则就会造成数据丢失。当然拿出专门的时间进行刷新,也就增加了访问时间,提高了延迟。
    SRAM(Static RAM)则不存在刷新的问题。一个SRAM 基本存储单元由4 个晶体管和两个电阻器构成,它并不利用电容器来存储数据,而是通过切换晶体管的状态来实现的,如同CPU 中的晶体管通过切换不同的状态也能够分别代表0 和1 这两个状态。正是因为这种结构,所以SRAM 的读取过程并不会造成SRAM 内存储的的信息的丢失,当然也就不存在什么刷新的问题了。
    SRAM 可以比DRAM 高的频率来运行,主要是因为获取前8 个字节的时间延迟大大缩短了。SRAM 需要2-3 个时钟周期来得到想要的数据(这里我们暂时忽略CPU、芯片组和内存DIMM 控制电路之间的延迟),不过同样的过程DRAM 需要大约3-9 个时钟周期。当然因为构造不同,SRAM 和DRAM 存储1bit 数据的成本是不同的,前者大约是后者的4 倍--因为它的所需要的晶体管数目是后者的4 倍以上。SRAM 因为存取延迟时间非常的短,所以它的工作频率能够达到很高,因此可以带来更高的带宽。

  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/lzhu/p/7000487.html
Copyright © 2011-2022 走看看