在Mac上检索RAM信息?

时间:2012-01-08 23:08:47

标签: c++ objective-c c macos

我需要检索系统中存在的RAM总量以及当前使用的总RAM,因此我可以计算一个百分比。这类似于:Retrieve system information on MacOS X?

然而,在这个问题中,最佳答案建议如何通过阅读来获取RAM:

/usr/bin/vm_stat

由于我的程序的性质,我发现我无法从该文件中读取 - 我需要一种方法,它将为我提供RAM信息而无需简单地打开文件并从中读取。我正在寻找与函数调用有关的东西。这样的事情最好是:getTotalRam()getRamInUse()

我显然不希望它那么简单但我正在寻找除了从文件中读取之外的解决方案。

我正在运行Mac OS X Snow Leopard,但最好能获得适用于所有当前Mac OS X平台(即Lion)的解决方案。

解决方案可以是C ++,C或Obj-C,但是在我的情况下C ++是最好的解决方案,所以如果可能请尝试用C ++提供。

4 个答案:

答案 0 :(得分:10)

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位版本的界面。

答案 1 :(得分:7)

你不应该从/ usr / bin / vm_stat读取,而是你应该运行它;这是一个程序。看看前四行输出

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

在系统页面大小(由getpagesize()返回)中添加右列中的数字和多个数字,并获得系统中物理内存的总量(以字节为单位)。

vm_stat在Mac OS上不是setuid,所以我假设某个地方有一个非特权API来访问这些信息,而vm_stat正在使用它。但我不知道那个界面是什么。

答案 2 :(得分:5)

通过查看top命令的来源,您可以找出这个问题的答案。您可以从http://opensource.apple.com/下载源代码。 10.7.2来源以档案here或可浏览形式here提供。我建议下载存档并打开top.xcodeproj,以便您可以使用Xcode查找定义(在Xcode中按命令单击非常有用)。

top命令显示标签“PhysMem”后的物理内存(RAM)编号。在项目中搜索该字符串,我们在update_physmem的函数globalstats.c中找到它。它计算结构vm_stat的{​​{1}}成员的已用和可用内存数。

您可以命令 - 单击“vm_stat”,在libtop_tsamp_t中查找其声明为libtop_tsamp_t的元素。它被声明为类型libtop.h。按住Command键并单击跳转到vm_statistics_data_t中的定义。

在项目中搜索“vm_stat”,我们发现它已由/usr/include/mach/vm_statistics.h中的函数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的设置方式。我相信你能为自己解决这个问题。

答案 3 :(得分:3)

已经4年但我只是想在计算总RAM时添加一些额外的信息。

要获得总RAM,除Kyle Jones回答外,我们还应考虑Pages occupied by compressorPages speculative

您可以查看此问题post