相信大家一定都用过各种存储技术,比如mysql,mongodb,redis,mq等,这些存储服务性能有非常大的区别,其中之一就是底层使用的存储设备不同。作为一个程序员,你需要理解存储器的层次结构,这样才能对程序的性能差别了然于心。今天带大家了解下计算机系统存储器的层次结构。
存储技术
首先了解下什么是存储器系统?
实质上就是一个具有不同容量、成本和访问时间的存储设备的层次结构。从快到慢依次为:CPU寄存器、高速缓存、主存、磁盘;
这里给大家介绍一组数据,让大家有一个更清晰的认识:
如果数据存储在CPU寄存器,需要0个时钟周期就能访问到,存储在高速缓存中需要4~75个时钟周期。如果存储在主存需要上百个周期,而如果存储在磁盘上,大约需要几千万个周期! — 出自 CSAPP
接下来一起深入了解下计算机系统涉及的几个存储设备:
随机访问存储器
随机访问存储器(RAM)分为静态RAM (SRAM) 和动态RAM(DRAM)。SRAM的速度更快,但也贵很多,一般不会超过几兆字节,通常用来做告诉缓存存储器。DRAM就是就是我们常说的主存。
访问主存
数据流是通过操作系统中的总线的共享电子电路在处理器和DRAM之间来来回回。每次CPU和主存之间的数据传送都是通过一系列复杂的步骤完成,这些步骤成为总线事务。读事务是将主存传送数据到CPU。写事务从CPU传送数据到主存。
总线是一组并行的导线,能携带地址、数据和控制信号。下图展示了CPU芯片是如何与主存DRAM连接的。
那么我们在加载数据和存储数据时,CPU和主存到底是怎样交互实现的呢?
首先来看一个基本指令,加载内存数据到CPU寄存器中:
movq A,%rax
将地址A的内容加载到寄存器%rax中,这个命令会使CPU芯片上称为总线接口(bus interface)的电路在总线上发起读事务,具体分为三个步骤:
CPU将地址A放到系统总线上,I/O桥将信号传递到内存总线。详情看下下图a
主存感觉到内存总线上的地址信号,从内存总线读地址,从DRA