深入理解Linux进程与内存 学习笔记#1

第二章

2.1 CPU对内存的硬件支持

2.1.1 cpu的内存控制器

IMC 是现代 CPU 中的一个组件,负责管理 CPU 和系统内存(RAM)之间的通信。它取代了传统北桥芯片的内存控制功能,直接集成到处理器中。IMC 控制内存的读写操作、管理内存分配,并与操作系统内核(如 Linux 的 Buddy 分配器)协作。

DDR PHY 又是链接DDR内存条和内存控制器的桥梁。负责物理层通信,把 IMC 的指令转化为实际的电信号发送到内存模块。

2.1.2 CPU支持的内存代际

类型 基本频率范围 数据速率 主要特点
SDR 66--133 MHz 66--133 MT/s 单倍数据速率,每次时钟周期传输一次数据,电压 3.3V,早期 PC 内存标准。
DDR 100--200 MHz 200--400 MT/s 双倍数据速率(上升沿和下降沿传输),电压 2.5V,带宽翻倍,取代 SDR。
DDR2 200--533 MHz 400--1066 MT/s 更高频率、更低功耗(1.8V),改进预取缓冲(4位),支持更高带宽。
DDR3 400--1066 MHz 800--2133 MT/s 更低电压(1.5V),8位预取缓冲,性能提升,支持更高容量模块。
DDR4 800--1600 MHz 1600--3200 MT/s 超低电压(1.2V),更高带宽和效率,支持更大容量(高达 128GB/条)。
DDR5 1600--3200 MHz 3200--6400+ MT/s 电压降至 1.1V,双通道设计,效率更高,支持超高带宽和容量。

内存真正的工作频率是核心频率,时钟频率和数据频率都是在核心频率的基础上,通过技术手段放大出来的。内存越新,放大的倍数越多

2.2内存硬件内部结构

内存条上的标识:16G 2Rx8 PC4-3200AA-SE1-11

16G不过多的解释

2Rx8

  • 2R 表示 2 Ranks
  • x8 表示每个内存芯片的位宽为 8 bits(8位)也就是说每个内存芯片一次传输 8 位数据。x8 是常见的配置,相比 x4(4位)芯片,x8 芯片数量较少,通常成本更低。

PC4

  • 表示这是 DDR4 内存

3200AA

  • DDR4-3200 的基本频率是 1600 MHz(因为 DDR 是双倍数据速率,1600 MHz × 2 = 3200 MT/s)

SE1-11

  • 产品系列或版本号 和 内存条的生产日期或修订版本
2.2.1 Rank

CPU能够对同一个Rank的所有Chip进行并行读写操作,需要Chip并行工作共同组成一个64比比特的数据给CPU。假如某笔记本内存条的这个参数是1Rx16,表示该内存条只有1个Rank。每个Chip内存颗粒的位宽是16比特。一个Rank需要提供64比特的数据,则需要64/16=4个Chp来组成一个Rank来同步工作。这个内存条只需4个黑色颗粒就够了。

2.2.2 Chip

Chip内部又是一层层的Bank组成的,每个 Bank 内是一个二维数组,由行(Row)和列(Column)组成。

DRAM 芯片内部由 Rank → Bank → Row/Column → Cell 的层次组成。

2.3 内存IO原理

2.3.1 内存延迟
参数 定义 含义
CL 发送列地址到内存开始返回数据的时钟周期数 列地址选通延迟,表示从指定列地址到数据可用的时间。
tRCD 打开一行内存到访问列地址所需的最小时钟周期数 行地址到列地址延迟,衡量激活一行到定位列的准备时间。
tRP 发出预充电命令到打开下一行所需的最小时钟周期数 行预充电时间,表示关闭当前行到激活下一行之间的等待时间。
tRAS 行激活命令到发出预充电命令之间的最小时钟周期数 行活动时间,限制一行保持活动的最短时间,确保数据完整性。
2.3.2 内存IO过程

完整的读取内存地址0x0000的一个字节数据的过程

  1. 第一步、内存控制器对各个Chip中指定行地址的预充电,需要等待tRP个时钟周期

  2. 内存控制器再向各个Chip发出打开一行内存的命令,又需要等待tRCD个时钟周期

  1. 内存控制器接着发送列地址,再等待CL个周期后,各个Chip就把数据聚合好了

我们以一个 1Rx8 的内存为例来详细讲解内存的 IO 过程,这个内存的单个 Rank 中包含 8 个 DRAM Chip,每个内存颗粒的位宽为 8 比特,总共形成 64 位的总线宽度,正好匹配 DDR 内存的标准设计。假设 CPU 想要读取地址范围 0x0000 到 0x0007 这 8 个字节的数据,在理想情况下,这 8 个字节均匀分布在 8 个 Chip 上,内存控制器(IMC)会通过 DDR PHY 发送命令激活所有 Chip 中同一个 Bank 的某一行,然后一次性发出列地址读取请求,每个 Chip 同时工作,分别输出 8 bit 数据,比如 Chip 0 提供 0x0000 的 8 位,Chip 1 提供 0x0001 的 8 位,依此类推,直到 Chip 7 提供 0x0007 的 8 位,借助 DDR 的突发传输特性(通常是 BL8),这 64 位数据通过一次高效的操作并行传输到 CPU,完成读取,整个过程充分利用了 64 位总线宽度和 Chip 的并行性,IO 效率非常高,延迟可能仅为 tRCD 加 CL 的时间(例如 DDR4-3200 下约 20 纳秒)。

但是,如果这 8 个字节的数据恰好全部存储在同一个 Chip 中,情况就完全不同了,由于单个 Chip 的位宽只有 8 位,它只能每次读取 8 bit 数据,比如先读 0x0000 的 8 位,传输完成后再读 0x0001 的 8 位,如此重复 8 次才能凑齐完整的 64 位数据,这种串行读取的方式意味着其他 7 个 Chip 处于闲置状态,64 位总线的大部分带宽被浪费,每次读取还需经历完整的时序开销(如 tRCD 和 CL),总耗时可能高达 160 纳秒甚至更多,尤其当数据跨行或跨 Bank 时,还会额外受到 tRP 和 tRAS 的限制,速度相比并行读取慢得多,这种低效模式类似于内存中的"随机 IO",无法发挥 DDR 内存设计的高带宽优势。

2.3.3 随机IO和顺序IO

内存的随机 IO (Random IO)

  • 定义 :
    数据按非连续的内存地址读取或写入。例如,先访问 0x0000,再跳到 0x5000,再到 0x2000。

  • 特点:

    • 低效率: 每次访问可能需要激活不同的 Row 或 Bank,导致额外的寻址和切换开销。
    • 高延迟: 随机访问会触发更多的行激活(Row Activation)和预充电(Precharge),受限于 tRCD、tRP 和 tRAS。
    • 吞吐量下降: 无法充分利用突发传输,带宽利用率远低于理论值。
  • 示例:

    • 数据库索引的指针跳转。
    • 多线程程序中分散的内存访问。
  • 内存随机 IO (Random IO)

    • 定义 :

      数据按照非连续的地址进行读写。例如,先读第 10 块,再跳到第 500 块,再回到第 3 块。

    • 特点

      • 低吞吐量: 每次操作都需要重新寻址,增加了额外开销。
      • 高延迟: 机械硬盘需要磁头频繁移动,SSD 虽无机械部件,但仍需处理分散的地址映射。
      • 示例
        • 数据库查询(如索引查找)。
        • 操作系统启动时加载多个小文件。
2.3.4 内存 Burst IO
  • 定义
    • Burst IO(突发输入输出)是 DDR 内存的一项特性,指在一次读写操作中连续传输多个数据单元,而非单个数据。
  • 工作原理
    • 通过设定 突发长度(Burst Length,BL),通常为 8(BL8),每次操作传输多个周期的数据。
    • 例如:DDR 内存总线宽 64 位,BL8 一次传输 64 字节(64 bit × 8)。
  • 优点
    • 高效率: 减少寻址开销,利用顺序访问填满总线带宽。
    • 高吞吐量: 接近理论带宽,例如 DDR4-3200 可达 25.6 GB/s(3200 MT/s × 64 bit ÷ 8)。
    • 缓存对齐: 与 CPU 缓存行(通常 64 字节)匹配,适合缓存填充。
  • 应用场景
    • 顺序 IO 任务,如大块数据传输、视频流处理或数组加载。
  • 限制
    • 在随机 IO 中效率降低,因地址不连续可能导致多次独立操作,受限于时序参数(如 CL、tRCD)。
  • 实现
    • 由内存控制器(IMC)和 DDR PHY 协调,从 DRAM 的 Bank 中按序输出数据。
相关推荐
学长毕设1 天前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
小小de风呀1 天前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
李某学编程1 天前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
Song_RsHt1 天前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
sbjdhjd1 天前
AI产业周度动态:从“更强模型”走向“可执行、可治理、可计价”的系统竞争 (2026年10月19日—10月25日)
人工智能·笔记·ai·开源·gemini·信息差·claude code
ss2731 天前
AI时代首先数据库-PostgreSQL实战笔记 27 PostgreSQL数据写入与读取流程解析
数据库·笔记·postgresql
深圳老胡1 天前
压力检测空吸功能硬件方案全解析:主流压力传感器品牌与实现路径
笔记·单片机·代码规范
程序猿追1 天前
返回 null 不一定入队成功:鸿蒙 KMP上的并发优先队列观察笔记
笔记·华为·harmonyos·kmp
~kiss~1 天前
PRO-LONG: Programmatic Memory Enables Long-Horizon Reasoning 程序式记忆赋能长程推理
学习
程序猿编码1 天前
不依赖 vLLM/llama.cpp:一套面向学习的 DeepSeek-R1 CUDA 推理实现
c++·学习·语言模型·llama·vllm·大模型推理