Как настольные, портативные и карманные персональные компьютеры справляются с повреждением данных в оперативной памяти?
Не секрет, что самопроизвольное повреждение хранимых данных (например, переворот) не является частым, но все же довольно вероятным событием в обычной операции SDRAM (включая DDR 1/2/3/4 SDRAM).
Серверы и рабочие станции для работы в тяжелых условиях используют механизм ECC, встроенный в их модули SDRAM, для решения этой проблемы, гарантируя, что прочитанное слово данных всегда будет словом данных, записанным по этому конкретному адресу ранее.
Но как насчет настольных / портативных ПК и портативных гаджетов, использующих модули памяти не-ECC? Как разработчик может быть уверен, что переменная содержит именно то значение, которое ей записано?
3 ответа
Я не думаю, что существуют какие-либо механизмы для предотвращения ошибок в системах, не относящихся к ECC, ни на уровне системы, ни на уровне ОС. Я не верю, что Windows регулярно обновляет содержимое оперативной памяти, аппаратное обеспечение должно сохранять значения в памяти.
При запуске системы в BIOS выполняется быстрая проверка памяти, поэтому здесь можно обнаружить некоторые серьезные ошибки.
Некоторые файлы, такие как установщики, могут выполнять проверки CRC. Но эти ошибки могут исходить от носителя, а не из памяти.
При случайной ошибке в ячейке памяти, которая не будет использоваться или будет перезаписана. Нет проблем. Я подозреваю, что в этом месте происходит очень большой процент случайных, неповторяющихся ошибок.
Коррупция в пространстве приложения может генерировать исключение, а не сбой, который может или не может быть обработан изящно. Однако это было бы просто удачей - исключений для "ошибок памяти" как таковых нет, но ошибка может возникнуть в месте, которое обрабатывается обработчиком исключений. В противном случае приложение будет нести поврежденные данные или произойдет сбой, если он вызовет недопустимую операцию.
Помимо этого, приложения / ОС будут аварийно завершать работу, а записанные файлы будут повреждены.
Приложения, если они хотят, могут реализовать механизмы проверки, выполняя операции дважды или более. Проверка памяти и сторонние инструменты копирования файлов являются такими примерами.
Они вообще не справляются с такой ситуацией. Тест при загрузке обращается к последнему биту памяти, и это все, что делает обычный BIOS. В Linux/FreeBSD и т. Д. Есть исправление, позволяющее исключить адреса памяти из системы. Если вы этого не сделаете, системы, скорее всего, выйдут из строя, когда проверка внутренней целостности ядра обнаружит "переворот в битах" (сигнал 11 в Unix)
Да, как правило, система будет выполнять тест ОЗУ при запуске и пытаться изолировать все плохие страницы.
В противном случае, если плохая страница каким-то образом обнаружена во время работы (не слишком вероятно в большинстве потребительских ящиков, поскольку они обычно не проверяют четность, но возможны на "большом железе"), то, если страница является "виртуальной", и она не была помеченный как "измененный", система, вероятно, "удалит" страницу, пометит физическую страницу как плохую, а затем вернет ее обратно с диска.
Однако, если страница "грязная" (изменена), об ошибке будет сообщено приложению как исключение некоторого рода. Если плохая страница - это какая-то системная страница, то происходит сбой системы.
Конечно, при отсутствии проверки на четность или какого-либо другого механизма обнаружения ошибки просто используются неверные данные, и что бы ни происходило. Это наиболее вероятный случай на потребительском оборудовании.