Умный ответ будет "да, выделение памяти может не сработать по любой причине". Это может быть не то, что вы ищете.
Как правило, наличие свободной памяти в вашей системе не имеет отношения к успешности выделения. Скорее, вопрос заключается в том, есть ли у вашего адресного пространства процесса свободное виртуальное адресное пространство.
Распределитель (malloc
, operator new
, ...) сначала проверяет, есть ли в текущем процессе свободное адресное пространство, которое уже сопоставлено, т. е. ядро знает, что адреса можно использовать. Если есть, это адресное пространство резервируется в распределителе и возвращается.
В противном случае ядру предлагается отобразить новое адресное пространство для процесса. Это может потерпеть неудачу, но обычно этого не происходит, поскольку сопоставление еще не подразумевает использование физической памяти — это просто обещание, что если кто-то попытается получить доступ к этому адресу, ядро попытается найти физическую память. памяти и настройте таблицы MMU, чтобы виртуальный->физический перевод нашел его.
Когда системе не хватает памяти, физической памяти не остается, процесс приостанавливается, и ядро пытается освободить физическую память, перемещая память других процессов на диск. Приложение этого не замечает, за исключением того, что выполнение одной ассемблерной инструкции, видимо, занимает много времени.
Выделение памяти в процессе завершается ошибкой, если нет достаточно большой сопоставленной свободной области, а ядро отказывается установить сопоставление. Например, не все виртуальные адреса пригодны для использования, так как большинство операционных систем сопоставляют ядро с каким-то адресом (обычно это 0x80000000, 0xc0000000, 0xe0000000 или что-то подобное в 32-битных архитектурах), поэтому существует предел для каждого процесса, который может быть ниже, чем ограничение системы (например, 32-разрядный процесс в Windows может выделить только 2 ГБ, даже если система 64-разрядная). Сопоставления файлов (например, самой программы и DLL) еще больше сокращают доступное пространство.
person
Simon Richter
schedule
21.11.2011