Tonal пишет:
Тут знакомый наткнулся на странное поведение при мапировании файлов в
винде:
...
Кто-нибудь с подобным сталкивался? Как с этим бороться? Почему это
происходит?
Фрагментирование виртуальной памяти происходит, думается мне, по тем же самым причинам, по которым фрагментируется и обычная оперативная память. Ибо разделение памяти на оперативную и виртуальную несколько искусственно с точки зрения ОС. Не знаю, как именно в винде реализовано, но если не хватает оперативки, то просто принимаются меры по высвобождению (кто-то, кто должен подождать, согласно приоритетов или истекшему кванту времени, отправляется на диск). Адресное пространство-то едино. Тут все от менеджера памяти зависит. Так что причины зарыты глубоко в ядре операционной системы, а точнее, в одной из ее подсистем - подсистеме управления памятью, в алгоритмах, на основании которых менеджер памяти принимает решение, в каком месте адресного пула выделить запрашиваемый блок памяти. И тут дело не только в программе знакомого твоего. Многое зависит от программного окружения: сколько процессов и насколько жадных по поводу памяти работают на том же компьютере в параллельных процессах.

Если начинается борьба за ресурсы памяти, то начинается эта свистопляска: в одном и том же блоке адресов в различный момент времени поселяется то один процесс, то другой. Одному нужно 10 мег - на, получи. Другому - 1 мегабайт. Свободного блока не нашли - выселили первого в ОП (там вдруг кто-то удачно завершился - память освободилась), дали второму 1 мег. Потом третий пришел, ему надо 100 килобайт. Свободное - только после только что выделенного второму мегабайта. Дали соточку. Тем временем в оперативке еще какой-то процесс поселился и отъел все свободное. Снова первый в виртуалку просится со своими 10 мегабайтами. И куда ему деться?.. Даже если второй и третий сдвинуть в конец свободного блока, то не хватает...

Ну, примерно как-то так вот...

Хочется приятелю написать багрепорт в майкрософт? Пусть попробует :) Только теоретически уже все давным давно разжевано и практически воплощено. У разных вариантов реализации свои плюсы и минусы. Оптимальный вариант менеджера памяти с точки зрения использования памяти может оказаться неприемлимо медленным для общего быстродействия системы. Так что компромисс неизбежен.

--
Regards,
Ovchinnikov Vasily
ova at tkvc ru



Ответить