What Every Programmer Should Know About Memory

  • 作者: 雪山肥鱼
  • 时间:20210402 06:29
  • 目的:内存部分的结束

What Every Programmer Should Know About Memory

恕我直言,网上的原版pdf,关键地方缺少标点符号,着实令人蛋疼。还是看lwn原文把

https://lwn.net/Articles/252125/

# 内存硬件的基础只是
  ## introduction
  ## 硬件架构
# RAM 简介
  ## SRAM简介
  ## DRAM简介
  ## DRAM内部结构简介
  ## DRAM相关属于
  ## Memory Types(SDRAM)的演进
# CPU cahce
# VMA
# NUMA

内存硬件的基础知识

我对硬件了解几乎为0,也就这两天翻查阅了一些资料。结合这篇文档,大致了解下即可。

Introduction

在上古时代的计算机四大基础组成部分的速度其实差不多。

  • CPU
  • Memory
  • Mass Storage
  • Network Interface

只不过后续人们主要研发CPU,导致其余的跟不上节奏,速度变慢或者到达了瓶颈。所谓瓶颈,要么突破的cost会很大, 要么需要调整整个的硬件结构。
已经调整了的硬件结构:

  • RAM hardware design(speed and parallelism)
  • Memory controller designs
  • CPU cache
  • DMA

硬件架构

带有北桥的架构

北桥初期架构.png

如图所示CPU与CPU之间,CPU与北桥之间用 FSB 总线进行通讯。北桥内嵌memeory contoral , 内存RAM的不同决定了MC的不同。DRAM,RamBus,SDRAM对接的Memory Contorl 是不同的
南桥被当作I/O桥,对接不同类型的总线,PCI-E,SATA,USB等

  • 值得注意的点

    • CPU之间的通讯必须经过FSB总线
    • 与RAM通讯必须经过北桥
    • RAM 只有单一的端口(多端口不在此处讨论)
    • CPU与南桥的I/O设备通讯,必须要经过北桥
  • 瓶颈:

  1. 设备对RAM的访问
    • 早期不管是在南桥还是北桥的所有通讯都要经过CPU,非常涌向性能
    • 引入DMA,DMA在北桥的帮助下,没有CPU的介入,直接从RAM里接受或者储存数据,但会与CPU产生对RAM使用的竞争
      2.北桥总线到RAM的瓶颈,总线本身的瓶颈?
  • 最小化延迟的方式来调度内存访问。当遇到 hyper-threads, cores, processors DMA同时访问内存,等待内存访问的时间会更长。
  • 除了并发访问,还有更多的访问内存的取到。访问模式本身也会影响内存模块的性能,特别是multiple memory channles,例如后续会讨论到的有关RAM的访问方式

后续言演进出不包含MC的北桥架构:


MC脱离北桥.png
  • 优点
  1. 多条内存总线,增加带宽
  2. 对并发访问内存更加友好(by simultaneousely accessing different memory banks
  3. 主要的性能限制归咎与北桥内部的带宽

只有南桥的架构

无北桥架构.png

将MC模块整合到CPU中,直接对接RAM

  • SMP system based on AMD'Operation
  • CSI(Common System Interface) Nehalem processors. Intel

对于这样的架构来说, 可用的memory banks数量和处理器一样多。在一个4-CPU的电脑中,内存带宽是原来的4倍,并且并不需要庞杂的北桥辅助的情况下。

缺点:

  1. 内存非统一 NUMA, Non-Uniform Memory Architechture。一块CPU 一块内存。
  • 这里的local memory(memory attached to a processor)
  • 跨CPU的内存访问,比较特殊。
  1. 跨cpu 的remote memory access, 会存在一个 numa factors. cpus 会组成node,也会涉及node之间的内存访问,这时的 numa factors 是很大的,对性能影响很严重。

RAM 简介

在一台机器中为说明会有两种RAM?
如果全部配成DRAM,慢。
如果全部配成SDRAM,成本太高,而且体积会很大。

SRAM

Static RAM:


SRAM结构.png

SRAM的一个cell 由6个晶体管组成,只要vdd长期供电,则会一直在BL BL非读取到值.
关于SRAM知道以下几点即可

  1. 一个cell 有 6个 晶体管,1-4 存储 5-6 输出
  2. 只要给vdd持续供电,就会一直保存cell的值
  3. 只要WL给一个上拉电压,就可以一直读出状态
  4. 不需要向DRAM定时refresh电容充电,保存值。
    缺点很明显,贵,大,性价比低。

DRAM 简介

Dram cell.png

DRAM的结构比SRAM结构简单很多,元器件也非常精简。电容有电荷时代表bit 1,无电荷代表bit 0
缺点:

  1. 电容漏电,每次从电容读数据都会造成电荷流失,读数据其实伴随着一次写操作
  2. 泄漏造成要定时refresh memory.
  3. 从cell读出的数据不能用,需要通过 sense amplifer 放大电压 bits line之间的打压差后,存储到 row buffer 才能使用.
  4. 电荷的流失和充电不是即时的。被sense amplifer 探测到的电流不能用。说实话我也不知道为啥。总之一句话。DRAM之所以慢,要等到电容充分放电或者充电后,才能访问。

相对于SRAM 的有点就是小,便宜。

DRAM内部结构简介

结构

内部矩阵结构.png

对应之前叙述的DRAM的结构,注意其中的word line、bit line、sense amplifer
宏观上sense amplifers 又对接了 另一组DRAM 矩阵。

layout.png

读流程

Raw Address Strobe.png
RAS取数据.png

当从word line中取出数据后,word line 的电荷全部清空

CAS取数据.png
row refresh.png

根据 row buffer 中的数据(猜的), 重新给bit line 上电,形成row refresh

时序图.png

工作流程:1-3 就是所谓的 row activate 行激活
1、对所有的bit line 进行 pre-charge.
2、根据 RAS 对所需word line 进行 pre-charge.
3、利用Sense Amplifiers 侦测的电压差,读取一行 word line 的数据,相当于存储到raw buffer
4、根据 CAS 读取对应列的数据
5、重新row refresh,恢复数据
6、word line release
7、colume address Strobe diasable

由上述流程图也能看出,DRAM确实很慢呀

写流程

we使能.png
根据CAS 写入数据.png
重新row refresh.png
写数据时序图.png

工作流程(与读相似)
1、所有bit line pre-charge
2、根据 RAS 对所需word line 进行 pre-charge.
3、数据存储到raw buffer
4、we使能
5、修改 row buffer 数据
6、row refresh

DRAM相关术语

参考资料 https://zhuanlan.zhihu.com/p/33444359

  • dram array
    多个DRAM存储单元的矩阵 叫做dram array
Dram Array.png
  • raw buffer
    存储从 DRAM cell 扒下来数据的地方

  • bank地址
    https://blog.csdn.net/qq_39759656/article/details/81672895

    结构.png

    bank 可以理解为多个DRAM Arrays 组成,黑框的就是一个IC。正反两面16个IC。 单面成为一个Rank。

bank内部结构.png

发送行地址的时候,同时还要发送两个比特的bank地址,用于区分是访问哪个bank.这样每个bank 有自己的row buffer, 就有了n个row buffer,使CPU大概率每个线程访问时不同的bank。减少行激活,提高速度。

总结:
以DDR3 DIMM 为例子:
2个 rank,16个IC, 每个IC 有8个bank,每个bank 有一组 dram arrays. 一个 dram arrays 有 mxn 个 dram cell. 一个cell 就是一个1T1C (one transistor and 1 capcitory)结构,一个三极管+1个电容

Memory Types(SDRAM) 的演进

  • SDR(single data rate)


    SDR Operation.png
  • DDR1


    DDR1.png

    上下沿都在传输数据

  • DDR2


    DDR2.png

    总线的频率时原来的2倍,意味着贷款是原来的2倍

  • DDR3


    DDR3.png

总之理解为越来越快,传送的数据越来越多就完事儿了。唯一注意的是文章后续要讨论的NUMA 架构的引入。

CPU Cache

上班划水读了一天,没读明白。大部分都是实验数据。学到 多线程多进程并不会是性能提升,反而会争夺FSB总线,导致性能下降。才疏学浅,只能理解到这里了。再沉淀一段时间,回头再来看这一章节吧。了解程度 到 cache line 那一章节的文章,暂且就够了,能力不够,先刹车吧。

Virtual Memory

和之前的文章差不多,掠过

NUMA

https://www.youtube.com/watch?v=Vmb8xGD-LV8
https://www.youtube.com/watch?v=4JleOfUeDvg
简单的理解就是一块CPU(当然也可以多个CPU)享受一片内存

NUMA示意图.png

但是每块CPU仍然可以访问全部内存,但是访问速度就不同了,访问属于自己的那一块内存,肯定是最快的。访问其他的就变慢了。这就是为什么叫做 non-uniform!
not same the speed it can access all memory.

numa node 是多个CPU


多CPU节点.png

更夸张:


多CPU节点.png
NUMA中的node.png
NUMA.png

兄弟们 后续章节实在看不懂了,更到这里把。刹车了。
其实第6章写的很全面。奈何技术有限,再沉淀写日子,回头继续读把。

你可能感兴趣的:(What Every Programmer Should Know About Memory)