计算机内存
- 计算机内存系统核心知识总结
-
- 软件层面:栈(Stack)
-
- 内存布局
- [栈帧(Stack Frame)](#栈帧(Stack Frame))
- 硬件层面:存储层次结构
- 程序局部性原理
计算机内存系统核心知识总结
软件层面:栈(Stack)
内存布局
- 栈在高地址,向下增长:在进程的虚拟地址空间中,栈通常位于高地址区域,并随着数据压入而向低地址方向增长。
栈帧(Stack Frame)
- 本质:栈帧本质上是一个函数的活动记录,用于存储函数的局部变量、参数、返回地址等信息。
- 栈溢出防护 :
- 代码层面 :使用安全的字符串函数,如
strncpy替代strcpy,避免缓冲区溢出。 - 编译器层面 :GCC 默认开启
-fstack-protector选项,在函数栈中插入保护字(canary)来检测栈溢出攻击。
- 代码层面 :使用安全的字符串函数,如
硬件层面:存储层次结构
核心组件
- 寄存器(Registers):CPU 内部的速度最快的存储单元。
- 缓存(Cache):位于 CPU 和主存之间的高速缓冲存储器。
- 主存(Main Memory / RAM):程序运行时存放代码和数据的主要场所。
存储器分类
存储器主要分为两大类:
| 类型 | 全称 | 特点 | 典型应用 |
|---|---|---|---|
| ROM | 只读存储器(Read-Only Memory) | 内容通常只能读取,不能随意写入。 | 存储固件、BIOS |
| RAM | 随机存取存储器(Random Access Memory) | 可读可写,断电后数据丢失。 | 用作系统主内存 |
ROM 的发展
- 早期:紫外线可擦除(EPROM),但擦除次数有限。
- 后期:电可擦除可编程只读存储器(EEPROM),可多次擦写。
RAM 的分类
| 类型 | 全称 | 特点 | 典型应用 |
|---|---|---|---|
| SRAM | 静态随机存取存储器(Static RAM) | 速度快、造价高、不需要刷新。 | CPU 内部的高速缓存(L1, L2, L3) |
| DRAM | 动态随机存取存储器(Dynamic RAM) | 速度相对慢、造价低、需要定期刷新。 | 内存条(主内存) |
缓存(Cache)
- 作用:缓存是处理器和主内存之间的高速桥梁,用于弥补 CPU 高速与内存低速之间的差距。
- 层级 :通常为多层结构,如 L1、L2、L3 缓存,速度逐级降低,容量逐级增大。L1分指令缓存和数据缓存,L1存取速度4个cpu时钟周期,L2 11个,L3 39个 RAM内存的存取速度107个 L1大部分32KB 一个cache line为64Bytes 共有512条cache line 如果有8组 则每一路有64*64=4096Byts .为方便索引内存地址Tag:每条 Cache Line 前都会有一个独立分配的 24 bits来存的 tag,其就是内存地址的前24bits
• Index:内存地址后续的6个bits则是在这一Way的是Cache Line 索引,2^6 = 64 刚好可以索引64条Cache Line
• Offset:再往后的6bits用于表示在Cache Line 里的偏移量https://coolshell.cn/articles/20793.html - 管理单元 :
- 缓存块(Cache Block / Cache Line):缓存进行数据管理的最小单元。
- 容量计算:整个缓存容量 = 组数 × 路数 × 缓存块大小。
程序局部性原理
缓存设计基于以下两个关键的局部性原理:
| 原理 | 定义 | 对缓存设计的启示 |
|---|---|---|
| 时间局部性 | 被访问过一次的内存位置,在短时间内很可能再次被访问。 | 将最近访问过的数据保留在缓存中。 |
| 空间局部性 | 被访问过的某个内存位置附近的位置,不久后也大概率会被访问。 | 缓存加载数据时,会一次性加载一个缓存块(包含目标地址及其相邻数据)。 |
结论:正是基于程序访问内存所表现出的这些规律性(局部性),计算机系统才设计了多级缓存结构,从而显著提升了程序的整体执行效率。