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