Управление памятью в MacOS и Win16 В этих системах предполагается, что пользовательские программы не сохраняют
указателей на динамически выделенные блоки памяти. Вместо этого каждый
такой блок идентифицируется целочисленным дескриптором или "ручкой"
(handle) (рис. 4.16). Когда программа непосредственно обращается к данным
в блоке, она выполняет системный вызов GiobaiLock
(запереть). Этот вызов возвращает текущий адрес блока. Пока программа
не исполнит вызов GiobaiUniock (отпереть), система
не пытается изменить адрес блока. Если же блок не заперт, система считает
себя вправе передвигать его по памяти или даже сбрасывать на диск (рис.
4.17).
Рис. 4.16. Управление памятью с помощью "ручек" Вызовы GlobalLock/GlobalUnlock:
Попытки уменьшить число блокировок требуют определенных интеллектуальных усилий. Фактически, к обычному циклу разработки ПО: проектирование, выбор алгоритма, написание кода и его отладка — добавляются еще 16 фазы: микрооптимизация использования "ручек" и отладка оптимизированного кода. Последняя фаза оказывается, пожалуй, самой сложной и ответственной.
Рис. 4.17. Дефрагментация при управлении памятью с помощью "ручек" Наиболее опасной ошибкой, возникающей на фазе микрооптимизации, является
вынос указателя на динамическую структуру за пределы скобок GiobaiLock/ciobaiUniock.
Эту ошибку очень сложно обнаружить при тестировании, так как она проявляется,
только если система пыталась передвигать блоки в промежутках между обращениями.
Иными словами, ошибка может проявлять или не проявлять себя в зависимости
от набора приложений, исполняющихся в системе, и от характера деятельности
этих приложений. В результате мы получаем то, чего больше всего боятся
эксплуатационщики — систему, которая работает иногда.
При переходе от Windows 3.x к Windows 95 наработка на отказ — даже при
исполнении той же самой смеси приложений — резко возросла, так что система
из работающей иногда превратилась в работающую как
правило. По-видимому, это означает, что большая часть ошибок в
приложениях Winl6 действительно относилась к ошибкам работы с "ручками". |