Аппаратные схемы тонкого разделения доступа к адресному пространству
не имели большого успеха не только из-за высоких накладных расходов, но
и из-за того, что решали не совсем ту проблему, которая реально важна.
Для повышения надежности системы в целом важно не обнаружение ошибок и
даже не их локализация с точностью до модуля сама по себе, а возможность
восстановления после их возникновения. Самые распространенные фатальные
ошибки в программах — это ошибки работы с указателями и выход индекса
за границы массива (в наш сетевой век ошибки второго типа более известны
как "срыв буфера"). Эти ошибки не только часто встречаются, но и очень
опасны, потому что восстановление после них практически невозможно. Ошибки
работы с указателями еще можно попытаться устранить, искоренив само понятие
указателя. Примерно этой логикой продиктован запрет на формирование указателей
в машинах Burroughs, именно из этих соображений в Java и некоторых других
интерпретируемых языках указателей вообще нет. Однако искоренить понятие
индексируемого массива уже не так легко. д ошибки индексации присуши всем
компилируемым языкам, начиная с Fortran и Algol 60. Вставка проверок на
границы индекса перед каждой выборкой элемента массива создает накладные
расходы, но тоже не решает проблемы: ошибка все равно обнаруживается не
в момент совершения (в тот момент, когда мы вычислили неверный индекс),
а позже, когда мы попытались его использовать. В момент индексации обычно
уже невозможно понять, какой же элемент массива имелся в виду. Программе
остается только нарисовать на экране какое-нибудь прощальное сообщение
вроде "Unhandled Java Exception", и мирно завершить свой земной путь.
Понятно, что реакция пользователя на подобное сообщение будет ничуть не
более адекватной, чем на хрестоматийное "Ваша программа выполнила недопустимую
операцию — General Protection Fault" (впрочем, кто знает, может быть,
такая реакция и является самой адекватной?). Прогресс в решении этой проблемы
лежит уже в сфере совершенствования технологий программирования, и вряд
ли может быть обеспечен усложнением диспетчеров памяти. Уровень же надежности,
обеспечиваемый современными ОС общего назначения с разделением памяти,
по-видимому, оптимален в том смысле, что улучшения в сфере защиты памяти
могут быть достигнуты лишь ценой значительных накладных расходов без принципиального
повышения наработки на отказ.