【硬件科普】ECC内存是如何发现错误并纠正的?

【硬件科普】ECC内存是如何发现错误并纠正的?

电磁干扰会导致内存在和CPU交互数据时发生比特翻转,使某个0变成1或某个1变成0,如果比特翻转发生在重要的系统或驱动数据上时,就会导致电脑死机

对于服务器而言宕机会造成巨大的损失,因此服务器往往会使用稳定性更高的ECC内存,其能够主动发现数据传输过程中出现的错误,并将错误纠正

奇偶校验:通过给原始bit的开头增加一位纠错码,当原始数据中1的个数为偶数时,纠错码就是0,当原始数据中1的个数为奇数时,纠错码就是1,总之保证原始数据+纠错码中1的个数恒定是1,当接收方接收到数据后,发现收到的所有数据中1的个数为偶数,就说明数据正确,如果是奇数就说明数据发生了错误

奇偶校验的纠错码保护的是原始数据+纠错码的整体的正确性,因此即使纠错码发生比特翻转也是可以被发现的

奇偶校验只能单纯的知道数据发生了错误,发现错误后就必须等待发送方重新发送,并且当数据同时发生两位的比特翻转,也是无法发现的

汉明码:通过奇偶校验判断数据中是否存在错误,再通过数据间的一定的交集和排除,确定错误数据所在的位置

计算机中分组最直接的方式就是二分法,因此汉明码也就是通过二分法将数据进行分组后,判断错误究竟在二分法的哪一区间,汉明码的纠错码会分布在2^n的位置上

汉明码可以定位一位错误的情况并修正,对于两位错误则可以发现但无法定位,对于三位错误则无能为力,但三位错误出现的可能性很低

原始数据越大的块中汉明码的纠错码占比就越少(二分法的原因),但块过大同时出现多个错误的概率也越高,常见的ECC内存在传输数据时块大小为72bit,其中原始数据64bit

汉明码的实现需要占用额外的数据空间存放纠错码,因此ECC内存在实现相同内存大小前提下,会需要更多的内存颗粒,或者是显卡在开启ECC显存后,显存的可用容量就会降低

汉明码的电路实现非常简单,性能开销非常小,加了ECC后的内存性能也只会降低2%~3%左右,因此其被广泛应用于内存纠错上,而不是使用EDPC纠错码(被广泛应用于SATA和NVME硬盘)