пятница, 9 октября 2009 г.

История GlobalLock, часть 3: переход к Win32

Это перевод A history of GlobalLock, part 3: Transitioning to Win32. Автор: Реймонд Чен.

Теперь, когда вы знаете, как 16-ти битный менеджер памяти управлял глобальной кучей, настало время посмотреть, как же он был перенесён в новый 32-х разрядный мир.

Функция GlobalAlloc продолжила эмулировать все прежние правила перемещения, но только возвращаемое значение GlobalAlloc более не было селектором, поскольку Win32 использует процессор с "плоской моделью памяти" ("flat mode").

Это означает, что старый трюк с кэшированием селектора и перераспределении памяти из под него больше не работает.

Семантика перемещений была сохранена. Блоки памяти всё ещё имеют счётчик блокировок, хотя он реально ничего не делает, потому что Win32 никогда не упаковывает память (вспомните, что смысл счётчика блокировок был в том, чтобы избежать перемещения блока памяти во время процесса упаковки).

Перемещаемая память и блокировки могли бы быть полностью убраны, если бы у нас не было функции GlobalFlags. Эта функция возвращает несколько странных кусков информации (теперь уже абсолютно бесполезными), наиболее проблемным из который является счётчик блокировок. Соответственно, все эти шарады с блокировками должны поддерживаться только для того случая, если вдруг кто-то проверяет счётчик блокировок или же ожидает, что GlobalReAlloc завершится неудачей на блокированном блоке.

Помимо этого, перемещаемая память не даёт вам ничего, кроме бесполезной нагрузки.

Функция LocalAlloc также сохраняет эту наследованную нагрузку, но поскольку локальная память никогда не передавалась между DLL в Win16, то функции локальной кучи не так сильно заботятся об этом моменте, как функции глобальной кучи. Именно по этой причине, LocalAlloc предпочтительней GlobalAlloc в Win32 (конечно же, многие функции требуют конкретного типа выделения, и в этом случае у вас нет выбора. Буфер обмена, например, требует перемещаемые глобальные описатели, а COM требует использовать task allocator).

В следующий раз мы взглянем на реализацию блокировки (да, хотя она ничего не делает).

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.