Я пытался выяснить, сколько памяти я могу malloc до максимальной степени на моей машине (RAM на 1 Гбит 160 Гбит платформа Windows HD).
Я считал, что максимальная память malloc может выделить, ограничен физической памятью (на "куче").
Также, когда программа превышает потребление памяти к определенному уровню, компьютер прекращает работать, потому что другие приложения не получают достаточно памяти, которой они требуют.
Таким образом для подтверждения я записал небольшую программу в C:
int main(){
int *p;
while(1){
p=(int *)malloc(4);
if(!p)break;
}
}
Я надеялся, что будет время, когда выделение памяти перестало бы работать, и цикл повредится, но мой компьютер завис, поскольку это был бесконечный цикл.
Я ожидал приблизительно в течение часа, и наконец я должен был вызвать, закрывает мой компьютер.
Некоторые вопросы:
Я прочитал, что максимальный объем памяти, который
malloc
может выделить, ограничен физической памятью (в куче).
Неправильно: большинство компьютеров / ОС поддерживают виртуальную память, поддерживаемая дисковым пространством.
Некоторые вопросы: выделяет ли
malloc
память и с жесткого диска?
malloc
спрашивает ОС, которая, в свою очередь, вполне может использовать некоторое дисковое пространство .
Что послужило причиной вышеуказанного поведения? виор? Почему цикл ни разу не прервался?
Почему не было сбоя при распределении?
Вы просто просили слишком мало за раз: цикл в конце концов разорвался бы (намного позже, чем ваша машина замедлилась до сканирование из-за большого избытка виртуальной памяти по сравнению с физической и, как следствие, сверхчастого доступа к диску (проблема, известная как «перегрузка»), но это истощило ваше терпение задолго до этого. Попробуйте получить, например, вместо этого мегабайт за раз.
Когда программа превышает потребление памяти до определенного уровня, компьютер перестает работать, потому что другие приложения не получают достаточно памяти, которая им требуется.
Полная остановка маловероятна, но когда операция, которая обычно занимает несколько микросекунд, в конечном итоге занимает (например) десятки миллисекунд, эти четыре порядка величины, безусловно, могут вызвать ощущение , как будто компьютер в основном прекратились, и то, что обычно занимает минуту, может занять неделю.
malloc
осуществляет собственное управление памятью, самостоятельно управляя небольшими блоками памяти, но в конечном итоге он использует функции кучи Win32 для выделения памяти. Вы можете думать о malloc
как о «посреднике памяти».
Подсистема памяти Windows включает физическую память (RAM) и виртуальную память (HD). Когда физической памяти становится мало, некоторые страницы можно скопировать из физической памяти в виртуальную память на жестком диске. Windows делает это прозрачно.
По умолчанию виртуальная память включена и будет занимать доступное пространство на жестком диске. Итак, ваш тест будет продолжаться до тех пор, пока он либо не выделит для процесса полный объем виртуальной памяти (2 ГБ в 32-битных окнах), либо не заполнит жесткий диск.
На самом деле я не знаю, почему это не удалось, но один Следует отметить, что `malloc (4) 'на самом деле может не дать вам 4 байта, поэтому этот метод не совсем точный способ определения максимального размера кучи.
Я выяснил это из моего вопроса здесь .
Например, когда вы объявляете 4 байта памяти, пространство непосредственно перед вашей памятью может содержать целое число 4, как указание ядру того, сколько памяти вы запросили.
{{1} }