Как поменять блок памяти? - PullRequest
1 голос
/ 25 марта 2010

Как сделать блок памяти, выделенный функцией malloc () или new:

  • немедленно поменялся,
  • или лениво инициализируется.

На самом деле я пытаюсь зарезервировать адресное пространство. Как это сделать?

PS. Как проверить из пространства пользователя, выгружен ли блок памяти?

Ответы [ 4 ]

3 голосов
/ 25 марта 2010

malloc часто реализуется с помощью mmap, поэтому, если бы вы использовали malloc, вы все равно получили бы поведение, которого вы придерживаетесь. В конце концов, зачем выделять память из-за того, что другие страницы выходят из кеша, если нет гарантии, что новые страницы будут немедленно инициализированы? Я знаю, что Open BSD реализует malloc таким образом, и GNU C lib использует mmap, если ваше выделение больше некоторого предела. Я думаю, что это всего лишь пара страниц.

Я не знаю о том, как Windows справляется со всем этим, но проверьте документы VirtualAlloc, чтобы узнать, конкретно ли они касаются своей цели. Если он документирует, что malloc Windows кеширует свои страницы, тогда у вас есть ответ, и вы должны использовать VirtualAlloc.

2 голосов
/ 25 марта 2010

В Windows вы можете сделать это с помощью функции VirtualAlloc .

Я не знаю, как это сделать в Linux или OS X.

2 голосов
/ 25 марта 2010

Чтобы зарезервировать часть адресного пространства:

В Unix, sbrk () или mmap ().

В Windows VirtualAlloc ().

1 голос
/ 30 марта 2010

В Linux, BSD или OS X используйте malloc. Я думаю, что популярная реализация «jemalloc» во FreeBSD использует выделенный mmap для каждого региона 1 МБ или больше. Меньшие регионы по-прежнему поддерживаются mmap, поэтому они по-прежнему обеспечивают большую часть того же поведения, но когда вы free меньшие регионы, вы автоматически не отобразите их. Я думаю. Реализация glibc "dlmalloc", которая используется в Linux, также использует выделенный mmap для выделения по крайней мере 1 МБ, но я думаю, что он использует sbrk для небольших регионов. Malloc для Mac OS X также использует mmap, но я не уверен насчет конкретных параметров.

Указатель, полученный из большого malloc, будет указывать на общую страницу в ОЗУ, заполненную нулевыми байтами. Как только вы пишете на страницу в этом регионе, новая страница в физической памяти будет выделена и заполнена нулевыми байтами. Итак, вы видите, поведение по умолчанию malloc уже ленивое. Дело не в том, что страницы меняются местами с самого начала, а в том, что их там даже нет.

Если вы закончили с данными в регионе, вы можете использовать madvise с MADV_FREE. Это говорит ядру, что оно может освободить связанные страницы вместо их замены. Страницы остаются действительными, и как только вы напишите им, они превратятся в обычные страницы. Это как звонить free, а затем malloc.

Резюме: просто используйте malloc. Он делает то, что вы хотите.

...