Recientemente descubrí que los bits en las DRAM pueden cambiarse aleatoriamente por la descomposición de las partículas o por los rayos cósmicos. Y me preguntaba con qué frecuencia ocurren estos errores.
Desafortunadamente, la estadística más reciente que encontré es del año 1990 (fuente) , que establece que debe ocurrir un error cada mes por cada 128 MB de memoria.
Como no pude encontrar ninguna estadística reciente de las tasas de errores leves en las RAM modernas, traté de escribir un programa en Java para medir la frecuencia de errores leves en 4 GB de mi RAM. Espero que el programa funcione para detectar todos los errores leves en los 4 GB de RAM asignados, si no se optimizó de ninguna manera.
El problema es que no tengo idea de cómo comprobar si el programa funciona (supongo que no es así debido a la optimización) y no sé cómo cambiarlo para que funcione como se esperaba.
Según las estadísticas de 1990, debería esperar detectar un error cada 22 horas, por lo que necesitaría ejecutar el programa durante casi una semana para afirmar con un 99% de confianza que funciona. Suponiendo que el hardware moderno no tenga una mejor tasa de error suave que en los años 90.
El siguiente bucle es la parte más importante de mi programa:
int[] memory = new int[1_073_741_824]; // 4GB array, each value initialized to 0 while (true) { for (int i = 0; i < memory.length; i++) { if (memory[i] != 0) { // soft error found memory[i] = 0; // print information about the error in a log file } } // Sleep for a minute }¿Qué puedo hacer para evitar que la optimización rompa el uso previsto del programa?
PD: si cree que mi código ni siquiera funcionaría sin optimización, explique por qué.
Simple: tan pronto como el cuerpo del bucle haga algo (como simplemente imprimir el índice en el que falló), ¡optimizar el cuerpo del bucle sería inválido!
Y en todo caso, sería el JIT optimizando las cosas, javac no está haciendo mucho más que el plegado constante con respecto a las optimizaciones.
Pero, por supuesto, estaría en el lado seguro al usar lenguajes en los que tiene control total sobre tales cosas.
Más allá de eso: dudo que alguna vez encuentre un error con dicho código.