MacOS эквивалент резервирования памяти без взимания платы с лимита фиксации - PullRequest
0 голосов
/ 11 ноября 2019

Мне часто нужны большие, непрерывные области виртуального адресного пространства, которые могут расти по требованию. В Windows я делаю это своим вызовом VirtualAlloc с MEM_RESERVE и аргументом dwSize, который, по моему мнению, больше, чем область, в которой, по всей вероятности, когда-либо потребуется увеличение, и затем фиксирует страницу за раз по мере необходимости. Это не только откладывает сопоставление страниц с физической памятью до тех пор, пока к ним не будет получен доступ, что также будет полезно для фиксации всего региона, но и откладывает начисление страниц за пределы системного коммита. Таким образом, программа не ограничивает объем памяти, который другим программам разрешено выделять ради памяти, которую она еще не использует и может никогда не использовать. По сути, я хочу обработать память моей программы так, чтобы в принципе было разрешено потреблять большой объем памяти, если этого требует пользователь, и в то же время разрешать другим программам иметь эту память вместо этого, если она им сначала нужна.

Кто-то уже уже спросил , есть ли у macOS эквивалент VirtualAlloc с MEM_RESERVE. Ответы показывают, что mmap с MAP_ANON | MAP_PRIVATE примерно эквивалентно. Что меня интересует, так это то, что macOS имеет эквивалент ограничения лимита Windows, и mmap, вызываемый с правильными флагами, ведет себя так же, как мой VirtualAlloc, когда я не взимаю плату с этим пределом?

Редактировать: кто-то еще задал аналогичный вопрос о Linux, для которого также был предложен mmap. Ответ предполагает, что на этой платформе необходимо сначала сопоставить регион с помощью PROT_NONE и добавить требуемые привилегии, когда страницы необходимы, чтобы предотвратить подсчет неиспользуемых страниц по отношению к пределу фиксации. Отсутствие лучшей документации о том, почему в macOS разрешено отображение памяти, превышающей доступную физическую память (полное отсутствие ограничения коммитов? Какая-то особенность перегрузки, как в Linux?), Я полагаю, я мог бы также применить тот же трюк PROT_NONEв случае. По крайней мере, это означает, что я смогу повторно использовать тот же код для Linux, если я решу также поддерживать эту платформу.

1 Ответ

1 голос
/ 11 ноября 2019

Я не верю, что у macOS есть предел системного коммита. Я не нахожу ничего подобного в API-интерфейсах Mach, которые являются низкоуровневыми API-интерфейсами виртуальных машин, где я и ожидал. Аналогично, я не вижу ничего подобного в выводе sysctl -a, который сообщает о многих других деталях и статистике виртуальной машины.

Я могу точно сказать, что я зарезервировал все неиспользуемое пространствов 64-битном процессе (который имеет 46-битное адресное пространство пользователя). То есть чуть меньше 128 ТБ.

Вы можете повторить это, просто повторяя вызовы mmap() большого размера до тех пор, пока они не потерпят неудачу, вдвое уменьшите размер и повторите, пока ваш размер не уменьшится до 1 страницы. Затем, когда процесс приостановлен в этой точке, примените к нему vmmap -w -interleaved <pid>, чтобы увидеть его распределение.

...