深入解析内存原理: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 因为存取延迟时间非常的短,所以它的工作频率能够达到很高,因此可以带来更高的带宽。
深入解析内存原理:RAM的基本原理的更多相关文章
- 深入解析内存原理:DRAM的基本原理
前面我们知道了在一个简单的SRAM 芯片中进行读写操作的步骤了,然后我们来了解一下普通的DRAM 芯片的工作情况.DRAM 相对于SRAM 来说更加复杂,因为在DRAM存储数据的过程中需要对于存储的信 ...
- 深入解析内存原理:SRAM的基本原理
1. SRAM芯片的引脚定义早期的SRAM 芯片采用了20 线双列直插(DIP:Dual Inline Package)封装技术,它们之所以具有这么多的针脚,是因为它们必须:• 每个地址信号都需要一根 ...
- 【腾讯优测干货分享】如何降低App的待机内存(四)——进阶:内存原理
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3FTPFvZRqyAQnU047kmWJQ 1.4进阶:内存原理 在 ...
- 几个系统调用分析 glibc中的malloc调用和共享内存原理
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/wri ...
- 内存分析_.Net内存原理介绍
内存原理介绍 1. .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...
- 浏览器解析JavaScript原理
1.浏览器解析JavaScript原理特点: 1.跨平台 2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的. var a = 10; 数字类型 ...
- 影子内存(Shadow RAM)介绍_4
影子内存(Shadow RAM,或称ROM shadow)是为了提高系统效率而采用的一种专门技术.它把系统主板上的系统ROM BIOS和适配器卡上的视频ROM BIOS等拷贝到系统RAM内存中去运行, ...
- 18.Java基础_关键字this及其内存原理
this使用 this的内存原理 执行函数setName时,首先是创建函数栈空间,然后创建形参name,除此之外还会有一个this(实质是堆内存中对象的首地址),这个this会索引对象的成员变量nam ...
- Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇
一.前言 本文假设读者对 Spring Security 本身原理有一定程度的了解,假设对 OAuth2 规范流程.Jwt 有基础了解,以此来对 SpringSecurity 整合 OAuth2 有个 ...
随机推荐
- luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...
- 全面深入介绍C++字符串:string类
http://blog.csdn.net/liuliming3000/article/details/1809385 1 从C到C++ string类 2 string类的构造函数 3 string类 ...
- 洛谷P2668 斗地主
好,终于搞完了这一道毒瘤题...... 先想到搜索,然后想到状压,发现数据组数很多,又是随机,还是决定用搜索. 先搜出的多的,于是顺序是三个顺子,然后按照多到少搜带牌,最后是不带牌. 大体思路很简单, ...
- react组件在项目中的应用(基础知识)
上图我是定义了5个模块,全部都渲染在一个组件里面.可以先看看我的代码结构 我将Hello文件夹下的index.jsx文件作为父组件,最后渲染在根组件中. 那我们怎么输出这个Hello组件呢?要达到上图 ...
- Spring Boot Actuator的端点
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...
- Missing artifact com.github.pagehelper:pagehelper:jar:3.4.2-fix的解决方法(最简单的方法)
在网上看的淘淘商城的项目,自己在配置maven项目的时候遇见了这个异常,按照网上教程试了试,一重启各种异常. 后来直接,就更改了自己的maven仓库就ok了. 解决方法: 对比一下,你就能够发现问题, ...
- GUI程序开发的流程(随时删除的源码)
1.继承JFrame 2.定义需要的组件 3.创建组件 4.设置布局管理器 5.添加组件 6.显示窗体 --------------------------------------------- 小代 ...
- django中命令行调试程序
(1)进入到程序manage.py所在的目录下 (2)python manage.py shell 这样可在命令行中引入models.views.class等所有的包,然后进行命令行试运行.
- parted分区工具用法
parted分区工具用法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着生产环境中数据量的增大,我们对硬盘的容量也有很大的需求,当硬盘的容量大于2T(工业上的最大磁盘2.2TB ...
- nginx-1.12.1编译参数详情
一下nginx-1.12.1编译参数详情 #/usr/local/nginx/sbin/nginx -V nginx version: nginx/1.12.1 built by gcc 4.4.7 ...