выделение памяти и подкачка (под Windows)

извините за мой довольно общий вопрос, но я не смог найти на него определенного ответа:

Учитывая, что у меня осталась свободная память подкачки, и я выделяю память разумными кусками (~ 1 МБ) -> может ли выделение памяти по-прежнему не работать по какой-либо причине?


person Jakob S.    schedule 21.11.2011    source источник


Ответы (3)


Умный ответ будет "да, выделение памяти может не сработать по любой причине". Это может быть не то, что вы ищете.

Как правило, наличие свободной памяти в вашей системе не имеет отношения к успешности выделения. Скорее, вопрос заключается в том, есть ли у вашего адресного пространства процесса свободное виртуальное адресное пространство.

Распределитель (malloc, operator new, ...) сначала проверяет, есть ли в текущем процессе свободное адресное пространство, которое уже сопоставлено, т. е. ядро ​​знает, что адреса можно использовать. Если есть, это адресное пространство резервируется в распределителе и возвращается.

В противном случае ядру предлагается отобразить новое адресное пространство для процесса. Это может потерпеть неудачу, но обычно этого не происходит, поскольку сопоставление еще не подразумевает использование физической памяти — это просто обещание, что если кто-то попытается получить доступ к этому адресу, ядро ​​попытается найти физическую память. памяти и настройте таблицы MMU, чтобы виртуальный->физический перевод нашел его.

Когда системе не хватает памяти, физической памяти не остается, процесс приостанавливается, и ядро ​​​​пытается освободить физическую память, перемещая память других процессов на диск. Приложение этого не замечает, за исключением того, что выполнение одной ассемблерной инструкции, видимо, занимает много времени.

Выделение памяти в процессе завершается ошибкой, если нет достаточно большой сопоставленной свободной области, а ядро ​​отказывается установить сопоставление. Например, не все виртуальные адреса пригодны для использования, так как большинство операционных систем сопоставляют ядро ​​с каким-то адресом (обычно это 0x80000000, 0xc0000000, 0xe0000000 или что-то подобное в 32-битных архитектурах), поэтому существует предел для каждого процесса, который может быть ниже, чем ограничение системы (например, 32-разрядный процесс в Windows может выделить только 2 ГБ, даже если система 64-разрядная). Сопоставления файлов (например, самой программы и DLL) еще больше сокращают доступное пространство.

person Simon Richter    schedule 21.11.2011

Очень общий и теоретический ответ: нет, не может. Одна из причин, по которой это может произойти при очень специфических обстоятельствах, заключается в том, что будет какая-то странная фрагментация вашей доступной/распределяемой памяти. Мне интересно, пытаетесь ли вы получить (возможно, очень незначительное) повышение производительности (пропуская, если указатель == NULL - что-то вроде этого) или вам просто интересно и вы хотите обсудить это, и в этом случае вам, вероятно, следует использовать чат.

person ScarletAmaranth    schedule 21.11.2011

Да, выделение памяти часто дает сбой, когда у вас не хватает памяти в 32-битном приложении (может быть 2, 3 или 4 ГБ в зависимости от версии ОС и настроек). Это может быть связано с утечкой памяти. Это также может привести к сбою, если вашей ОС не хватает места в файле подкачки.

person Dave Markle    schedule 21.11.2011