2014-02-13 9 views
1

При назначении значений большому массиву используемая память увеличивается, даже если новая память не выделяется. Я проверяю используемую память просто диспетчером задач (Windows) или системным монитором (Ubuntu).Растущая память при назначении большого массива

Проблема такая же на обеих ОС. Я использую gcc 4.7 или 4.6 соответственно.

Это мой код:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int i,j; 
    int n=40000000; //array size 
    int s=100; 
    double *array; 

    array=malloc(n*sizeof(double));  //allocate array 
    if(array==NULL){ 
     return -1; 
    } 

    for(i=0;i<n;i++){ //loop for array, memory increases during this loop 
     for(j=0;j<s;j++){ //loop to slow down the program 
      array[i] = 3.0; 
     } 
    } 
    return 0; 
} 

Я не вижу никакой логической проблемы, но к моему знанию я не превышают каких-либо ограничений системы либо. So мои вопросы таковы:

  • Проблема может быть воспроизведена другими?

  • В чем причина растущей памяти?

  • Как решить эту проблему?

+0

Я вижу, что нет массива! – haccks

+0

Да, это называется 'array'. – abligh

+0

@abligh; Вы имеете в виду имя переменной 'array'? Я говорю о структуре данных. – haccks

ответ

5

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

3

Вы должны увидеть, что виртуальная память используется для увеличения. После этого RSS или реальная память будут увеличиваться при записи в вновь выделенную память. Дополнительная информация на How to measure actual memory usage of an application or process?

Это потому, что память, выделенная в Linux и во многих других операционных системах, фактически не предоставляется вашей программе, пока вы ее не используете.

Итак, вы можете malloc 1 GB на машине с 256 Мбайт и не исчерпать память, пока не попытаетесь использовать все 1 ГБ.

В Linux существует группа настроек перекомпоновки, которая меняет это поведение. См. Cent OS: How do I turn off or reduce memory overcommitment, and is it safe to do it?

+0

OS определенно позволяет вам выделять больше виртуальной памяти, чем физически доступно для начала? – OJFord

+0

@OllieFord: По умолчанию да. Затем, когда программа использует всю доступную физическую и своп-память, она будет забита с удалением OOM. Недостаточно памяти. Но Linux позволяет вам изменить это на строгий режим, если вы этого хотите. –

+0

@ ZanLynx является правильным, за исключением того факта, что даже если вы отключите overcommit, размер резидента не будет равен виртуальному размеру при первом размещении. Он просто предотвращает сумму выделенных виртуальных размеров, превышающую физическую память. Таким образом * технически * это не изменяет поведение (виртуальная/физическая разница в распределении). – abligh

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