среда, 7 января 2009 г.

Управление памятью в 16-ти разрядных Windows

Это перевод The management of memory for resources in 16-bit Windows. Автор: Реймонд Чен.

В прошлый раз я грозился обсудить управление ресурсами в 16-ти битных Windows.

В 16-ти разрядных Windows, ресурсы не загружались в память до того момента, пока их кто-то не запрашивал явно:
  • Функция FindResource искала запись о ресурсе в каталоге ресурсов модуля и возвращала её в форме HRSRC.
  • Функция LoadResource брала этот описатель и выделяла для него какое-то количество перемещаемой памяти (HGLOBAL), после чего загружала этот ресурс в память с диска.
  • Функция LockResource брала описатель памяти и блокировала её, возвращая указатель на начало данных ресурса.
  • Функция UnlockResource разблокировала описатель памяти.
  • Функция FreeResource освобождала память, которая была выделена для ресурса.
На самом деле всё было намного сложнее, чем тут описано. Необходимо было делать дополнительную работу для того, чтобы если два разных человека загрузили бы один и тот же ресурс, то для обоих бы использовался бы один блок памяти, а FreeResource не освобождала бы память, пока число ссылок на неё не упало бы до нуля.

Вообще-то, всё было ещё сложнее. Если ресурс был помечен как DISCARDABLE, тогда память на самом деле не освобождалась, когда счётчик ссылок становился нулевым. Вместо этого глобальная память помечалась как "discardable" ("выбрасываемая", GMEM_DISCARDABLE), так что описатель оставался рабочим, но если системе вдруг не хватало памяти, то эта глобальная память освобождалась, а при следующем вызове LoadResource она бы загружалась с диска снова.

Та что теперь вы знаете, что означает ключевое слово DISCARDABLE в ресурсных файлах. Или, по крайней мере, что оно когда-то значило. Win32 ничего такого больше не делает. Флаг DISCARDABLE сейчас игнорируется, но всё ещё существует для обеспечения совместимости.

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

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

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

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

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

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

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