33

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

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

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

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

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

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

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

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

  • ли распределяющие таНос память от HD также?
  • В чем причина такого поведения?
  • Почему в какой-то момент времени не было перерыва?
  • Почему не было отказа от распределения?
+3

В любом случае, почему malloc (4) и почему не malloc (4096) или malloc (8192), иначе? –

+1

Конечно, это может быть все, что кратно размеру int. Не так ли? – Vikas

+1

[не выдавать результат malloc в C] (http://stackoverflow.com/q/605845/995714) –

ответ

44

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

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

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

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

В чем причина такого поведения? Почему в какой-то момент цикл не прерывался?

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

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

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

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

+2

Возможно, вы имели в виду "thrashing"? – RichieHindle

+0

Thanx для информации о распределении дискового пространства malloc. Я подозревал, что, но во многих статьях не упоминалось дисковое пространство и было написано, что malloc alllocates в куче и физической памяти. :) – Vikas

+0

@Richie Я также предполагаю, что Алекс имел в виду «избиение». – Vikas

3

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

я узнал от моего вопроса here.

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

+0

Действительно, malloc обычно дает кратное 16 байт. Существует две причины. Один из них заключается в том, что стандарт говорит, что malloc должен возвращать указатель, совместимый с любым выравниванием данных. Таким образом, адреса, разделенные менее чем 16 байтами, не возвращаются. Другая причина заключается в том, что освобожденные блоки обычно хранят некоторые данные, используемые для управления внутренней памятью, а блок слишком короткий - скажем, 4 байта - не смог его сохранить. – kriss

+0

@kriss [i] освобожденные блоки обычно хранят некоторые данные, используемые для управления внутренней памятью, а блок слишком короткий - скажем, 4 байта - не удалось сохранить. [/ I] Можете ли вы упомянуть, какие данные? – Vikas

+0

@Vikas: см. Обновление моего ответа. –

5

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

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

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

22

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

#include <stdlib.h> 

int main() { 
int *p; 
while(1) { 
    int inc=1024*1024*sizeof(char); 
    p=(int*) calloc(1,inc); 
    if(!p) break; 
    } 
} 

запустить

$ gcc memtest.c 
$ ./a.out 

После запуска этот код заполняет те, RAM пока не будет убито ядром. Использование calloc вместо malloc для предотвращения «ленивой оценки». Идеи, взятые из этой темы: Malloc Memory Questions

Этот код быстро заполнил мою оперативную память (4 ГБ), а затем примерно через 2 минуты мой раздел подкачки 20 Гб до его смерти. Конечно, 64-битный Linux.

+0

+1 Хороший ответ. – 2011-05-13 08:48:03

+2

Я просто попробовал ту же программу на машине с 192Gb памятью/4Gb swap. В течение минуты он потреблял до 175 ГБ, затем своп медленно заполнялся. Когда осталось только 24kb свопа, он был убит. – Sebastian

+1

То, что вы называете «ленивой оценкой», предположительно позволяет ядру использовать нулевую страницу для каждой страницы выделенной, но неписаной памяти. Сжатие (особенно для swap) и даже дедупликация (как в настоящее время выполняются некоторыми гипервизорами) могут уменьшить требуемую память.Конечно, у malloc есть накладные расходы на хранение, таблицы страниц добавляют накладные расходы, у программы есть память без кучи, операционная система использует память и т. Д. –

2

Согласно стандарту C90, вы можете получить хотя бы один объект размером 32 Кбайт, и это может быть статическая, динамическая или автоматическая память. C99 гарантирует не менее 64 Кбайт. Для любого более высокого предела обратитесь к документации вашего компилятора.

Кроме того, аргумент таНос является size_t и диапазон этого типа [0, SIZE_MAX], так что максимальная вы можете запрос является SIZE_MAX, значение которого зависит от реализации и определяется в <limits.h>.

4

Попробуйте

main() { 
    int Mb = 0; 
    while (malloc(1<<20)) ++Mb; 
    printf("Allocated %d Mb total\n", Mb); 
} 

Включите STDLIB и STDIO для него.
Этот экстракт взят из глубоких сектов секретов.

+0

Darn ... с обменом как 100Gb, вы подождете немного времени, прежде чем получите свой результат. И лучше не иметь ничего другого, работающего на вашем компьютере в то время! –

+1

В Linux с настройками виртуальной памяти по умолчанию ваша программа в конечном итоге будет убита (с SIGKILL), вместо того, чтобы 'malloc' фактически возвратил NULL. –

+0

Как и другие, это будет работать не так, как ожидалось. (Думаю, кому-то нужно писать секреты Deep Deep C Secrets). Он будет убит, а не будет возвращать нулевой указатель. В зависимости от вашей системы он также может использовать swap или даже пространство с дисковым пространством. И если ваша система использует избыточную память памяти вместе с ленивой оценкой выделенной памяти, она может легко обнаруживать поддержку десятков тысяч * гигабайт * и т. Д., Прежде чем запускать логику ОС, которая говорит, чтобы убить процесс из-за недостатка памяти , – ely

-1

, когда вы в первый раз выделяете любой размер * p, каждый раз, когда вы оставляете эту память незанятой. Это означает, что

в то время, программа выделяет память 4 байта только

. то как вы можете использовать всю оперативную память, поэтому SWAP-устройство (временное пространство на жестком диске) не обсуждается. Я знаю алгоритм управления памятью, в котором, когда ни одна программа не ссылается на блок памяти, этот блок имеет право выделять для запроса памяти программ. Вот почему вы просто занимаете RAM-драйвер, поэтому он не может дать возможность обслуживать другие программы. Кроме того, это болтающаяся справочная проблема.

Ans: Вы можете в большинстве случаев выделить память вашего размера оперативной памяти. Поскольку никакая программа не имеет доступа к устройству подкачки.

Надеюсь, что все ваши вопросы получили удовлетворительные ответы.

+2

Это просто неверно. Я попытался запустить 8Gb-распределения в цикле, ему удалось выполнить выделение 16382, то есть 128Tb - у меня не так много RAM. На самом деле даже не так много swap (см. Мой комментарий к принятому ответу). – skyking

+0

Возможно, из-за сжатой памяти? –

Смежные вопросы