Получить информацию об оперативной памяти на Mac? - PullRequest
5 голосов
/ 09 января 2012

Мне нужно получить общий объем оперативной памяти, присутствующей в системе, и общий объем используемой оперативной памяти, чтобы я мог рассчитать процент.Это похоже на: Получить системную информацию на MacOS X?

Однако в этом вопросе лучший ответ предлагает, как получить ОЗУ, читая:

/usr/bin/vm_stat

Из-за характера моей программы я обнаружил, что я не могу прочитать этот файл - мне нужен метод, который предоставит мне информацию об оперативной памяти, не открывая файл и не читая его.Я ищу что-то связанное с вызовами функций.Что-то вроде этого желательно: getTotalRam() и getRamInUse().

Я, очевидно, не ожидаю, что это будет так просто, но я искал решение, отличное от чтения из файла.

IЯ использую Mac OS X Snow Leopard, но желательно получить решение, которое будет работать на всех текущих платформах Mac OS X (например, Lion).

Решения могут быть на C ++, C или Obj-C, однако C ++ будетнаилучшее из возможных решений в моем случае, поэтому, если возможно, попробуйте предоставить его на C ++.

Ответы [ 4 ]

10 голосов
/ 09 января 2012

Получить физическую память машины просто с помощью sysctl:

int mib [] = { CTL_HW, HW_MEMSIZE };
int64_t value = 0;
size_t length = sizeof(value);

if(-1 == sysctl(mib, 2, &value, &length, NULL, 0))
    // An error occurred

// Physical memory is now in value

Статистика ВМ только немного сложнее:

mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
vm_statistics_data_t vmstat;
if(KERN_SUCCESS != host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count))
    // An error occurred

Затем вы можете использовать данные в vmstat для получения необходимой информации:

double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count;
double wired = vmstat.wire_count / total;
double active = vmstat.active_count / total;
double inactive = vmstat.inactive_count / total;
double free = vmstat.free_count / total;

Существует также 64-битная версия интерфейса.

7 голосов
/ 09 января 2012

Вы не должны читать из / usr / bin / vm_stat, скорее вы должны его запустить; это программа. Посмотрите на первые четыре строки вывода

Pages free:                  1880145.
Pages active:                  49962.
Pages inactive:                43609.
Pages wired down:             123353.

Добавьте числа в правом столбце и умножьте их на размер системной страницы (как возвращает getpagesize ()), и вы получите общий объем физической памяти в системе в байтах.

vm_stat не установлен в Mac OS, поэтому я предполагаю, что где-то есть непривилегированный API для доступа к этой информации, и vm_stat использует ее. Но я не знаю, что это за интерфейс.

5 голосов
/ 09 января 2012

Вы можете найти ответ на этот вопрос, посмотрев на источник команды top. Вы можете скачать исходный код с http://opensource.apple.com/. Источник 10.7.2 доступен в виде архива здесь или в виде для просмотра здесь . Я рекомендую скачать архив и открыть top.xcodeproj, чтобы вы могли использовать XCode для поиска определений (щелчок по команде в XCode очень полезен).

Команда top отображает номера физической памяти (ОЗУ) после метки «PhysMem». Ища проект для этой строки, мы находим ее в функции update_physmem в globalstats.c. Он вычисляет номера использованной и свободной памяти из vm_stat члена struct libtop_tsamp_t.

Вы можете щелкнуть по команде "vm_stat", чтобы найти ее декларацию как libtop_tsamp_t в libtop.h. Он объявлен как тип vm_statistics_data_t. Щелчок по команде, который переходит к определению в /usr/include/mach/vm_statistics.h.

При поиске в проекте слова "vm_stat" мы обнаруживаем, что он заполняется функцией libtop_tsamp_update_vm_stats в libtop.c:

mach_msg_type_number_t count = sizeof(tsamp->vm_stat) / sizeof(natural_t);
kr = host_statistics(libtop_port, HOST_VM_INFO, (host_info_t)&tsamp->vm_stat, &count);
if (kr != KERN_SUCCESS) {
    return kr;
}

Вам нужно будет выяснить, как установлена ​​libtop_port, если вы хотите позвонить host_statistics. Я уверен, что вы сами в этом разберетесь.

3 голосов
/ 02 августа 2016

Прошло 4 года, но я просто хотел добавить дополнительную информацию о расчете общего объема ОЗУ.

Чтобы получить общий объем ОЗУ, мы также должны рассмотреть Pages occupied by compressor и Pages speculative в дополнение к Кайл Джонс ответ.

Вы можете проверить этот пост о том, где проблема возникает.

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