C - хотел узнать максимальный объем памяти, выделяемый в программе - PullRequest
3 голосов
/ 31 октября 2010

Я новичок в C

Я хотел узнать максимальный объем памяти, разрешенный приложением.Поэтому я написал небольшую программу, подобную следующей:

У меня есть машина с общим объемом памяти 16 ГБ, используется 2 ГБ, и 14 ГБ свободно.Я ожидал, что эта программа остановится на 14 ГБ, но она будет работать вечно.

Хотите, я здесь ошибаюсь?

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

int main(){
    long total = 0;
    void* v = malloc(1024768);

    while(1) {
        total += 1024768;
        printf ( "Total Memory allocated : %5.1f GB\n", (float)total/(1024*1024768) );
        v = realloc(v, total);
        if (v == NULL) break;
    }
} 

Редактировать: запуск этой программы на CentOS 5.4 64 бит.

Ответы [ 3 ]

5 голосов
/ 31 октября 2010

В большинстве современных операционных систем память выделяется для каждой используемой страницы, а не для каждой страницы, которая «зарезервирована». Ваш код не использует никаких страниц, поэтому память не выделяется.

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

Я пытался найти цитату для этого, но безуспешно. Помощь в этом приветствуется!

4 голосов
/ 31 октября 2010

Хотите, я здесь не так делаю?

Хорошо, вы говорите, что на машине, на которой вы запускаете приложение, есть 16 ГБ ОЗУ, поэтому я предполагаю, что она 64-битная,Это означает, что ваше приложение будет работать целую вечность, прежде чем оно исчерпает 1 / физическую память и 2 / виртуальную память.

В 32-битной Windows ваше приложение остановится на 4 ГБ.В 64-битной Windows ваше приложение остановится на 16 ТБ (при условии, что у вас есть файл подкачки, который может автоматически увеличиваться, и столько места на жестком диске).

http://support.microsoft.com/kb/294418

YMMV с другими операционнымисистем.

Редактировать : ruslik указывает, что на практике ваш процесс не сможет выделить память объемом до 2 ГБ или 3 ГБ (в зависимости от того, как ваш двоичный файлскомпилировано) на 32-битной Windows.Из статьи КБ, на которую я ссылаюсь выше, максимальный объем памяти, который будет занимать ваш процесс, составляет 3 ГБ или 4 ГБ, при этом 1 ГБ принадлежит ОС, которую вы не можете использовать.

1 голос
/ 31 октября 2010

Если вы работаете на одной конкретной платформе / ОС, вам следует использовать функции отчетов, специально предназначенные для этой ОС.

Если вы используете кроссплатформенную программу, вам не следует полагаться на свободную памятьалгоритм проверки.Причины таковы:

  1. ОС может отказать в предоставлении всей доступной памяти по своим собственным причинам: фрагментация, ограничения на выделение ресурсов и т.если он имеет VMM.
  2. Алгоритм может изменить внутреннее состояние MM, поэтому объем доступной памяти до и после вызова для проверки может отличаться.
  3. Поскольку ОС запускает несколько процессов параллельно, доступная память может бытьизменился самопроизвольно из-за другой активности процесса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...