CSAPP之RAM要点快记

简介: RAM随机访问存储器(RAM),分为静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)。速度:SRAM > DRAM价格:SRAM > DRAM

RAM

随机访问存储器(RAM),分为静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)。

速度:SRAM > DRAM

价格:SRAM > DRAM

应用:

  • SRAM:多用于高速缓存
  • DRAM:多用于主存 | 图形帧缓冲区

DRAM芯片构造

DRAM中有很多很多单元(位),而DRAM中的单元一般被划分为d个超单元。每个超单元都有w个单元。所以一个d\times wd×w的DRAM芯片可以储存dwdw位数据。

超单元不是一排排到底的,是被划分为r行,c列,形成一个矩阵。这样子做的好处在接下来的数据读取可以体现出来。

从单DRAM芯片中存取数据

从DRAM芯片中存取数据需要通过内存控制器。而内存控制器与DRAM芯片又是通过引脚交流。在传统的DRAM中,两者之间存在着两组引脚。

第一组被称为addr引脚,用于指示DRAM芯片应该对哪个超单元进行访问。第二组被称为data引脚,顾名思义用于传输数据。addr引脚是从内存控制器到DRAM的单向流通引脚,而data引脚则是双向流通的。毕竟DRAM没有将地址返回给内存控制器的需求。

随着计算机的发展,单位面积上我们希望塞进去更多的单元,存储更多的数据,这个时候就需要尽可能减少一些不必要的空间,例如引脚的数量。

但是有些引脚可以动,有些引脚动不得。

例如data引脚,如果每个超单元由8个单元构成,即每个超单元存储的数据是8位的。也就是说data引脚必须要8位才能实现完整的数据交流。引脚多了没用,少了数据被截断。所以data引脚一般是不会去动它的。

而addr引脚就可以稍微优化一下。加入这是一个16x8的DRAM,即有16个超单元,每个超单元有8位。那么如果将所有的超单元排排站,我们就会发现总共需要log_2 16 = 4log216=4个引脚来传输地址。但是如果我们将超单元排列成一个4x4的矩阵,那么我们可以将addr引脚优化到2个指针。我们可以先传输行地址,锁定目标行,再传输列地址,确定目标超单元。

实际上这也是传统的DRAM的设计与存取方法。实际的读取流程如下:

  1. 内存控制器向DRAM发送行地址i
  2. DRAM将i行存储至DRAM内置的行缓冲区。
  3. 内从控制器向DRAM发送列地址j
  4. DRAM从行缓冲区去除第j列的超单元数据,通过data引脚传出
  5. 行缓冲区被清空

其中第一步被称为RAS(Row Access Strobe,行访问选通脉冲),第三步被称为CAS(Column Access Strobe,列访问选通脉冲)。

将超单元排排站还是组成团,各有优劣

排排站的好处是一步到位,缺点是引脚增多

组成团的好处是引脚减少,缺点是过程复杂

内存模块

DRAM芯片不都是单枪匹马战斗的,他们被封装在内存模块里面。这样子可以统一调配多个DRAM芯片,而且每一个超单元的存储位数也能“变多”。怎么回事呢?

例如将8个64Mbit的8M×8的DRAM芯片封装成一个内存模块,那么和这个内存模块总共可以存储64MB的数据。其中每一个“超单元”可以存储64位的数据。这里的“超单元”实际上不是简单的一个超单元,而是在8个DRAM中相同的(i,j)(i,j)对应的每一个超单元的集合!每一个超单元可以存储8位,那么将8个DRAM中相同地址的超单元的数据串起来就可以存储64位的数据。具体的实现过程如下:

  • 内存控制器向内存模块发送地址(i,j)(i,j)
  • 模块内将ij广播到每一个DRAM中
  • 内存模块取得每一个DRAM中(i,j)(i,j)对应的超单元数据,并将它们拼接为64位的数据,传输给内存控制器

(这里的拼接实际上是有内存模块中的电路实现的)

更快更强的DRAM

  • 快页模式DRAM(FPM DRAM),即行缓冲区在使用后不清空,如果下一次需要访问的数据还在该行,就可以直接从缓冲区读取。
  • 拓展数据输出DRAM(EDO DRAM),让CAS信号能够更加紧凑
  • 同步DRAM(SDRAM),使用与外部相同的时钟信号来控制(一般的DRAM内部有自己的时钟信号,即异步的)
  • 双倍速率同步DRAM(Double Data-rate Synchronous DRAM, DDR SRAM),是SDRAM的升级版。原本的SDRAM只在时钟上升沿或下降沿更新,现在被升级为上升沿和下降沿都更新,从而将速率翻倍。
  • 视频RAM(Video RAM,VRAM)。主要用于图形系统的帧缓冲区,思想与FPM DRAM类似,不过稍有区别。
  • VRAM可以对内存并行读写,FPM 不行
  • VRAM的输出是通过整个内部缓冲区的内容移位得到的


目录
相关文章
|
6月前
|
存储 缓存 编译器
探秘C++中的神奇组合:std--pair的魅力之旅
探秘C++中的神奇组合:std--pair的魅力之旅
315 1
探秘C++中的神奇组合:std--pair的魅力之旅
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
|
编译器 Linux 调度
RT-Thread编程高阶用法-函数扩展之$Sub$与$Super$
RT-Thread编程高阶用法-函数扩展之$Sub$与$Super$
122 0
|
编解码
wrf模式学习记录--如何计算三层嵌套中的e_sn/e_we/ i_parent_start/ j_parent_start
在此记录一下关于wrf模式中如何计算嵌套网格的格点数,即e_sn / e_we
wrf模式学习记录--如何计算三层嵌套中的e_sn/e_we/ i_parent_start/ j_parent_start
|
C语言
【CSAPP基础】第二章信息的表示
【CSAPP基础】第二章信息的表示
74 0
【CSAPP基础】第二章信息的表示
|
Go 开发者
break 注意事项和细节说明 | 学习笔记
快速学习 break 注意事项和细节说明
break 注意事项和细节说明 | 学习笔记
|
存储 Perl
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
671 0
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
|
设计模式 测试技术
软件测试面试题:page object设计模式中,如何实现页面的跳转?
软件测试面试题:page object设计模式中,如何实现页面的跳转?
123 0
|
前端开发
前端经典面试题解密-add(1)(2)(3)(4) == 10到底是个啥?
前端的小伙伴在面试的时候,几乎都会遇到一道这样的面试题: add(1)(2)(3)(4)输出结果为10。在第一次看到这道面试题的时候,很多小伙伴感到了迷茫!借用王宝强在《人在囧途》中的表演:啥啥啥,这写的都是啥?下面胡哥为各位小伙伴带来这道题的揭秘。
201 0
int a=6;a+=a-=a*a; printf(“%d\n“,a);过程讲解(带图,易懂)
int a=6;a+=a-=a*a; printf(“%d\n“,a);过程讲解(带图,易懂)
260 0
int a=6;a+=a-=a*a; printf(“%d\n“,a);过程讲解(带图,易懂)