Есть процесс в операционной системе, который занимает 1,5 гигабайта.
Выдаем запрос на выделение 50 Мб адресного пространства с непрерывной адресацией, т.е. создаем масив (начало массива + длина).
Операционная система Windows выдает сообщение, что приложение потребовало слишком много памяти и будет закрыто. В итоге процесс падает. В системе установлено 2 гига оперативки, плюс ко всему прочему приложение откомпилировано с поддержкой ключа 3Gb, который также активирован и в операционной системе.
Начинаем разбираться.
Оказалось, что все приложения, которые загружены в память привязаны к конкретным ячейкам памяти, которые им занимаются и не освобождаются. В итоге может сложиться ситуация, когда разные приложения (в том числе системные) и, в том числе, наше, после работы с памятью (выделение/освобождение ячеек) сегментируют ее таким образом, что между ближайшими занятыми сегментами памяти размер не превышает некоего размера. И когда мы запрашиваем на выделение непрерывный участок памяти система выдает нам, что мол обломитесь ребятки - памяти нема.
Какой выход мы нашли: снизили размер запрашиваемого за раз сегмента памяти до 25 Мб. Это существенно повысило наши шансы на то, что мы сможем расположить массив в памяти, но как сами понимаете, это всего лишь повышает вероятность, а не является ответом на вопрос.
Ждем случая, когда у юзера софт опять упадет по причине этой причине с меньшим размером индексации, и будем еще больше мельчить размер запрашиваемого сегмента.
Вопрос в следующем:
1) Есть ли в Windows механизмы по оптимизации памяти, чтобы, например, время от времени при необходимости делать запрос на дефрагментацию памяти?
2) Есть ли в Windows механизмы по устанавливанию приоритетов для приложений при выделении памяти? Т.е. если мы делаем запрос на выделение памяти, а некое приложение лежит в памяти на нашем пути, то, если у нашего приложения приоритет выше, то система перенесет приложение с более низким приоритетом куда-нибудь.
Если будут ответы, то просьба подкрепить ответ ссылками (по возможности) или писать более развернуто.
Спасибо.
Если что непонятно написал, то готов переформулировать.
С уважением