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的输出是通过整个内部缓冲区的内容移位得到的


目录
相关文章
|
5月前
|
C++
C++初阶(十二)string的模拟实现
C++初阶(十二)string的模拟实现
38 0
|
3月前
|
Serverless Cloud Native
云原生应用问题之用std::function封装一个普通函数如何解决
云原生应用问题之用std::function封装一个普通函数如何解决
24 1
|
5月前
|
存储 缓存 编译器
探秘C++中的神奇组合:std--pair的魅力之旅
探秘C++中的神奇组合:std--pair的魅力之旅
206 1
探秘C++中的神奇组合:std--pair的魅力之旅
|
5月前
|
存储 安全 编译器
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
C++ std::move以及右值引用全面解析:从基础到实战,掌握现代C++高效编程
451 0
|
5月前
|
算法 Java C语言
【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于`namespace` + import vs include
【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于`namespace` + import vs include
155 0
|
缓存 算法 C语言
【C++技能树】Vector类解析与模拟实现
Vector是一个动态数组的容器,可以容纳各种类型的序列容器。称其为数组,意味着:**其也可以用下标去访问,类似与之前的顺序表。**所以,Vector分配空间的时候也不是说用多少就分配多少,会多分配一些,因为向系统申请空间这个成本是相对较大的。
90 0
|
算法
谈一谈|return None来看递归函数流程解析
谈一谈|return None来看递归函数流程解析
93 0
|
C语言
【CSAPP基础】第二章信息的表示
【CSAPP基础】第二章信息的表示
70 0
【CSAPP基础】第二章信息的表示
|
存储 Perl
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
503 0
Verilog读书笔记---数据类型、系统任务、`define、parameter、localparam三者的区别
memcpy函数使用原则及方法,案例,易错点,,自己制作memcpy
memcpy函数使用原则及方法,案例,易错点,,自己制作memcpy
129 0