максимальная память, которую может выделить malloc

Я пытался выяснить, сколько памяти я могу malloc до максимальной степени на моей машине (RAM на 1 Гбит 160 Гбит платформа Windows HD).

Я считал, что максимальная память malloc может выделить, ограничен физической памятью (на "куче").

Также, когда программа превышает потребление памяти к определенному уровню, компьютер прекращает работать, потому что другие приложения не получают достаточно памяти, которой они требуют.

Таким образом для подтверждения я записал небольшую программу в C:

int main(){  
    int *p;
    while(1){
        p=(int *)malloc(4);
        if(!p)break;
    }   
}

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

Я ожидал приблизительно в течение часа, и наконец я должен был вызвать, закрывает мой компьютер.

Некоторые вопросы:

  • malloc выделяет память от HD также?
  • Какова была причина вышеупомянутого поведения?
  • Почему не сделал разрыва замкнутой цепи ни в каком моменте времени?
  • Почему не был там никакой отказ выделения?
44
задан LittleBobbyTables 4 March 2013 в 18:34
поделиться

3 ответа

Я прочитал, что максимальный объем памяти, который malloc может выделить, ограничен физической памятью (в куче).

Неправильно: большинство компьютеров / ОС поддерживают виртуальную память, поддерживаемая дисковым пространством.

Некоторые вопросы: выделяет ли malloc память и с жесткого диска?

malloc спрашивает ОС, которая, в свою очередь, вполне может использовать некоторое дисковое пространство .

Что послужило причиной вышеуказанного поведения? виор? Почему цикл ни разу не прервался?

Почему не было сбоя при распределении?

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

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

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

47
ответ дан 26 November 2019 в 22:02
поделиться

malloc осуществляет собственное управление памятью, самостоятельно управляя небольшими блоками памяти, но в конечном итоге он использует функции кучи Win32 для выделения памяти. Вы можете думать о malloc как о «посреднике памяти».

Подсистема памяти Windows включает физическую память (RAM) и виртуальную память (HD). Когда физической памяти становится мало, некоторые страницы можно скопировать из физической памяти в виртуальную память на жестком диске. Windows делает это прозрачно.

По умолчанию виртуальная память включена и будет занимать доступное пространство на жестком диске. Итак, ваш тест будет продолжаться до тех пор, пока он либо не выделит для процесса полный объем виртуальной памяти (2 ГБ в 32-битных окнах), либо не заполнит жесткий диск.

6
ответ дан 26 November 2019 в 22:02
поделиться

На самом деле я не знаю, почему это не удалось, но один Следует отметить, что `malloc (4) 'на самом деле может не дать вам 4 байта, поэтому этот метод не совсем точный способ определения максимального размера кучи.

Я выяснил это из моего вопроса здесь .

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

{{1} }
3
ответ дан 26 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: