寄存器、缓存、内存、DDR、RAM的关系
计算机的内部存储(内存、缓存、闪存…)
1. 主要概念
内部存储器:
2.1 寄存器,register
寄存器
是距离CPU最近、访问数据速度最快的存储介质,用来做一些最基本的指令和地址存储。寄存器
从内存
中获取数据,然后在CPU中进行处理,处理完后又将数据暂时存放在寄存器
中,再从寄存器
传输到内存
中。寄存器
不需要很大容量,但是必须有匹配CPU的数据传输速度,所以它被集成在了CPU内部以节省数据传输的时间,是CPU的一部分。寄存器
具有高性能、高耗电的特点,所以造价成本较高。
2.2 主存储器,内存,memory
主存储器
就是我们常说的(狭义的)内存
,使用的是 DRAM, Dynamic Random-Access Memory
。
DRAM
之所以叫动态,是因为将数据写入 DRAM
后,一段时间过后数据会丢失,需要一个额外的电路不断对其进行刷新操作才行。因为DRAM
储存数据利用的是电容中是否有电荷,有代表1,无代表0。但是电容会放电或吸电,刷新操作会对其进行检查。如果电量大于满电量的1/2,则将电充满,否则将电全部放掉。
内存
有以下特点:
- 高速访问:内存的访问速度非常快,比硬盘等外部存储设备快得多,因此数据处理效率高
- 易失性:内存是易失性存储器,这意味着当电源关闭时,内存中的数据会丢失。
- 大容量:相对于缓存,内存的容量较大,通常以GB(千兆字节)为单位。
2.3 缓存,高速缓冲存储器,cache
如果程序要获取的数据刚好在寄存器
中,可以直接获得该数据。如果在内存
中,则需50-200个周期。可见速度差别非常大。如果每次寄存器
都从内存
中去读取数据,则耗费时间将会相当多。为了弥补这一速度差异,工程师们设计了缓存
这一工作方式。CPU频繁访问的数据被存储在了缓存
中。CPU要获取数据时,首先访问缓存
,如果命中则得到数据,如果没有命中(cache miss)则再去访问内存
。至于缓存
怎么判断哪些数据是会被频繁访问的,这就涉及到相关的算法问题了。
缓存使用的是比一般的RAM(Random Access Memory)
存取速度更快的SRAM(Static Random Access Memory)
。
RAM一般分为静态RAM(static RAM, SRAM)
和动态RAM(dynamic RAM, DRAM)
。SRAM
的速度虽然比 DRAM
快,但成本高得多,所以不可能将 DRAM
全部替换成 SRAM
。CPU访问数据先是在一级缓存(L1 Cache)
中找,找不到再到二级缓存(L2 Cache)
中找,再没有就去内存
中找。
缓存
有以下特点:
- 更高速访问:缓存的访问速度比内存更快,因为它通常使用更快的存储技术(如SRAM)。
- 小容量:缓存的容量通常较小,常见的以KB或MB为单位。
- 多级结构:现代计算机系统中,缓存通常有多级结构,如L1、L2和L3缓存。L1缓存是最快的,位于处理器核心内部;L2缓存稍慢,容量更大;L3缓存更慢,但容量更大,通常在整个处理器芯片上共享。
内存
和 缓存
在广义上整体被称为内(部)存储器
(简称内存
)或主存储器
,而其他外部不依赖电存储数据的设备(如磁盘、光盘、闪存等)统称外存储器
或辅助存储器
。内存
是CPU
和外部存储设备
之间的桥梁,用来存放那些将要被CPU处理的数据,以及与外部设备交换数据。
外部存储器
2.4 快闪存储器,闪存,flash Memory
一种外部存储器
,多用于照相机、音乐播放器、手机等设备,如SD卡。现在的游戏卡一般都是闪存
。U盘用的也是快闪技术。另外,快闪存储器
也在作为磁盘存储器
的替代品越来越多地被使用,即所谓的 固态硬盘(ssd,solid state disk)
。不同于内存
,它在电源关闭时(或故障时)数据可保存下来。
2.5 硬盘存储器
磁盘存储器
就是 磁盘
、硬盘
或 机械硬盘
。是长期联机存储数据的主要介质。为了能够访问数据,系统必须将数据从 磁盘
移到 内存
。完成处理后,数据要写回 磁盘
。由于访问 磁盘
非常耗时,而且频繁操作 磁盘
也会造成 磁盘
损伤,所以有了”磁盘缓存“这一设计。
移动硬盘
是机械硬盘
还是固态硬盘
?都有。固态的移动硬盘一般较贵,容量较小。
2. 一些概念上的区分
2.1 缓存和内存
缓存
是CPU的一部分,它存在于CPU中。内存
中被CPU访问最频繁的数据和指令被复制入CPU中的缓存
,这样CPU就可以不经常到象“蜗牛”一样慢的内存
中去取数据了,CPU只要到缓存
中去取就行了,而缓存的速度要比内存快很多。
注意:
- 因为
缓存
只是内存中少部分数据的复制品,所以CPU到缓存
中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存
复制到缓存
中去),这时CPU还是会到内存
中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存
中去,以便下一次不要再到内存
中去取。 - 因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说
缓存
中的数据要经常按照一定的算法来更换,这样才能保证缓存
中的数据是被访问最频繁的。
2.2 内存和 CPU
CPU
是负责运算和处理的,内存
是交换数据的。
通常 CPU
找数据或指令的顺序是:先到 一级缓存
中找,找不到再到 二级缓存
中找,如果还找不到就只有到 内存
中找了。一级缓存
和二级缓存
中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。
2.3 SRAM 和 DRAM
RAM(Random Access Memory)
分为两种:
- 静态RAM,SRAM(Static Random-Access Memory)
- 优点:访问速度快、功耗低、数据稳定(只要有店员,数据就不会丢失)
- 缺点:存储密度低(集成度低,存储相同的数据,
SRAM
的体积是DRAM
的 6 66 倍)、成本高(同容量的SRAM
是DRAM
的 4 44 倍) - 用途:主要用于 CPU
缓存
,也可用在某些嵌入式系统中作为主内存
- 动态RAM,DRAM(Dynamic Random-Access Memory)
- 优点:存储密度高、成本低
- 缺点:访问速度较慢,需要周期性刷新以保持数据。
- 用途:主要用作计算机的主内存。
2.4 DDR 和 SDR
DDR(Double Data Rate)
是指 DRAM
的一种改进技术,能够在一个时钟周期内传输两次数据(在时钟信号的上升沿和下降沿各一次)。这使得 DDR 内存比传统的 单倍数据率(SDR,Single Data Rate)
内存速度更快。
2.5 Cache Miss
cache miss, 缓存未命中
指的是当一个程序或系统试图从缓存
中读取数据,但所需的数据并不在缓存
中,从而需要从较慢的主存储器
(如主内存或磁盘)中获取数据的情况。缓存未命中会导致性能下降,因为访问主存储器的速度通常比访问缓存的速度慢得多。
缓存未命中通常可以分为以下几类:
- 冷缓存未命中(Cold Miss 或 Compulsory Miss):这是指数据首次被访问时,因为缓存中还没有任何数据,必然会发生缓存未命中。
- 冲突未命中(Conflict Miss):即使缓存中有足够的空间来存储数据,但由于缓存映射策略(例如直接映射缓存)导致多个数据块被映射到同一个缓存位置,从而导致未命中。
- 容量未命中(Capacity Miss):当缓存大小不足以容纳程序工作集中所有需要的数据时,即使缓存已经满了,仍需要移除一些数据以腾出空间给新的数据,从而导致未命中。
缓存命中和未命中对系统性能有显著影响,设计良好的缓存系统可以通过减少未命中率来显著提升系统性能。这通常通过增加缓存大小、优化缓存替换策略(如LRU、FIFO等)、以及改进缓存映射策略来实现。
2.6 多级缓存层次结构
- L1缓存(一级缓存):
- 位置:通常集成在 CPU 核心内部,每个核心有自己的独立
L1缓存
。 - 速度:最快的缓存,具有最低的延迟,但容量相对较小(通常在几KB到几十KB之间)。
- 分区:通常分为两个部分:
L1指令缓存(L1 Instruction Cache)
和L1数据缓存(L1 Data Cache)
,分别用于存储指令和数据。 - 功能:主要功能是存储频繁使用的数据和指令,以便 CPU 能够快速访问。
- 位置:通常集成在 CPU 核心内部,每个核心有自己的独立
- L2缓存(二级缓存):
- 位置:集成在 CPU 内部,但可以与多个核心共享或每个核心有自己的L2缓存。
- 速度:比L1缓存稍慢,但比RAM快得多。容量比L1缓存大(通常在几百KB到几MB之间)。
- 功能:用于存储L1缓存未命中的数据和指令,提供次一级的高速数据访问。
- L3缓存(三级缓存):
- 位置:通常在多核 CPU 中共享,所有核心都可以访问同一个L3缓存。
- 速度:比L2缓存慢,但仍比RAM快。容量较大(通常在几MB到几十MB之间)。
- 功能:用于存储L2缓存未命中的数据和指令,进一步减轻RAM的访问负担。
2.7 虚拟地址和物理地址
2.7.1 定义
虚拟地址(Virtual Address)
:程序使用的地址。物理地址(Physical Address)
:在内存中实际存储数据的地址。
2.7.2 引入原因
虚拟地址(Virtual Address)
和 物理地址(Physical Address)
的存在是为了提高系统的效率和安全性。具体来说,虚拟地址和物理地址的引入有以下几个主要原因:
- 内存保护:
- 用户程序隔离:
虚拟地址
使得每个进程都拥有独立的地址空间,防止一个进程无意或恶意地访问另一个进程的内存,从而增强了系统的安全性和稳定性。 - 内核保护:操作系统内核和用户进程运行在不同的地址空间中,用户进程无法直接访问内核内存,这样可以防止用户程序破坏系统的正常运行。
- 用户程序隔离:
- 地址空间扩展:
虚拟地址
空间允许程序使用比实际物理内存
更大的地址空间。通过虚拟内存
技术,操作系统可以将不常用的数据暂时存放到硬盘上,从而腾出物理内存供活跃的程序使用。这使得系统能够运行比物理内存更多和更大的应用程序。
- 内存管理的简化:
- 内存分配:
虚拟地址
空间使得内存分配和回收变得更加灵活。操作系统可以使用分页(Paging)
或分段(Segmentation)
技术将虚拟内存
映射到物理内存
,从而简化内存管理。 - 内存共享:
虚拟内存
允许多个进程共享同一段物理内存
。例如,多个进程可以共享同一个库文件,而不需要为每个进程分别分配一份物理内存
副本。
- 内存分配:
- 程序的可移植性:
- 虚拟地址使得程序不需要关心实际的物理内存布局。程序可以使用统一的虚拟地址进行编译和运行,无需在不同机器上进行修改。这增强了程序的可移植性。
- 地址空间的抽象:
- 虚拟地址提供了一个抽象层,屏蔽了底层物理内存的细节,使得程序开发和系统管理更加简便。程序员可以在一个统一的、连续的地址空间中工作,而不必关心物理内存的实际分布。
2.7.3 工作机制
操作系统和硬件(如 内存管理单元,MMU,Memory Management Unit
)协同工作,将虚拟地址
映射到物理地址
。常见的机制包括:
- 分页:将
虚拟地址空间
划分为固定大小的页(Page)
,并将这些页映射到物理内存
中的页框(Page Frame)
。 - 分段:将
虚拟地址空间
划分为不同大小的段(Segment)
,每个段独立映射到物理内存
。
这些机制使得操作系统可以灵活地管理内存,提高内存使用效率,同时确保系统的安全和稳定。
2.8 数据从内存传输到寄存器的基本过程
- CPU请求数据
当CPU需要执行一条指令(例如从内存读取数据),它会通过地址总线
(用于传输内存地址) 将所需的数据地址发送到内存控制器
,比如DDRC, DDR Controller
。 内存控制器
接收到地址信息后,负责从内存
中读取相应的数据。这通常涉及以下几个步骤:- 地址译码:
内存控制器
会对接收到的地址进行译码,以确定需要访问的具体内存单元
。 - 数据读取:一旦找到相应的
内存单元
,内存控制器
会将数据从内存
中读取出来。
- 地址译码:
- 数据传输到CPU
缓存
(可选)
在现代计算机系统中,内存和CPU之间通常有一层或多层高速缓存(Cache)。从内存读取的数据首先会被传输到缓存中。缓存有多个级别(L1、L2、L3等),每一级缓存的访问速度和容量不同。缓存的目的是加速数据访问。 - 数据传输到
寄存器
最后,缓存
中的数据通过数据总线
(用于传输实际的数据内容)传输到CPU中的寄存器
中。寄存器
是CPU中最小但最快的存储单元,CPU可以直接对寄存器
中的数据进行操作。
上面描述的详细步骤:
- 指令取出(Fetch)
- CPU执行指令周期的第一步是从内存中取出指令。程序计数器(PC)中的地址指向当前指令所在的内存地址。
- CPU通过
地址总线
将PC中的地址发送给内存控制器。
- 指令解码(Decode)
- 取回的指令被解码,以确定需要执行的操作和操作数的位置。
- 如果指令需要从
内存
读取数据(如加载指令),指令解码单元将产生相应的内存地址。
- 执行(Execute)
- CPU将解码得到的内存地址发送到内存控制器,通过地址总线传递。
- 内存控制器将数据从指定的内存地址读取出来。
- 数据传输
- 读取的数据首先可能进入缓存(如果缓存命中)。
- 最终,数据通过
数据总线
传输到CPU中的特定寄存器。
示例:
举个具体的例子,假设 CPU 执行一条 MOV A, [B]
指令,即将内存地址
B处的数据移动到寄存器
A中:
- CPU将B的值通过
地址总线
发送到内存控制器
。 内存控制器
读取地址B处的数据,返回给CPU。- 数据先经过
缓存
(如果命中缓存)。 - 最终,数据通过
数据总线
传输到寄存器
A。