存储器


0x00.概述

存储器分类

存储器是计算机系统中的记忆设备,用来存放程序和数据。


存储器根据不同的方面可以不同的分类

资源路径有问题

存储器层次结构

存储器有3个主要性能指标:速度容量每位价格(位价),下图形象地反应了三者关系。

由上至下,位价越来越低,速度越来越慢,容量越来越大,CPU访问的频度也越来越少(注意是位价而不是总价格,容量越大总价格一定会更贵的,只是平摊下来的位价降低了)。

资源路径有问题

简单说一下:

  • 寄存器:寄存器通常都制作在CPU芯片内,寄存器中的数直接在CPU内部参与运算,CPU内部可以有十几个、几十个寄存器。
  • 主存用来存放将要参与运行的程序和数据,其速度与CPU速度差距较大,为了使他们更好的匹配,在主存与CPU之间插入了一种比主存速度快、容量更小的高速缓冲存储器Cache。
  • 磁盘、磁带属于辅助存储器,其容量会比主存大得多,大都用来存放暂时未使用到的程序和数据文件。CPU不能直接访问辅存,辅存只能与主存交换信息,因此辅存的速度可以比主存慢得多。

实际上,存储系统层次结构主要体现在 缓存-主存 和 主存-辅存 这两个存储层次上。

资源路径有问题

补充:
“主存-辅存”构成的整体,一般来说叫做虚拟存储器,对于虚拟存储器,我们有一个逻辑地址来方便程序员进行底层操作,这就是虚地址,即编写程序时大家用到的逻辑地址(程序或指令被装入到内存中由特定的机构将虚拟地址转换成物理内存单元中的地址再执行)。

“缓存-主存”构成的整体,一般来说使用主存的地址(实地址-物理地址),缓存一般是根据内容来进行查找的。


0x01.主存储器

概述

主存储器(主存)的基本组成如下图,根据MAR中的地址访问某个存储单元时,还需要经过地址译码、驱动等电路,才能找到所需访问的单元

  • 读出时,需经过读出放大器,才能将被选中单元的存储字送到MDR。

  • 写入时,MDR中的数据也必须经过写入电路才能真正写入到被选中的单元中

    资源路径有问题

    MDR: memory data register主存数据寄存器
    MAR: memory address register主存版地址寄存器

现代计算机的主存都由半导体集成电路构成,图中的驱动器、译码器和读写电路均制作在存储芯片中,而MDR和MAR制作在CPU芯片内(寄存器制作在芯片内)。
存储芯片和CPU芯片可通过总线连接:

  • 数据总线
  • 控制总线
  • 地址总线

资源路径有问题

从存储器读出一段信息 流程:

  1. CPU将该字的地址送到MAR,经地址总线送至主存,然后发出读命令
  2. 主存接到命令后,得知需将该地址单元的内容读出
  3. 将该单元的内容读至数据总线上

向主存存入一个信息字 流程:

  1. CPU将该字所在的主存单元的地址经MAR送到地址总线,并将信息字送入MDR
  2. 向主存发出写命令
  3. 主存收到写命令后,便将数据线上的信息写入到对应地址线指出的主存单元中

地址分配

主存中各存储单元的空间位置是由单元地址号来表示的。

地址总线用来指出存储单元地址号的,根据地址可以读/写一个存储字。

为了满足字符处理的需要,常用8位二进制表示一个字节,因此存储字长都取8的倍数。

通常计算机可以按字寻址,也可以按字节寻址。

  • 按字节寻址:将每一个字节看成一个独立的个体,例如字长32位(4个字节)的IBM370,对24位的地址线的主存而言,按字节寻址的范围就是 2^24/1B,最后的范围就是16M
  • 按字寻址: 将每一个字看成一个独立的个体,地址线会分配末n位来做字内寻址,其余m-n位做字寻址,例如字长32位(4个字节)的IBM370,对24位的地址线的主存而言,需要2跟线(四种变化)来做字内寻址,其余22位地址线做字寻址,故字寻址范围是 2^22=4M

资源路径有问题
图中,存储12345678H(0001 0010 0011……)分为在主存中分为大端和小端两种方式,其中大端就是将数据的高位字节(例如本例12:00010010)作为字地址;小端则正好相反,将低位字节地址(例如本例78:01111000)作为字地址。

图中,下面是一个寻址示例,24根地址线,故按字节可以寻址16MB,如果按16位的字(两个字节),则需要1根地址线做字内寻址,剩下的23根做字寻址,故最后是8MW,字长32位同理。
MW意为兆word,word即“字”的单位。

技术指标

主存的主要技术指标是存储容量存储速度

存储容量

存储容量是指主存能存放的二进制代码的总位数:

存储容量=存储单元数*存储字长

按字节总数来表示:存储容量=存储单元数*存储字长/8
现在计算机的存储容量大多按字节数来表示

存储速度

存储速度是由存取时间和存取周期来表示的

  • 存取时间:存储器的访问时间
    • 读出时间
    • 写入时间
  • 存取周期:连续两次独立的存储器操作,读/写所需的最小间隔时间

    因为具有一个恢复时间的原因,存取周期一般是比存取时间要长

存储器带宽

与存取周期密切相关的指标为存储器带宽,它表示单位时间内存储器存取的信息量,单位可以用字/秒或位/秒表示。如存取周期为500ns,每个存取周期可以访问16位,则它的带宽为 32M位/秒。带宽是衡量数据传输率的重要指标。

半导体存储芯片

半导体存储芯片的基本结构

半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内集成具有记忆功能的存储矩阵、译码驱动电路、读/写电路等

译码驱动能把地址总线送来的地址信号翻译成对应存储单元的选择信号,该信号在读/写路的配合下完成对被选中单元的读/写操作。

读/写电路包括读出放大器和写入电路,用来完成读/写操作。

存储芯片通过地址总线、数据总线和控制总线与外部连接。

资源路径有问题

  • 地址线是单向输入的,其位数与芯片容量有关。
  • 数据线是双向的(有的芯片可用成对出现的数据线分别作为输入和输出),其位数与芯片可读出或写入的数据位数有关。数据线的位数与芯片容量有关。

地址线和数据线的位数共同反映存储芯片的容量。例如,地址线为10根,数据线为4根,则芯片容量为2^10*4=4K位,又比如地址线为14根,数据线为1根,则其容量为16K位(16K *1位)。

控制线主要有读/写控制线与片选线两种。不同芯片的读/写控制线和片选线可以不同。

读/写控制线决定芯片进行读/写操作,片选线用来选择存储芯片。

半导体存储器是由许多芯片组成的,为此需用片选信号来确定哪个芯片被选中。

  • 片选线:
    • CS(低电平有效)
    • CE(低电平有效)
  • 读写控制线:
    • WE(低电平写————高电平读)
    • OE(低电平有效)、WE(允许写)

片选线的作用示例,用16K *1位的存储芯片组成64k *8位的存储器:

  1. 使用8个16K*1位的存储芯片,同时用数据线读写相同地址的数据,即实现一个地址读写8个数据,这也就成为了16K *8位
  2. 使用四个这样的16K *8位(即一个芯片组),也就成了64K *8位
  3. 给每个16K *8位的芯片组的连接片选线,这样我们就可以控制采用哪一个芯片组了
  4. 划分地址第一组就是016K-1的地址范围、第二组就是16K32K-1的范围,以此类推。

    最后我们实践一下,例如我们要找地址为65535(64K-1,二的十六次方减一),即在第四芯片组,此时第四芯片组的片选信号有效(其他三个组无效),然后通过65535这个地址,取出8位信号,完美!
    资源路径有问题

半导体存储芯片的译码驱动方式

半导体存储芯片的译码驱动方式有两种:线选法和重合法

资源路径有问题

上图是一个16×8位线选法存储芯片的结构示意图。它的特点是用一根字选择线(字线),直接选中一个存储单元的各位(如一个字节)。这种方式结构较简单,但只适于容量不大的存储芯片。如当地址线A3A2A 1A0为1111时,则第15根字线被选中,对应上图中的最后一行八位代码便可直接读出(从芯片读出)或写入(给芯片写入)。

译码器:通过n个输入来选择一个输出,例如上图,就是A0~A3为0001,则字线1就会有效,其他线无效,完成了从编码向数据翻译的过程

线选法很好,但是在应对非常多的地址线的时候就太过庞大冗杂,芯片的集成度也很难做高

资源路径有问题

上图是一个1K×1位重合法结构示意图。显然,只要用64根选择线(X、Y两个方向各32根),便可选择32×32矩阵中的任一位。例如当地址线为全0时,译码输出X0和Y0有效,选中矩阵中的第0行、第0列对应位。由于被选单元是由X、Y两个方向的地址决定的,故称重合法。

用这种方法进行译码驱动,芯片的集成度就可以做的比较高

随机存取存储器(RAM)

随机存取存储器按其存储信息的原理不同,可分为静态RAM和动态RAM两大类。

存储器中用于寄存“0”和“1”代码的电路称为存储器的基本单元电路。

静态RAM(Static RAM,SRAM)

由于静态RAM是用触发器工作原理存储信息(静态RAM使用双稳态触发器保存“0”“1”),因此即使信息读出后,它仍然保持其原状态,不需要再生。但电源掉电时,原存信息丢失,故它属易失性半导体存储器。

基本工作框架图:
资源路径有问题

资源路径有问题

示例:Intel 2114 RAM 矩阵(64*64)读
资源路径有问题

CS为片选信号(低电平有效).

WE为写允许信号(低电平为写).

Vcc为电源端.

GND为接地端.

这个矩阵牛逼之处在于每一次可以读/写四位,怎么实现的呢?类似于译码驱动中的重合法,但是列地址译码器给出的每一个结果都会导通四列,如图,列地址译码器一共会有16种结果(四根地址线),每一个结果会导通四列,我们对矩阵64列中分成四组,导通的四列分别存在于四组当中的对应位置;行地址译码器一共会有64种结果(6根地址线),每一个结果导通一行,这样下来,每一个10位地址就控制了4位的读/写。
读操作胜利图:
资源路径有问题

动态RAM(Dynamic RAM,SRAM)

动态RAM概述

常见的DRAM基本单元电路有三管式和单管式两种,与SRAM使用双稳态触发器才存储“0”“1”不同,DRAM靠电容存储电荷的原理来寄存信息(电容中有电则为1,无电则为0)。

电容上的电荷一般只能维持1~2ms,因此即使电源不掉电,信息也会自动消失。为此,必须在2ms内对其所有存储单元恢复一次原状态,这个过程称为再生或刷新。

资源路径有问题
三极管的栅极(短的那一边)为高电平时,另一边就可以上下导通

它与SRAM相比,具有集成度更高、功耗更低等特点,目前被各类计算机广泛使用。

动态RAM需要定时刷新,使用较复杂。

实际上,在每进行一次读出操作之前,必须对DRAM按排一次刷新,即先加一个预充电脉冲,然后进行读出操作。同时在不进行任何操作时,CPU也应该每隔一定时间对动态RAM进行一次补充充电(一般是2mS时间),以弥补电荷损失。

三管DRAM芯片示例:
通常排列成32*32的矩阵(译码驱动:重合法),每列都有一个刷新放大器(用来形成再生信息)和一个预充电管,芯片有10根地>址线,采用重合法选择基本单元电路。

单管DRAM芯片示例:
芯片内有时序电路,它受行地址选通RAS、列地址选通CAS以及写允许信号WE控制,参考单管动态RAM4116,人家可以利用行/列地址缓存器来保存地址信息,14根地址线分两次传送数据,实现了16根地址线的能力(16K)。

动态RAM时序

DRAM的行、列地址是分别传送的,因此分析其时序时,应特别注意RASCAS与地址的关系,即:

  • 先由RAS将行地址送入行地址缓存器,再由CAS将列地址送入列地址缓存器,因此CAS滞后于RAS的时间必须要超过其规定值。即不管是写时序还是读时序,都要先行地址选通、再列地址选通。
  • RASCAS正、负电平的宽度应大于规定值,以保证芯片内部正常工作。
  • 行地址对RAS的下降沿以及列地址对CAS的下降沿应有足够的地址建立时间和地址保持时间,以确定行、列地址能够准确写入芯片。

动态RAM的刷新

动态随机存储器需要刷新。

刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程,如果不再生,即不进行刷新,那么电容中的信息会慢慢消失,电会漏掉(原来的1,会变成0)。

由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问,不进行存储器的读/写操作,其存储单元内的原信息将会慢慢消失。为此,必须采用定时刷新的方法,它规定在一定时间内,对动态RAM的全部基本单元电路必做一次刷新,一般取2ms,这个时间称为刷新周期,又称为再生周期。刷新是一行行进行的,必须在刷新周期内,由专用的刷新电路来完成对基本单元电路的逐行刷新,才能保证动态RAM内的信息不丢失。通常有三种方式刷新:集中刷新、分散刷新、异步刷新

刷新和行地址有关、与列地址无关,即每次刷新都以行为单位。

  • 集中刷新

    规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻会停止读/写操作(称为死时间)。示例:对128*128矩阵的芯片进行刷新,若存取周期为0.5μs,刷新周期为2ms(即刷新周期是4000个存取周期),对128行进行集中刷新需要64μs,故1936μs进行正常的读/写/维持操作,然后64μs进行集中刷新(死时间,这段时间内不能进行读写操作),这样一个刷新周期就结束了。

  • 分散刷新

    分散刷新是指对每行存储单元的刷新分散到每个存取周期来完成。在集中刷新中,一个存取周期就是一个存储周期,要么读/写/维持,要么用于刷新,而在分散刷新中则不是这样,分散刷新中每个存取周期会分成两段,前半段用于读/写/维持,后半段则是用于刷新,这样平均分摊下来。示例:128*128的矩阵存储芯片,若读/写/存储周期为0.5μs,即前半段为0.5μs,后半段0.5μs用于刷新,则整个存取周期为1μs,则128行刷新下来只需要128μs,这比允许的间隔2ms要小的多,而且也不存在死时间,但存取周期长了,芯片性能下降了,整个系统速度就降低了。

  • 异步刷新

    异步刷新是前两种方式的结合,它既可缩短“死时间”,又充分利用最大刷新间隔为2ms的特点。例如,对于存取周期为0.5μs,排列成128*128的存储芯片,可采取2ms内对128行各刷新一遍,即每隔15.6μs(2000/128)刷新一行,15μs用于读/写/维持,最后一个0.5μs的存取周期用于刷新,这样,刷新一行只停止一个存取周期,但对每行来说,刷新间隔时间仍为2ms,而死时间缩短为0.5μs。

每一行的刷新需要一个存储周期,上面三种情况都是这样

静态RAM与动态RAM的比较

目前,动态RAM的应用比静态RAM要广泛的多。

原因如下:

  1. 在同样大小的芯片中,动态RAM的集成度远高于静态RAM,如动态RAM的基本单元电路为一个MOS管,静态RAM的基本单元电路可为4~6个MOS管
  2. 动态RAM行、列地址按先后顺序传送,减少了芯片引脚,封装尺寸也减少
  3. 动态RAM的功耗比静态RAM小
  4. 动态RAM的价格比静态RAM的价格便宜。当采用同一档次的实现技术时,动态RAM的容量大约是静态RAM容量的48倍,静态RAM的存取周期比动态RAM的存取周期快816倍,但价格也贵8~16倍。

动态RAM的缺点:

  1. 由于使用动态元件(电容),因此它的速度比静态RAM低
  2. 动态RAM需要再生,故需配置再生电路,也需要消耗一部分的功率。通常,容量不大的高速缓冲存储器大多用静态RAM实现。

资源路径有问题
芯片引脚:信号线(地址线和数据线)的末端

只读存储器(ROM)

只读存储器,通常用来保存系统程序、系统配置信息。

按ROM的原始定义,一旦注入原始信息即不能改变,但随着用户的需要,总希望能任意修改ROM内的信息,这便出现了PROM、EPROM、EEPROM等。

对半导体ROM而言,基本器件为两种:MOS型和TTL型。

掩模ROM(MROM)

最原始的ROM,Only Read,Not Write,只读不可写

资源路径有问题

MOS:Metal-Oxide-Semiconducto,半导体金属氧化物

示例MOS型掩模ROM,其容量为1KX1位,半导体芯片的译码驱动方式采用的是重合法驱动,行列地址线分别经行、列译码器,各有32根行选择线和列选择线。行选择线和列选择线交叉处既有耦合元件MOS管,也可没有。用行列交叉处是否有耦合元件MOS管,则可以区分原存“1”还是存“0”(有则为1,无则为0)。

PROM(一次可编程ROM)

可以进行一次编程,破坏性的修改ROM,仅能编辑一次

资源路径有问题

单路电路下,那个熔丝是否被烧断就是决定这个单元电路是0,还是1。用户在使用前,可按需要将信息存入行、列交叉的耦合元件内,若要存0,则置耦合电路一个大电流,将熔丝烧掉;若要存1,则不置耦合电路大电流,让熔丝不要被烧掉。

资源路径有问题

半导体译码驱动方式仍是重合法,通过判断耦合电路中熔丝是否被烧掉来读出1或0。

因为已断的熔丝无法修复,所以这个ROM 只能一次编程。

EPROM(可擦拭可编程ROM)

EPROM是一种可擦除可编程只读存储器。它可以由用户对其所存信息作任意的修改,目前使用的较多的EPROM是由浮动栅雪崩注入型MOS管构成,又称FAMOS型EPROM。

EPROM有两种改写方法:

  1. 紫外线照射,但是擦除的时间比较长,而且不能对个别需改动的单元进行单独擦除或者重写
  2. 电气方法将存储内容擦除,再重写。甚至在联机条件下,用字擦除方式或页擦除方式,既可局部擦写,又可全部擦写,这种EPROM就是EEPROM。

EEPROM(多次性ROM)

  • 电可擦写
  • 局部擦写
  • 全部擦写

Flash Memory(闪速存储器,也称快擦型存储器)

这是在EPROM和EEPROM工艺基础上产生的一种新型的、具有性能价格比更好、可靠性更好的可擦写非易失性存储器,既有EPROM的价格便宜、集成度高的优点,又有EEPROM电可擦除重写的特性。
它具有整片擦除的特点,其擦除、重写的速度快,已经具备了RAM的功能,可与CPU直接进行连接。

另外,它还具有高速编程的特点。
在需要周期性地修改存储信息的应用场合,闪速存储器是一个极为理想的器件,因为它至少可以擦写/编程10000次,这足以满足用户的需要。它比较适合于作为一种高密度、非易失的数据采集和存储器件。在便携式计算机、工控系统及单片机系统中得到大量应用,近年来已将它用于微型计算机中存放输 入输出驱动程序和参数等。
非易失性、长期反复使用的大容量闪速存储器还可以替代磁盘。

存储器与CPU的连接

CPU执行的指令、需要的数据,都保存在主存储器当中,运行结果也需要保存在主存储器当中,因此必须实现CPU和主存储器的正确的连接。

存储容量的扩展

通常,CPU的地址线条数比较多、寻址空间范围很大,由于单片存储芯片的容量总是有限的,很难满足实际的需要,因此,必须将若干存储芯片连在一起才能组成足够容器的存储器,称为存储容量的扩展,通常有字扩展和位扩展。

16KX1位 的意思就是有16个字供选择,每一个选择可以筛出来1位的数据,所以芯片总容量就是16K位

  • 位扩展(增加存储字长)
    位扩展指的是用多个存储器器件对字长进行扩充,指的是用多个存储器器件对字长进行扩充,如用2个16KX4位芯片组成16KX8位的存储器。

    位扩展的连接方式是将多片存储器的地址、片选CS、读写控制端R/W相应并联,数据端分别引出,如下图,这样既给出一个地址,就可以读取多位数据了,另外片选线、读/写控制线要求连在一起,这样就可以同时工作。

资源路径有问题

  • 字扩展
    字扩展指的是增加存储器中字的数量。如用4个16KX8位芯片组成64KX8位存储器(增加地址线的寻址范围)。

    静态存储器进行字扩展时,将各芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。

    连接方式:数据线D0~D7与各片的数据端相连,地址总线低位地址A0~A13与各芯片的14位地址端相连,而两位高位地址A14、A15经过译码器和4个片选端相连。

简单地说就是拿出几根地址线,利用他们来进行片选芯片,剩下的地址线在选到的芯片里找地址即可
资源路径有问题

  • 字位扩展
    字、位扩展是指既增加存储字的数量、又增加存储字长。

资源路径有问题
每两个小芯片为一组,组内进行位扩,然后组之间进行字扩

存储器与CPU的连接

存储芯片与CPU芯片相连时,要特别注意片与片之间的地址线、数据线和控制线的连接。

  1. 地址线的连接 存储芯片的容量不同,其地址线数也不同,CPU的地址线数往往比存储芯片的地址线数多。通常总是将CPU地址线的低位与存储芯片的地址线相连。CPU地址线的高位或在存储芯片扩充时用;或做其他用途,如片选信号等。

  2. 数据线的连接 CPU的数据线与存储芯片的数据线数也不一定相等。此时,必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。

  3. 读/写命令线的连接 CPU读/写命令线一般可直接与存储芯片的读/写控制端相连,通常为高电平为读,低电平为写。有些CPU的读/写命令线是分开的,此时CPU的读命令线应与存储芯片的允许读控制端相连,而CPU的写命令线则应与存储芯片的允许写控制端相连。

  4. 片选线的连接 片选线的连接是CPU与存储芯片正确工作的关键。存储器由许多存储芯片组成。哪一片被选中完全取决于该存储芯片的片选控制端CS是否能接收到来自CPU的片选有效信号。

  5. 合理选择存储芯片 合理选择存储芯片主要是指存储芯片类型(RAM或ROM)和数量的选择。通常选用ROM存放系统程序、标准子程序和各类常数等。RAM则是为了用户编程而设置的。此外,在考虑芯片数量时,要尽量使连线简单方便。

  6. 其他 时序、负载

存储器的校验

在计算机的运行中,由于种种原因致使数据在存储过程中可能出现差错,为了数据的正确性,我们需要对存储器进行校验。

代码检错规律

资源路径有问题

计算机代码中1位错的概率在出错情况中超过了百分之九十

编码的最小距离:任意两组合法代码之间二进制位数的最少差异
编码的纠错、检错能力与编码的最小距离有关。

由编码纠错理论得知,任何一种编码是否具有检测能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。

根据纠错理论可知:L-1=D+C,且D>=C。

即编码最小距离L越大,则其能检验的错误位D越大,纠正错误的位数C也越大,且纠错能力恒小于或等于检错能力。

例如,当编码最小距离L=3时,这种编码可视为最多能检错2位,或能检错1位,纠错1位。可见,倘若能在信息编码中增加若干位检测位,增大L(编码最小距离),则其检错和纠错能力会提高。

汉明码就是具有一位纠错能力的编码

汉明码的组成

设欲检测的二进制代码为n位,为使其具有纠错能力,需增添k位检测位,组成 n+k 位的代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数k应满足:2^k>=n+k+1,例如欲传递信息b4b3b2b1(n=4),则根据公式可以知道配置成汉明码需增添检测位k=3。

设n+k位代码自左向右依次编为第1、2、3、……、n+k位,而将k为检测位记作Ci,分别安插在n+k位代码的1、2、4、8、……、2^(k-1)位上。

这些检测位的位置设置是为了保证他们能分别承担n+k位信息中不同数位所组成的“小组”的奇偶校验任务,使检测位和它负责的小组中1的个数为奇数或者偶数(看你是奇数校验还是偶数校验)

  1. C1检测包含1、3、5、7、9、11、……
  2. C2检测包含2、3、6、7、10、11、……
  3. C4检测包含4、5、6、7、12、13、14、15、……

怎么分组?预先做的工作是,把表示位置的这个数,转化成二进制数。
也就是,

  • 第1个位置,变成第0001个位置;
  • 第2个位置,变成第0010个位置;
  • 第3个位置,变成第0011个位置;
  • 第4个位置,变成第0100个位置;
  • 第5个位置,变成第0101个位置;
  • 第6个位置,变成第0110个位置;

那么,规定来了,
凡是位置符合这种形式的,XXX1,归到P1;
凡是位置符合这种形式的,XX1X,归到P2;
凡是位置符合这种形式的,X1XX,归到P3;
凡是位置符合这种形式的,1XXX,归到P4;
那么显然各个校验码也被分到各个组里面去了
那么组分好了,校验码的值也就确定下来了。

例如我们这里有一个7位的数据

1 2 3 4 5 6 7
汉明码采用非划分的方式进行分组,目前一共七位,分成3组,每组有一个校验位,共包括四个数据位。 如下图所示,每一个圆圈就是一组,校验位分别是1、2、4(检验位要放在2^n位置上),通过交集求和可得不同组共有成员的位置:

资源路径有问题

其中,第一组就是1(校验位)、3、5、7位;第二组就是2(校验位)、3、6、7;第三组就是4(校验位)、5、6、7

我们以偶校验为例,在校验位的辅佐下,每一组中1的个数都保证了是偶数个。

我们用p3p2p1来代表三个组的校验结果,如果是000,则无差错;如果是001,则是第一组出现了差错,那么谁错了呢?第一组独有的位置错了,那么这个位置就是第1位(第3、5、7位都不是第一组独有的);如果是101.说明第一组错了,第三组错了,那么就是这两组共有的,而另外一组没有的,就是第5位,其他错误类似。是不是很妙~

新示例

欲传递信息b4b3b2b1(n=4),则根据公式可以知道配置成汉明码需增添检测位k=3。

且他们的位置安排如下

二进制序号 1 2 3 4 5 6 7
名称 C1 C2 b4 C3 b3 b2 b1

如果按照配偶原则来配置汉明码(即每一组中1的个数需要是偶数)

令b4b3b2b1=0101

故0101的汉明码应为C1C2b4C3b3b2b1=0100101

验证:C1所管组(1、3、5、7)为0、0、1、1,有2个1,2是偶数。C2、C3依次类推。
每一小组的这几位进行异或就可以得到P3P2P1,如果没有错,这里应该是000,即使有错也能精准找到哪里的错。

提高访存速度的措施

CPU速度再快,CPU运行时的指令要来自于内存、需要的数据要来自于内存、运行结果要保存到内存当中去,故CPU的速度需要受到主存的读取速度的影响,这个问题叫“存储墙”,是现在影响计算机性能的主要原因之一。

解决方式:

  • 采用高速器件
  • 采用层次结构 Cache-主存
  • 调整主存结构

Cache我们下一节会讲,我们这里主要聊一下“调整主存结构”的方式:

单体多字系统

资源路径有问题

比如说,CPU的字长是16位,存储器的存储字长可以设置成64位,CPU每一次访问存储器,都可以访问出4个机器字,这四个机器字,每一个都可以是一个机器指令,或者是长度为16的数据。
CPU一次将这四个字从存储器中取出放到寄存器中,下一次用的时候就可以直接从寄存器中取出数据了。
这种方法可以增加存储器的带宽。

但是,这种方法也有很不理想的问题,例如:

  1. CPU向存储器中写入信息的时候,如果信息是16位,那么其他48位也会被写入到给定的存储单元当中,造成给定的存储字有48位被修改掉。
  2. 如果我们的指令不是连续存储的,例如我们一次取出四条指令,第一条就是一个跳转指令(jmp),跳转到很远的地方,那么我们取出来的四条指令就只有第一条有用。

多体并行系统

高位交叉

资源路径有问题

高位交叉的策略类似于存储器芯片扩展中的字扩展,只能提高地址范围,不能提高访存速度。

应用:存储器容量的扩展。

低位交叉

我们这里来了解一下低位交叉(个体轮流编制)

资源路径有问题

在执行某个存储体的指令时,CPU还可以执行横向的下一个存储体的指令。

资源路径有问题

低位交叉的特点:

  • 在不改变存取周期的前提下,增加存储器的带宽
  • 流水式访问,充分利用总线(以四体为例,总线周期的前四分之一传输CPU与第一个存储体、中间四分之一传输CPU与第二个存储体)

应用:存储器带宽和访问速度的提高。

高性能存储芯片

SDRAM(同步DRAM)

在系统时钟的控制下进行读出和写入。
CPU无需等待。

RDRAM

由Rambus开发,主要解决存储器带宽问题。

带Cache的DRAM

在DRAM芯片内集成了一个由SRAM组成的Cache,有利于猝发式读取。


0x02.Cache高速缓冲存储器

概述

CPU需要的指令、数据全都保存在主存中,而CPU的速度随着科技的发展越来越快,主存却发展缓慢,这就造成了CPU的空等现象,CPU速度再快,也得等待主存处理数据。
Cache就是为了解决CPU的空等问题。

缓存:容量小、速度快
主存:容量大、速度慢

我们要依靠程序访问的局部性原理

Cache与主存的传输以“块”为交换信息的单位。

Cache工作原理

资源路径有问题

Cache上的标记是负责标记主存块和Cache块之间的对应关系,如果某个主存块被调用到Cache当中,那么主存块号会被存放在那个标记当中。当CPU访问的时候,它就会将Cache中将各个标记与自己被给出的主存块号进行比较,如果和某个标记正好相等且该Cache块有效,即该Cache块中就保存了CPU要访问的信息。

命中与未命中

如上图,主存有M块,缓存共有C块,且M>>C(M远远大于C)
故只能有部分的主存块被放在Cache中。

  • 命中:主存块调入缓存,CPU可以直接从缓存中获得数据,主存块与缓存快建立了对应关系。用标记记录与某缓存块建立了对应关系的主存块号。
  • 未命中:主存块未调入缓存,CPU需要和主存块读取数据。

一般每块取4~8个字,块长取一个存取周期内从主存调出的信息长度。

命中率

Cache的命中率:CPU欲访问的信息在Cache中的比率

计算公式:CPU访问存储器在Cache中访问到的次数/CPU在主存中找到的次数

Cache-主存系统的效率

效率e与命中率有关

e=访问Cache的时间/平均访问时间

设Cache命中率为h,命中时访问Cache的时间为t_c,未命中访问主存的时间为t_m:
e=t_c/(h * t_c+(1-h) * t_m)
该公式体现的是对Cache和主存的并行访问,即同时访问

Cache的基本结构

资源路径有问题

  • 地址映射变换机构
    地址映射变换机构是将CPU通过地址总线送来的主存地址转换为Cache的地址。由于由于主存和Cache的块大小相同,块内地址都是相对于块的起始地址的偏移量(即低位地址相同),因此地址变换主要是主存的块号(高位地址)与Cache块号间的转换。而地址变换又与主存地址以什么样的函数关系映射到Cache中(即地址映射)有关,我们马上就要学到了。
    如果转换后的Cache块已与CPU欲访问的主存块建立了对应关系,即已命中,则CPU可直接访问Cache存储体。如果转换后Cache块与CPU欲访问的主存块未建立对应关系,即未命中,此刻CPU在访问主存时,不仅将该字从主存取出,同时将它所在的主存块一并调入给Cache,供CPU使用。当然,此刻能够主存块调入Cache内,也是由于Cache原来处于未被装满的状态。反之,倘若Cache原来已被装满,即已无法将主存块调入Cache内时,就得采用替换策略。

  • 替换机构
    当Cache内容已满,无法接受来自主存块的信息时,就由Cache内的替换机构按一定的替换算法来确定应从Cache内移出哪个块返回主存,而把新的主存块调入Cache。
    特别需要指出的是,Cache对用户是透明的,即用户编程时所用的地址是主存地址,用户根本不知道这些主存块是否已调入Cache内。因为,将主存块调入Cache的任务全由机器硬件自动完成。

Cache的读/写操作

Cache的读操作

资源路径有问题

Cache的写操作

Cache的写操作不同于读操作,写操作需要去修改数据,故需要保证Cache和主存的内容一致性。

  • 写直达法(Write-through)
    写操作时数据既写入Cache又写入主存
    写操作时间就是访问主存的时间,Cache块退出时,不需要对主存执行写操作,更新策略比较容易实现。
  • 写回法(Write-back)
    写操作时只把数据写入Cache而不写入主存,当Cache数据被替换出去时才写回主存。
    这种方法不保证Cache与主存的实时一致,这样在多处理器的情况下,每个处理器都有自己的Cache,内存的一个块在各个处理器的Cache中的副本可能都不一致,这是并行计算机中主要研究的一个问题。

Cache的改进

增加Cache的级数

  • 片内(片载)Cache
  • 片外Cache

统一缓存和分立缓存

  • 指令Cache
  • 数据Cache

与指令执行的控制方式有关。

Cache与主存的地址映射

直接映射

资源路径有问题
主存地址高m位被分成两部分:低c位是指Cache的字块地址,高t位是指主存字块标记,它被记录在建立了对应关系的缓存块的“标记”位中。当缓存接到CPU送来的主存地址后,只需根据中间c位字段找到Cache字块1,然后根据字块1的“标记”是否与主存地址的高t位相符来判断,若符合且有效位为“1”(有效位用来识别Cache存储块中的数据是否有效,因为有时Cache中的数据是无效的,例如,在初始时刻Cache应该是“空”的,其中的内容是无意义的),表示该Cache块已和主存的某块建立了对应关系(命中),则可根据b位地址从Cache中取得信息;若不符合,或有效位为“0”(不命中),则主存读入新的字块来替代旧的字块,同时将信息送往CPU,并修改Cache“标记”。如果原来有效位为“0”,还得将有效位置置成“1”.

直接映射的缺点:不够灵活,因为每个主存块只能固定地对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。此外,如果程序恰好要重复访问对应同一缓存位置的不同主存块,就要不停地进行替换,从而降低命中率。

全相联映射

资源路径有问题
全相联映射则是主存字块可能映射到每一个Cache的字块上。
访问时,直接映射是指出一个Cache字块,然后该Cache字块的标记和我们的主存标记比较,全相联映射则是主存字块标记会比较每一个Cache字块标记,直到命中或者全部比较完未命中。

全相联映射的缺点:所需的逻辑电路复杂,成本高,速度慢。

组相联映射

组相联映射是上面两种方式的折中,我们将Cache分成组,每组有多个字块(2^n次方)。
资源路径有问题
将主存储器分组,每一组的相同序号的字块可以填入Cache对应的组中。
即某一主存块j按模Q映射到缓存的第i组的任一块。
主存字块标记会并行比较某一组中的n个字块。

这种方式Cache的利用率比较高,结构也可以接收,故是现代计算机经常使用的映射方式。

靠近CPU的Cache对速度要求高,就可以采用直接相连,或是组相连。距离CPU越远的Cache层次就可以采用全相联方式。

替换算法

替换算法:CPU访问Cache未命中的时候去从主存读取数据的时候,会把主存数据一起送给Cache,如果Cache已满,则需要替换Cache中的字块,替换的策略就是替换算法。

先进先出(FIFO)算法

最先被放入Cache中的字块,最先被替换掉。

但是这个算法其实有问题,即被替换的数据可能是一个CPU经常访问的数据,这个数据被替换的话就需要不断替换回来,造成大量的功能损耗,也不能很好的体现局部访问性原理。

近期最少使用(LRU)算法

这种算法会优先替换掉CPU不再用的块,或者是连续被CPU访问时间间隔最长的那个字块。

这种算法比较好的体现了比较好的程序局部性原理,应用也比较广。


0x03.辅助存储器

概述

辅助存储器的主要作用是保存数据、文档等资料
特点:它不能直接与CPU交换信息。

磁表面辅存技术指标

最常用的辅助存储器就是磁表面的辅助存储器
磁表面辅助存储器的一些技术指标:

  1. 记录密度
  2. 存储容量
  3. 平均寻址时间
  4. 数据传输率
  5. 误码率

硬磁盘存储器分类

硬磁盘存储器,也就是硬盘,是计算机系统中最主要的外存设备。

固定磁头和移动磁头

资源路径有问题

固定磁头需要在每一个磁道上头安置一个磁头,这种盘,虽然速度会比较快,但是开销也比较大。
我们常用的磁盘多是移动磁头。

可换盘和固定盘

现在多是固定盘,即不能随意取出的磁盘。

硬磁盘存储器结构

资源路径有问题

磁盘控制器

接收主机发来的命令,转换成磁盘驱动器的控制命令。
实现主机和驱动器之间的数据格式的转换。
控制磁盘驱动器读写。

总结:磁盘控制器是主机与磁盘驱动器之间的接口,对主机通过总线进行连接、对硬盘直接控制。

盘片

主要由硬质铝合金材料制成。

软磁盘存储器

软磁盘现在已经退出市场了,所以我们只简单了解一下硬盘和软盘的区别就可以了。

资源路径有问题

光盘存储器

采用光存储技术,利用激光进行写入和读出。

  • 第一代光存储技术:利用非磁性介质,不可擦写
  • 第二代光存储技术:利用磁性介质,可擦写
欢迎请我喝奶茶(*゜ェ゜*)
---这篇文章到头了---感谢您的阅读-------------