Один программист утверждает, что его 64-разрядная версия Mac продолжает заканчиваться из-за фрагментации памяти. Я возразил, что это невозможно, исходя из того, что программа выделяет всего 1-2 ТБ памяти в целом, а большинство распределений находится в диапазоне 40-200 байт, даже если они находятся в миллионах.
Я считаю, что просто невозможно фрагментировать 64-разрядное адресное пространство таким образом, что запрос на распределение будет терпеть неудачу, потому что распределитель памяти не может найти свободный пробел запрошенного размера в адресном пространстве.
Моя вера основана на понимании того, что доступно почти все адресное пространство (64 бит). Может быть, это всего лишь 62 бит.
Так что я задаюсь вопросом, существуют ли другие ограничения, которые могут вызвать его проблемы. Например, действительно ли доступно все 64-разрядное адресное пространство или имеется только гораздо меньшее подмножество адресного пространства, которое можно использовать для распределений? Или существует ли ограничение на общее количество виртуальных страниц?
Apple Руководство разработчика для ядра, похоже, не предоставляет никакой информации по этой теме.
Я нашел некоторые подсказки об ограничениях в Как можно распределить память по умеренному размеру в 64-разрядном процессе на Mac OS X? - но такие предложения, как там общий лимит около 128 ТБ не поддерживался ссылками. Например, этот лимит относится к общей сумме, которая может быть отнесена к любому процессу, или является общей суммой для всех процессов вместе, и является ли это общей суммой, или это диапазон адресов, который может быть выделен?
I.e, если 128 TB - это полный диапазон адресов, который может быть возвращен malloc, и если этот диапазон для всех процессов, то я мог бы представить, что это вызывает указанные проблемы. Но действительно ли это?
Окончательный ответ, вероятно, можно найти в исходном коде darwin. У кого-то хватит на это и может суммировать его здесь?