распределение памяти и обмен (под Windows) - PullRequest
2 голосов
/ 21 ноября 2011

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

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

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

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

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

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

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

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

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

0 голосов
/ 21 ноября 2011

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

0 голосов
/ 21 ноября 2011

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

...