Я искал довольно неуловимую ошибку, которую мы видим в приложении на встроенной системе Windows XP.
Мы сузили ошибку до указателя, который должен указывать на блок памяти, а не на NULL. Поскольку память выделяется вызовом malloc (..), который не проверялся, мой инстинкт говорит, что malloc завершился неудачно и возвратил NULL (хотя мы сейчас тоже ищем другие возможности, такие как условия гонки, которые могут непреднамеренно изменить указатель). Это родное приложение C ++. Авария была немного более замысловатой, чтобы отследить эту причину, в первую очередь потому, что у нас были только дампы аварийных сбоев и сбой, проявившийся в сторонней библиотеке, для которой у нас нет источника, в другом потоке. Веселые времена 🙂
Мои вопросы направлены на возможность исчерпания памяти. Важно, что у системы XP Embedded, на которой мы работали, был отключен файл подкачки.
Итак, у меня есть три вопроса; было бы здорово, если бы кто-нибудь мог уточнить это для меня:
Прежде всего, каковы последствия отсутствия файла подкачки? Означает ли это, что при росте кучи операционная система должна немедленно находить и выделять новую память, даже если эти свободные блоки не используются сразу? Я видел некоторые анекдотические упоминания об этом, но не смог найти ничего конкретного о том, какие именно эффекты отключают файл подкачки.
Почему Microsoft решила не включать Низкофрагментарную кучу по умолчанию до Windows Vista? Есть ли опасность включения LFH для вашего процесса в Windows XP?
Какая разница в WinDbg между «внешней фрагментацией» и «виртуальной фрагментацией адреса»?
WinDbg сообщает о статистике кучи для затронутой кучи следующим образом:
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
04770000 00001002 1621948 94844 1608284 102 6 8068 6 2 L
Virtual address fragmentation 94 % (8068 uncommited ranges)
В отличие от Linux, в Windows выделение ресурсов является обязательством. Вы будут иметь возможность записи в выделенную память. Производительность может быть ужасной, но Windows не нуждается в убийце OOM.
Если файла подкачки нет, обязательство должно быть подкреплено оперативной памятью. И все же неиспользуемая память (например, используемая только во время инициализации программы) все еще использует ОЗУ, поскольку ее нельзя выгружать. Так что для выполнения обязательств требуется меньше оперативной памяти, а для этого требуется гораздо больше.
LFH ломает программы с ошибками, или лучше сказать: программы с ошибками могут показывать свои ошибки при наличии LFH. Microsoft чрезвычайно дружелюбно относится к взломанным программам, и использование LFH для XP является типичным примером их вежливого поведения.
Других решений пока нет …