如果你自己组装过PC机,你肯定知道,想要CPU,我们只要买一个就好了,但是存储器,却有不同的设备要买。
- 比如,要买内存、硬盘。
- 买硬盘的时候,可能会买一块SSD作为系统盘,一块大容量的HDD机械硬件作为数据盘。
- 内存和硬件都是我们的存储设备
- 而且,像硬盘这样的持久化存储设备,同时也是一个IO设备
在计算机系统中,我们通常把数据存储在计算机里面的存储器中。而存储器系统是一个通过各种不同的方法和设备,一层一层的组合起来的系统。
存储器的层次结构
-
由于CPU执行时间比CPU读取指令的时间快得多,而且各个部件之间的读取速度不一样,所以CPU的存储器系统采用了一种分层次的结构。
-
最上层是寄存器
- 我们常常把 CPU 比喻成计算机的“大脑”。我们思考的东西,就好比 CPU 中的寄存器**(Register)**。
- 寄存器与其说是存储器,其实它更像是 CPU 本身的一部分。寄存器其实是CPU内部的元件,用和CPU一样的材料制成,和CPU一样快
- 寄存器是CPU运算时取指令和数据的地方,速度很快,寄存器可以用来暂存指令、数据和地址
- 在CPU中,通常有通用寄存器,如指令寄存器IR;特殊功能寄存器,如程序计数器PC、sp等。
-
然后是高速缓存(Cache)
- CPU Cache(CPU 高速缓存,我们常常简称为“缓存”)。它是用来暂时存放内存中的数据(相当于大脑中的记忆)
- 高速缓存是内存的部分拷贝,如果寄存器要取内存中的一部分数据时,可直接从缓存中取到,这样可以调高速度。
- CPU Cache 用的是一种叫作SRAM(Static Random-Access Memory,静态随机存取存储器)的芯片。
-
在下面是主存:
- 主存一般就是RAM,是内存系统的主力军,就是我们说的内存。
- 内存负责存储CPU中运行的程序和数据
- 断电内存数据会丢失。
-
最下层是磁盘
-
-
顶层的存储器速度最高,但是容量最小,成本非常高,层级结构越往下,其访问效率越慢,容量越大,造价越便宜。
内存
内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器:
- 读写存储器(RAM):它与ROM的最大区别是数据的易失性,即当机器关闭时,内存中的信息会 丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。又可以分为:
- 高速缓存(SRAM):用来制作CPU Cache
- 随机存储器(DRAM):用来制作内存
- 只读存储器(ROM):
- ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。
- 只读存储器的特点是只能读出而不能写入信息,通常在电脑主板的ROM里面固化一个基本输入/输出系统,称为BIOS(基本输入输出系统)。其主要作用是完成对系统的加电自检、系统中各功能模块的初始化、系统的基本输入/输出的驱动程序及引导操作系统。
高速缓存(cache)
是什么
-
缓存是CPU和内存之间的临时数据交换器,是为了解决CPU运行处理速度和内存读写速度不匹配而设计的
-
Cache位于内存和 CPU 之间,是一个读写速度比内存更快
- 当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。
- 当 CPU 需要读取数据时,会直接从高速缓存中直接读取,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
-
Cache分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)
- 每个CPU核心都有一块属于自己的L1高速缓存:
- 通常分为两部分:
- 一个用于存数据,也就是L1d Cache(Data Cache,指令缓存)
- 另一个用于存指令,L1i Cache(Instruction Cache,数据缓存)。
- L1 Cache往往就嵌在CPU核心的内部
- L1缓存相对比较小,每部分差不多只有几十KB。
- 通常分为两部分:
- L2 Cache同样是每个CPU核心都有的,不过它往往不在CPU核心的内部。所以L2 Cache的访问速度会比L1稍微慢一点。
- L2一般是一个统一的缓存,不把数据和指令分开。
- L2缓存更大一些,有几百KB,速度要慢一些。
- L1 Cache和L2 Cache最大的不同在于是否存在延迟。访问L1 Cache没有延迟,L2 Cache会延迟1-2个时钟周期。
- L3 Cache,通常是多个CPU核心共用的,尺寸会更大一些,访问速度自然也更慢一些
- 在同一处理器上,所有核共享一个L3缓存。
- 每个CPU核心都有一块属于自己的L1高速缓存:
-
你可以把CPU中的L1 Cache理解为我们的短期记忆,L2/L3为长期记忆,把内存当初我们拥有的书架或者书桌。当我们的记忆中没有资料的时候,可以从书桌或书架上拿书来翻阅。这个过程就相当于,数据从内存中加载到CPU的寄存器和Cache,然后通过“大脑”,也就是CPU,进行处理和运算。
为什么要采用多级缓存,并逐级增加缓存的大小呢?
- 为了提高各级缓存的命中率,从而最大限度的降低直接访问内存的概率。
- 每一级缓存的命中率都很重要,尤其是L1的命中率。这是因为缓存的命中率对总体的访问时间延迟影响很大,而且下一级缓存的访问延迟往往是上一级延迟的很多倍。
由什么材料制作
CPU Cache 用的是一种叫作SRAM(Static Random-Access Memory,静态随机存取存储器)的芯片。
- 高速缓存(SRAM):
- SRAM 之所以被称为“静态”存储器,是因为只要处在通电状态,里面的数据就可以保持存在。而一旦断电,里面的数据就会丢失了。
- 在 SRAM 里面,一个比特的数据,需要 6~8个晶体管。所以 SRAM 的存储密度不高。
- 同样的物理空间下,能够存储的数据有限。
- 不过,因为 SRAM 的电路简单,所以访问速度非常快
- SRAM 速度非常快,但是也很贵,所以只在很苛刻的地方使用,比如CPU cache
主存(RAM)
是什么
- 也叫主存。它就是我们常说的内存
- 内存是计算机中最重要的部件之一,它是程序和CPU进行沟通的桥梁。
- 它是与CPU直接交换数据的内部存储器, 计算机中的所有运行的运行都是在内存中进行的
- 它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。
- 它可以存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据
- 只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。
由什么材料制作
- 内存用的芯片和 Cache 有所不同,它用的是一种叫作DRAM(Dynamic Random Access Memory,动态随机存取存储器)的芯片,比起 SRAM 来说,它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少。
- DRAM 被称为“动态”存储器,是因为DRAM需要靠不断的“刷新”,才能保持数据被存储起来。
- DRAM的一个比特,只需要一个晶体管和一个电容就能存储。
- 所以,DRAM在同样的物理空间下,能够存储的数据也就更多,也就是存储的“密度”更大。
- 但是,因为数据时存储在电容中的,电容会不断漏电,所以需要定时刷新充电,才能保持数据不丢失。
- DRAM的数据访问电路和刷新电路都比SRAM要复杂,所以访问时延也就更长。
- DRAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。
严格的说,
- 内存包括主存(内存条,基于DRAM)与高速缓存(Cache,基于SRAM)两部分。
- 可能是由于Cache相较内存条容量很小,毕竟内存容量只计内存条大小,加上重要性也不及内存条,一般人或许不知道Cache,所以就忽略了高速缓存Cache,直接将主存–内存条等同了内存吧
存储(HHD、SDD)
我们常说的存储有HDD(机械硬盘)、SSD(固态硬盘)
- 狭义的存储往往是硬件,比如磁盘、磁带还有固态硬盘。而广义上的存储系统还包括基于物理的存储系统,比如SAN(Storage Area Network,存储区域网络)和NAS存储(Network Attached Storage,网络接入存储)
- 各种存储系统各有优缺点,尤其是性能和成本,我们要根据不同弄得需求,选择最合适的存储
具体可以参考这里
小结:层次结构
从Cache、内存、到SSD和HDD硬盘,一台现代计算机中,就用上了所有这些存储器设备。
- 其中,容量越小的设备速度就越快
- 而且,CPU并不是直接和每一种存储器设备打交道,而是每一种存储器设备,都只和它相邻的存储设备打交道。
- 比如,CPU Cache是从内存里加载来的,或者需要写回内存,并不会直接写回数据到硬盘,也不会直接从硬盘加载数据到CPU Cache,而是先加载到内存,然后从内存中加载到Cache。
这样,各个存储器只和相邻的一层存储器设备打交道,并且随着一层层向下,存储器的容量逐层增大,访问速度逐层变慢,而单位存储成本也逐层下降,也就构成了我们常说的存储器层次结构
使用存储器的时候,该如何权衡价格和性能?
存储器在不同层级之间的性能差异和价格差异,都至少在一个数量级以上。L1 Cache 的访问延时是 1 纳秒(ns),而内存就已经是 100 纳秒了。在价格上,这两者也差出了 400倍。比如:
因为这个价格和性能的差异,你会看到,我们实际在进行电脑硬件配置的时候,会去组合配置各种存储设备。
磁盘 VS 内存 VS 寄存器
寄存器 VS 内存
寄存器的工作方式很简单,只有两步:
- (1)找到相关的位
- (2)读取这些位。
内存的工作方式就要复杂得多:
- (1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)
- (2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。
- (3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。
- (4)确定数据在哪一个内存块(chunk)上,从该块读取数据。
- (5)数据先送回内存控制器,再送回CPU,然后开始使用。
内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。
为了缓解寄存器与内存之间的巨大速度差异,硬件设计师做出了许多努力,包括在CPU内部设置缓存、优化CPU工作方式,尽量一次性从内存读取指令所要用到的全部数据等等。
磁盘和内存的区别
- 磁盘和内存都具有存储功能,它们都是存储设备。区别在于:
- 内存时通过
电流
来实现存储(这就是为什么断电数据会丢失的原因), 磁盘则是通过磁记录技术
来实现存储的; - 内存高速但是贵,磁盘慢但是便宜;
- 电脑断电后,内存中的数据会丢失,磁盘不会;
- 内存是内部存储设备,磁盘是外部存储设备
- 内存时通过
- 为什么程序必须读入内存才能CPU运行,而不是直接从磁盘中读取呢?
- CPU中的程序计数器是通过指定内存地址而读出程序指令的
- 从内存中读取数据比从磁盘中读取数据要快得多。
磁盘与内存的合作
磁盘缓存
每次内存从磁盘中读取数据,必然会读到相同的内容,我们可以在内存中开辟一段空间,当作假想磁盘,每次想要访问磁盘中的数据时,先访问这段空间,如果这段空间找不到,才到磁盘中读取,这段空间就叫做磁盘缓存
虚拟内存
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,OS中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。这种机制使得期望运行大于物理内存的程序成为可能
虚拟内存机制需要快速的映像内存地址,以便把程序生成的地址转换成有关字节在RAM中的物理地址。这种映像由CPU中的一个部件,称为存储器管理单元MMU来完成
缓存和MMU的出现对系统的性能由重要的影响。从一个程序切换回另一个程序,有时也称为上下文切换。但这两种操作很昂贵,所以应该努力避免这些操作
虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。
覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory)。虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割,有内存管理单元MMU来完成