La memoria con código de corrección de errores (memoria ECC) es un tipo de almacenamiento de datos informáticos que utiliza un código de corrección de errores (ECC) para detectar y corregir la corrupción de datos de n bits que se produce en la memoria.
Normalmente, la memoria ECC mantiene un sistema de memoria inmune a errores de un solo bit: los datos que se leen de cada palabra son siempre los mismos que los datos que se habían escrito en ella, incluso si uno de los bits realmente almacenados ha cambiado al estado incorrecto. La mayoría de las memorias no ECC no pueden detectar errores, aunque algunas memorias no ECC con soporte de paridad permiten la detección pero no la corrección.
La memoria ECC se utiliza en la mayoría de los ordenadores donde la corrupción de datos no puede tolerarse, como aplicaciones de control industrial, bases de datos críticas y cachés de memoria de infraestructura.
Los códigos de corrección de errores protegen contra la corrupción de datos no detectada y se utilizan en ordenadores donde dicha corrupción es inaceptable, por ejemplo, en aplicaciones de cálculo científico y financiero, o en servidores de bases de datos y archivos. ECC también puede reducir el número de bloqueos en aplicaciones de servidor multiusuario y sistemas de máxima disponibilidad.
La interferencia eléctrica o magnética dentro de un sistema informático puede provocar que un solo bit de la memoria de acceso aleatorio dinámica (DRAM) cambie espontáneamente al estado opuesto. Inicialmente se pensó que esto se debía principalmente a las partículas alfa emitidas por contaminantes en el material de empaquetado de los chips, pero las investigaciones han demostrado que la mayoría de los errores blandos puntuales en los chips de DRAM se producen como resultado de la radiación de fondo, principalmente neutrones de secundarios de rayos cósmicos, que pueden cambiar el contenido de una o más celdas de memoria o interferir con la circuitería utilizada para leer o escribir en ellas. Por lo tanto, las tasas de error aumentan rápidamente con la altitud; por ejemplo, en comparación con el nivel del mar, la tasa de flujo de neutrones es 3,5 veces mayor a 1,5 km y 300 veces mayor a 10-12 km (la altitud de crucero de los aviones comerciales). Como resultado, los sistemas que operan a grandes altitudes requieren disposiciones especiales para la fiabilidad.
Como ejemplo, la nave espacial Cassini–Huygens, lanzada en 1997, contenía dos grabadores de vuelo idénticos, cada uno con 2,5 gigabits de memoria en forma de matrices de chips de DRAM comerciales. Debido a la funcionalidad EDAC incorporada, la telemetría de ingeniería de la nave informaba del número de errores de un solo bit por palabra (corregibles) y de errores de doble bit por palabra (incorregibles). Durante los primeros 2,5 años de vuelo, la nave informó de una tasa de error de un solo bit casi constante de unos 280 errores por día. Sin embargo, el 6 de noviembre de 1997, durante el primer mes en el espacio, el número de errores aumentó en más de un factor de cuatro en ese único día. Esto se atribuyó a un evento de partículas solares que había sido detectado por el satélite GOES 9.
Hubo cierta preocupación de que, a medida que la densidad de la DRAM aumentara aún más, y por tanto los componentes de los chips se hicieran más pequeños, mientras que las tensiones de funcionamiento siguieran disminuyendo, los chips de DRAM se vieran afectados por esta radiación con mayor frecuencia, ya que las partículas de menor energía podrían cambiar el estado de una celda de memoria. Por otro lado, las celdas más pequeñas son objetivos más pequeños, y los avances hacia tecnologías como SOI pueden hacer que las celdas individuales sean menos susceptibles, contrarrestando o incluso invirtiendo esta tendencia. Estudios recientes demuestran que las alteraciones de un solo evento debidas a la radiación cósmica han disminuido drásticamente con la geometría del proceso, y las preocupaciones anteriores sobre el aumento de las tasas de error de las celdas de bits no tienen fundamento.
Los trabajos publicados entre 2007 y 2009 mostraron tasas de error muy variables, con más de 7 órdenes de magnitud de diferencia, que van desde 10−10 error/(bit·h), aproximadamente un error de bit por hora por gigabyte de memoria, hasta 10−17 error/(bit·h), aproximadamente un error de bit por milenio por gigabyte de memoria. En la conferencia SIGMETRICS/Performance '09 se presentó un estudio a gran escala basado en el gran número de servidores de Google. La tasa de error real encontrada fue varios órdenes de magnitud superior a la de los estudios anteriores a pequeña escala o de laboratorio, con entre 25.000 (2,5×10−11 error/(bit·h)) y 70.000 (7,0×10−11 error/(bit·h), o 1 error de bit por gigabyte de RAM cada 1,8 horas) errores por cada mil millones de horas de dispositivo por megabit. Más del 8% de los módulos de memoria DIMM se vieron afectados por errores al año.
La consecuencia de un error de memoria depende del sistema. En sistemas sin ECC, un error puede provocar un bloqueo o una corrupción de datos; en sitios de producción a gran escala, los errores de memoria son una de las causas más comunes de fallos de hardware en las máquinas. Los errores de memoria pueden causar vulnerabilidades de seguridad. Un error de memoria puede no tener consecuencias si cambia un bit que no provoca un mal funcionamiento observable ni afecta a los datos utilizados en los cálculos o guardados. Un estudio de simulación de 2010 demostró que, para un navegador web, solo una pequeña fracción de los errores de memoria causaban corrupción de datos, aunque, como muchos errores de memoria son intermitentes y están correlacionados, los efectos de los errores de memoria eran mayores de lo que cabría esperar para errores blandos independientes.
Algunas pruebas concluyen que el aislamiento de las celdas de memoria DRAM puede ser sorteado por efectos secundarios no deseados de accesos especialmente diseñados a celdas adyacentes. Así, el acceso a los datos almacenados en la DRAM hace que las celdas de memoria pierdan sus cargas e interactúen eléctricamente, como resultado de la alta densidad de celdas en la memoria moderna, alterando el contenido de filas de memoria cercanas que en realidad no fueron direccionadas en el acceso original a la memoria. Este efecto se conoce como row hammer, y también se ha utilizado en algunos exploits de escalada de privilegios en seguridad informática.
Un ejemplo de un error de un solo bit que sería ignorado por un sistema sin verificación de errores, detendría una máquina con verificación de paridad o sería corregido de forma invisible por ECC: un solo bit está fijado en 1 debido a un chip defectuoso, o se convierte en 1 debido a la radiación de fondo o cósmica; se carga una hoja de cálculo que almacena números en formato ASCII, y el carácter "8" (valor decimal 56 en la codificación ASCII) se almacena en el byte que contiene el bit fijo en su posición de bit más baja; luego, se realiza un cambio en la hoja de cálculo y se guarda. Como resultado, el "8" (0011 1000 binario) se ha convertido silenciosamente en un "9" (0011 1001).
Se han desarrollado varios enfoques para tratar los cambios de bit no deseados, incluyendo la programación consciente de la inmunidad, la memoria de paridad de RAM y la memoria ECC.
Este problema puede mitigarse utilizando módulos DRAM que incluyan bits de memoria adicionales y controladores de memoria que exploten estos bits. Estos bits adicionales se utilizan para registrar paridad o para utilizar un código de corrección de errores (ECC). La paridad permite la detección de todos los errores de un solo bit (en realidad, cualquier número impar de bits incorrectos), pero no la corrección, por lo que el sistema tiene que continuar (simplemente señalando el problema) o detenerse. Los códigos de corrección de errores permiten corregir más errores; la cantidad depende del tipo exacto de memoria utilizada.
La memoria DRAM puede proporcionar una mayor protección contra los errores blandos mediante el uso de códigos de corrección de errores. Esta memoria de corrección de errores, conocida como memoria ECC o protegida por EDAC, es especialmente deseable para aplicaciones altamente tolerantes a fallos, como servidores, así como para aplicaciones en el espacio profundo debido al aumento de la radiación.
Algunos sistemas también "depuran" la memoria, leyendo periódicamente todas las direcciones y reescribiendo las versiones corregidas si es necesario para eliminar los errores blandos acumulados.
Los subsistemas de memoria modernos pueden ofrecer integridad de datos a través de uno o más de los siguientes esquemas:
Muchas implementaciones tempranas de memoria ECC, así como el ECC en el dado, enmascaran los errores corregibles, actuando "como si" el error nunca hubiera ocurrido, y solo notifican errores incorregibles. Las implementaciones modernas registran tanto los errores corregibles (CE) como los incorregibles (UE). Algunas personas reemplazan proactivamente los módulos de memoria que presentan altas tasas de error, para reducir la probabilidad de eventos de error incorregible.
La memoria de servidor estándar está diseñada para un código de Hamming de corrección de errores de un solo bit y detección de errores dobles (SECDED), que permite corregir un error de un solo bit y detectar errores de dos bits por palabra (la unidad de transferencia del bus). Desde DDR SDRAM, el ancho de bus estándar (tamaño de palabra) en lo que respecta a la memoria es de 64 bits. Como resultado, la configuración típica entre DDR y DDR4 es una palabra de 72 bits con 64 bits de datos y 8 bits de verificación. DDR5 SDRAM divide el bus en dos subcanales de 32 bits algo independientes, por lo que la memoria ECC utiliza 80 bits de ancho en total, divididos entre dos canales de 40 bits (32 datos, 8 verificación). ECC también se utiliza con tamaños más pequeños y más grandes.
Un controlador de memoria con capacidad ECC utiliza los bits adicionales para almacenar el código SECDED; la memoria solo es responsable de retener los bits extra. Desde finales de la década de 1990, el controlador de memoria también se comunica con el BIOS y mantiene un recuento de los errores detectados y corregidos, en parte para ayudar a identificar los módulos de memoria defectuosos antes de que el problema se vuelva catastrófico. La lectura del contador es compatible con muchos sistemas gracias al estándar SMBIOS, estando disponible en Linux, BSD y Windows (Windows 2000 y posteriores).
La detección y corrección de errores depende de una expectativa de los tipos de errores que se producen. Implícitamente, se asume que el fallo de cada bit en una palabra de memoria es independiente, lo que resulta en la improbabilidad de dos errores simultáneos. Este solía ser el caso cuando los chips de memoria tenían un bit de ancho, lo que era típico en la primera mitad de la década de 1980; los desarrollos posteriores trasladaron muchos bits al mismo chip.
Esta debilidad se aborda mediante diversas tecnologías, incluyendo Chipkill de IBM, ECC extendido de Sun Microsystems, Chipspare de Hewlett-Packard y Corrección de datos de un solo dispositivo (SDDC) de Intel, todas las cuales aseguran que el fallo de un chip de memoria solo afecte a un bit por palabra ECC. Esto se logra dispersando los bits de las palabras ECC entre los chips, una forma de entrelazado. Para asegurar que cada chip solo reciba un bit por palabra, puede ser necesario entrelazar a través de múltiples módulos de memoria (sticks).
El entrelazado en general es una técnica útil para defenderse contra fallos correlacionados de múltiples bits. Un rayo cósmico, por ejemplo, puede alterar múltiples bits físicamente vecinos a través de múltiples palabras, asociando bits vecinos a diferentes palabras. Siempre que una alteración de un solo evento (SEU) no supere el umbral de error (por ejemplo, un solo error) en una palabra particular entre accesos, puede corregirse (por ejemplo, mediante un código de corrección de errores de un solo bit), y se puede mantener un sistema de memoria efectivamente libre de errores.
Algunos chips DRAM incluyen circuitos de corrección de errores internos "en chip" o "en el dado", que permiten a los sistemas con controladores de memoria no ECC obtener la mayoría de los beneficios de la memoria ECC. En algunos sistemas, se puede lograr un efecto similar utilizando módulos de memoria EOS.
Como se mencionó anteriormente, el ECC en el dado es obligatorio en DDR5 y LPDDR6. Sin embargo, su falta de notificación significa que se sabe muy poco sobre el verdadero estado del chip de memoria hasta que los errores superan la capacidad del algoritmo en el dado para realizar la corrección; no se transmite información sobre cuánto "margen" existe. Se han construido algoritmos sofisticados para inferir la existencia de errores corregidos basándose en errores no corregidos.
Muchos sistemas de memoria ECC utilizan un circuito EDAC "externo" entre la CPU y la memoria. Algunos sistemas con memoria ECC utilizan sistemas EDAC internos y externos; el sistema EDAC externo debe estar diseñado para corregir ciertos errores que el sistema EDAC interno no puede corregir. Las CPU modernas de escritorio y servidor integran el circuito EDAC en la CPU, incluso antes del cambio hacia controladores de memoria integrados en la CPU, que están relacionados con la arquitectura NUMA. La integración de la CPU permite un sistema EDAC sin penalización durante el funcionamiento sin errores.
En 2009, los códigos de corrección de errores más comunes utilizaban códigos de Hamming o Hsiao que proporcionan corrección de errores de un solo bit y detección de errores de dos bits (SEC-DED). Se han propuesto otros códigos de corrección de errores para proteger la memoria: códigos de corrección de errores de dos bits y detección de errores de tres bits (DEC-TED), códigos de corrección de errores de un solo nibble y detección de errores de dos nibbles (SNC-DND), códigos de corrección de errores Reed-Solomon, etc. Sin embargo, en la práctica, la corrección de múltiples bits suele implementarse mediante el entrelazado de múltiples códigos SEC-DED.
La investigación temprana intentó minimizar el área y los retrasos de los circuitos ECC. Hamming demostró primero que los códigos SEC-DED eran posibles con una matriz de comprobación particular. Hsiao demostró que una matriz alternativa con columnas de peso impar proporciona capacidad SEC-DED con menos área de hardware y menor retardo que los códigos SEC-DED de Hamming tradicionales. La investigación más reciente también intenta minimizar el consumo de energía, además de minimizar el área y el retardo.
Los controladores de memoria con corrección de errores utilizan tradicionalmente códigos de corrección de errores óptimos en espacio, como Hamming y Hsiao. Si el coste y el espacio no son una preocupación pero la velocidad sí lo es, se puede utilizar una redundancia modular triple (TMR) debido a su implementación de hardware más rápida. Los sistemas de satélites espaciales suelen utilizar TMR, aunque la RAM de los satélites suele utilizar la corrección de errores de Hamming.

Seymour Cray dijo famosamente "la paridad es para los granjeros" cuando se le preguntó por qué omitió esto en el CDC 6600. Más tarde, incluyó la paridad en el CDC 7600, lo que llevó a los críticos a comentar que "al parecer, muchos granjeros compran ordenadores". El IBM PC original y todos los PC hasta principios de la década de 1990 utilizaban la verificación de paridad. Los posteriores, en su mayoría, no lo hacían.
La mayoría de las rutas de datos de un ordenador personal de la década de 2020, incluyendo PCIe, SATA, la interconexión entre chips y el almacenamiento en disco, tienen alguna forma de protección ECC. La falta de ECC en la memoria principal es, en comparación, inusual, especialmente dada la mayor probabilidad de corrupción. Linus Torvalds escribió un extenso post en un foro en 2021 atacando la decisión de Intel de no incluir soporte ECC en las plataformas de escritorio, cuando las plataformas de escritorio contemporáneas de AMD podían utilizar (pero no necesariamente activar la función ECC en) DIMM registrados con soporte ECC.
Muchas CPU utilizan códigos de corrección de errores en la caché en chip, incluyendo los procesadores Intel Itanium, Xeon, Core y Pentium (desde la microarquitectura P6), los procesadores AMD Athlon, Opteron, todos los basados en Zen- y Zen+- (EPYC, EPYC Embedded, Ryzen y Ryzen Threadripper), y el DEC Alpha 21264.
A 2006, EDC/ECC y ECC/ECC son las dos técnicas de protección contra errores de caché más comunes utilizadas en los microprocesadores comerciales. La técnica EDC/ECC utiliza un código de detección de errores (EDC) en la caché de nivel 1. Si se detecta un error, los datos se recuperan de la caché de nivel 2 protegida por ECC. La técnica ECC/ECC utiliza una caché de nivel 1 protegida por ECC y una caché de nivel 2 protegida por ECC. Las CPU que utilizan la técnica EDC/ECC siempre realizan escritura directa de todas las operaciones STORE a la caché de nivel 2, de modo que cuando se detecta un error durante una lectura de la caché de datos de nivel 1, se puede recuperar una copia de esos datos de la caché de nivel 2.
La memoria registrada o almacenada en búfer no es lo mismo que ECC; las tecnologías realizan funciones diferentes. Es habitual que la memoria utilizada en servidores sea tanto registrada, para permitir el uso de muchos módulos de memoria sin problemas eléctricos, como ECC, para la integridad de los datos.
El uso de ECC para aumentar la seguridad de los datos suele conllevar un mayor gasto, lo que resulta en un rendimiento ligeramente inferior y mayores costes de memoria.
La memoria ECC es más cara que la memoria no ECC debido a su funcionalidad adicional de verificación de errores. El coste adicional añadido de la memoria ECC para 1 GB en 2010 varía entre 0 y 15 dólares, dependiendo del rendimiento y del fabricante. El diseño de ECC y su propósito en cargas de trabajo de alta fiabilidad lo posicionan para tener una sobrecarga adicional para la validación y los diseños de circuitos adicionales dentro de la memoria. Estas características suelen dar lugar a mayores costes para la implementación de ECC.
Los fabricantes de placas base pueden optar por añadir compatibilidad ECC de diversos niveles según el segmento del mercado. Algunas placas base y procesadores con ECC son capaces de soportar ECC sin búfer (no registrada), pero también funcionarán con memoria no ECC; el firmware del sistema activa la funcionalidad ECC si se instala memoria ECC.
ECC puede reducir el rendimiento de la memoria en aproximadamente un 2-3 por ciento en algunos sistemas, dependiendo de la aplicación y la implementación, debido al tiempo adicional necesario para que los controladores de memoria ECC realicen la verificación de errores. Sin embargo, los sistemas modernos integran las pruebas ECC en la CPU, sin generar ningún retraso adicional en los accesos a la memoria siempre que no se detecten errores.
Este no es el caso del ECC en banda, que almacena las tablas utilizadas para la protección en una región reservada de la memoria principal del sistema, compatible con Intel para Chromebooks, que mostró poco impacto en la navegación web y tareas de productividad, pero causó hasta un 25% de reducción en los puntos de referencia de juegos y edición de vídeo.
!mca». Microsoft Learn (en inglés estadounidense). Consultado el 27 de marzo de 2021.