Как получить общий объем свободной памяти в C в Linux? - PullRequest
6 голосов
/ 12 сентября 2011

В Java это просто:

Runtime.getRuntime().freeMemory()

Как это сделать в C?

Ответы [ 2 ]

5 голосов
/ 12 сентября 2011

Вы можете получить ограничение виртуальной памяти для процесса в Linux, используя getrlimit () с параметром RLIMIT_AS.

3 голосов
/ 12 сентября 2011

Ваши комментарии, кажется, указывают на то, что вы действительно хотите знать - это наибольшая память, которую malloc может выделить в одном блоке. Это будет приблизительно максимально допустимый размер виртуальной машины минус текущий размер виртуальной машины. Следующий код возвращает это:

#include <sys/resource.h>
#include <sys/time.h>
#include <stdint.h>

uint64_t get_total_free_mem()
{
    uint64_t vm_size = 0;
    FILE *statm = fopen("/proc/self/statm", "r");
    if (!statm)
        return 0;
    if (fscanf("%ld", &vm_size) != 1)
    {
        flcose(statm);
        return 0;
    }
    vm_size = (vm_size + 1) * 1024;

    rlimit lim;
    if (getrlimit(RLIMIT_AS, &lim) != 0)
        return 0;
    if (lim.rlim_cur <= vm_size)
        return 0;
    if (lim.rlim_cur >= 0xC000000000000000ull) // most systems cannot address more than 48 bits
        lim.rlim_cur  = 0xBFFFFFFFFFFFFFFFull;
    return lim.rlim_cur - vm_size;
}

Единственное исключение состоит в том, что в некоторых случаях getrlimit может возвращать 0xFFFFFFFFFFFFFFFF, однако большинство 64-битных систем не могут адресовать более 48 битов адреса, который будет использоваться, несмотря ни на что. Я учел это, но могут быть и другие крайние случаи, которые я пропустил. Например, 32-разрядные приложения обычно не могут выделять более 3 ГБ памяти, хотя это зависит от того, как было построено ядро.

Реальный ответ здесь - почему вы хотели бы сделать это. Обычно максимальная сумма, которую может выделить malloc, значительно больше, чем та, которую система может реально обработать. Когда вы вызываете malloc, система с радостью распределит любую запрашиваемую вами сумму (вплоть до лимита AS, который обычно не ограничен), даже если нет физического пространства или пространства подкачки. До тех пор, пока ваша программа не попытается выполнить запись в память (включая запись 0), память фактически не будет выделена из физической памяти или подкачки. Когда вы пишете в него, тогда система будет работать, чтобы выяснить, откуда взять память, и тогда вы можете столкнуться с проблемами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...