Системный вызов sysinfo не возвращает правильное значение freeram - PullRequest
3 голосов
/ 24 января 2012

Я недавно написал следующий код C, используя системный вызов sysinfo для отображения системной статистики. Меня позабавило то, что переменная freeram структуры sysinfo не возвращает объем свободной оперативной памяти, а возвращает текущее использование оперативной памяти.Мне пришлось использовать обходной путь, чтобы показать правильное значение, вычитая freeram из totalram.Я пытался найти эту переменную, но безрезультатно.Любое понимание этого странного поведения было бы очень полезно.

/*
 * C program to print the system statistics like system uptime, 
 * total RAM space, free RAM space, process count, page size
 */

#include <sys/sysinfo.h>    // sysinfo
#include <stdio.h>
#include <unistd.h>     // sysconf
#include "syscalls.h"       // just contains a wrapper function - error

int main()
{
    struct sysinfo info;

    if (sysinfo(&info) != 0)
        error("sysinfo: error reading system statistics");

    printf("Uptime: %ld:%ld:%ld\n", info.uptime/3600, info.uptime%3600/60, info.uptime%60);
    printf("Total RAM: %ld MB\n", info.totalram/1024/1024);
    printf("Free RAM: %ld MB\n", (info.totalram-info.freeram)/1024/1024);
    printf("Process count: %d\n", info.procs);
    printf("Page size: %ld bytes\n", sysconf(_SC_PAGESIZE));

    return 0;
}

Ответы [ 3 ]

3 голосов
/ 24 января 2012

Поле «свободный баран» для большинства людей не имеет смысла.Самое близкое значение к реальному значению "free ram" - это взять поля из /proc/meminfo и вычесть Committed_AS из MemTotal.Результат может быть отрицательным, если используется своп (это означает, что выделено больше памяти, чем уместится в физической памяти);если вы также хотите считать swap как память, просто используйте MemTotal+SwapTotal как общее значение.

1 голос
/ 29 января 2017

вам нужно умножить на mem_unit.

1 голос
/ 24 января 2012

Удалить

#include "syscalls.h"

Может быть, вы где-то позаимствовали код и отредактировали. Двойные кавычки используются для импорта неофициальных заголовочных файлов. Этот пользовательский заголовочный файл на самом деле не требуется.

Это не нужно. Ваш код будет работать нормально.

На моем ПК значение freeram $free -m совпадает с info.freeram программы. По-видимому, Freeram это не то, что вы думаете, это показывает.

Подробнее о http://www.redhat.com/advice/tips/meminfo.html

MemFree - это свободная память, а MemFree + Buffers + Cached - доступная память (которую вы хотите). Итак, вы просто неправильно поняли термин «фрирам».

...