内存(Memory)

      内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。 内存是由内存芯片、电路板、金手指等部分组成的。

内存(Memory)_第1张图片

首先介绍一下关于内存的一下概念性的东西:

 

CHANNEL:双通道,使内存的带宽增加一倍,数据存取速度也相应增加一倍(理论上)。(内存的带宽决定“桥梁”的宽窄) 内存通道独立,CPU可分别寻址、读取数据。

内存(Memory)_第2张图片

 

BANK:Memory chip中的存储单元,假如是X4的话有一个存储单元里面有四个bit数据, Bank,Row,column 组成了内存中cell的定位坐标。

内存(Memory)_第3张图片

RANK:CPU每次会从cache里面读取64bit的数据,内存控制器从内存读取的也是64bit的数据,这是大佬规定好的。

对于X4的话,那我们就需要16颗芯片。为了组成所需的位宽(64bit ),就需要多颗芯片颗粒并联工作,那么这一个64bit的数据芯片的集合就是一个内存条的Rank。对于X4颗粒, 需要16(64/4)颗芯片颗粒

 

关于SRAM和DRAM,之前也写过一下:https://mp.csdn.net/postedit/83007445

SRAM:大概理解为MEMORY

DRAM:大概理解为CACHE

CACHE:高速缓冲存储器,其作用是为了更好的利用局部性原理,减少CPU访问主存的次数。CPU是不会直接去访问内存的,都是通过cache间接访问主存, 每次需要访问主存时, 遍历一遍全部cache line(固定为64bit), 查找主存的地址是否在某个cache line中. 如果cache中没有找到, 则分配一个新的cache entry, 把主存的内存copy到cache line中, 再从cache line中读取.

cache entry包含:

 1) cache line

2) tag : 标记cache line对应的主存的地址

3) flag : 标记当前cache line是否invalid, 如果是数据cache, 还有是否dirty

 

回写策略:cache中的数据更新后,需要回写到主存, 回写的时机有:      

1) 每次更新都回写. write-through cache

2) 更新后不回写,标记为dirty, 仅当cache entry被evict(驱赶)时才回写

3) 更新后, 把cache entry送如回写队列, 待队列收集到多个entry时批量回写.

cache一致性问题 有两种情况可能导致cache中的数据过期

1) DMA, 有其他设备直接更新主存的数据

2) SMP, 同一个cache line存在多个CPU各自的cache中. 其中一个CPU对其进行了更新.

 

SPD(SerialPresenceDetect串行存在探测)

 1个8针的SOIC封装(3mm*4mm)256字 EEPROM 芯片。记录了诸如内存的速度、容量、电压与行、列地址带宽等参数信息。当开机时PC的BIOS将自动读取SPD中记录的信息,如果没有SPD,就容易出现死机或致命错误的现象。

 

SPD的内容一般由内存模组制造商写入。实际上,SPD的有效信息只用了128个字节,一般的一个字节至少对应一种参数,有的参数需要多个字节来表述(如产品序列号,生产商在DEDEC组织中的代码)。

内存(Memory)_第4张图片

ECC内存:Error Checking and Correction即应用了能够实现错误检查和纠正技术(ECC)的内存条。

 

有没有发现这照片里面是十九块大的芯片,其中中间的一块是内存控制器,那么剩下十八块是什么呢?不是只需要十六块吗?

其中十六块是我们上面所说的十六颗芯片,剩下两块呢?

有没有想过为什么要用16颗芯片,而不用一块芯片,这样不就节省空间吗?

当使用一颗芯片的时候,芯片坏了,就直接凉了。然后当我们使用16颗芯片的时候,当有一块坏了,我们可以使用一颗ECC芯片对数据进行纠错和恢复。再坏一颗,那就再算一次。

 

奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。

 

Parity Check是通过在原来数据位的基础上增加一个数据位来检查当前8位数据的正确性,但随着数据位的增加Parity用来检验的数据位也成倍增加,就是说当数据位为16位时它需要增加2位用于检查,当数据位为32位时则需增加4位,依此类推。

 

ECC(错误检查和纠正),这种技术也是在原来的数据位上外加校验位来实现的。不同的是两者增加的方法不一样,这也就导致了两者的主要功能不太一样。它与Parity不同的是如果数据位是8位,则需要增加5位来进行ECC错误检查和纠正,数据位每增加一倍,ECC只增加一位检验位,也就是说当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。

 

总之,在内存中ECC能够容许错误,并可以将错误更正,使系统得以持续正常的操作,不致因错误而中断,且ECC具有比Parity更先进的自动识别、更正的能力,可以将Parity无法检查出来的错误位查出并将错误修正。

 

你可能感兴趣的:(基础知识,回写策略,ECC,内存,Cache,内存的概念)