Мне часто нужны большие, непрерывные области виртуального адресного пространства, которые могут расти по требованию. В 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, если я решу также поддерживать эту платформу.