【问题标题】:Retrieve RAM info on a Mac?在 Mac 上检索 RAM 信息?
【发布时间】:2012-02-05 14:56:11
【问题描述】:

我需要检索系统中存在的 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++ 提供。

【问题讨论】:

  • 如果你不被允许读取/proc/meminfo,那么系统的物理内存统计可能不关你的事。
  • OS X 默认没有/proc
  • 我可以读取文件,但不能直接读取。如果一个系统功能需要它没关系,我只是不能自己手动做

标签: c++ objective-c c macos


【解决方案1】:

使用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

VM 统计数据只是稍微复杂一点:

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 位版本的接口。

【讨论】:

  • 谢谢。只有一个问题:物理内存和虚拟机有什么区别?
  • @Farhad:在这种情况下,虚拟内存还包括分页到磁盘的进程部分。 (也有不同的处理方式)。
  • 有没有办法只检查正在使用的物理 RAM? (我不希望包括磁盘交换)sysctl 提供总 RAM,但不提供实际使用的数量。
【解决方案2】:

您不应该从 /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 正在使用它。但我不知道那个接口是什么。

【讨论】:

  • 谢谢,这让我得到了系统中的总内存,但是我如何获得现在正在使用的总内存?
  • @Fahrhad - 这就是活动、非活动和有线页面的含义。好吧,取决于你对“二手”的定义。
  • @CarlNorum 抱歉,我对这一切都不是很熟悉。什么通常被认为是“使用过的 RAM”?它只是活动的和有线的,还是也包括非活动的页面?
  • 还有一件事。这不是与 RAM 相对的虚拟内存吗?据我了解,RAM 是内存,而虚拟内存是用作内存的存储,那么这会返回 RAM 还是虚拟内存? (考虑到名称是 virtual memory_stat)
  • @Farhad 这些数字是指物理内存,而不是虚拟内存。也许this support page from Apple 会帮助你。它说明了每个数字的含义。
【解决方案3】:

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

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

您可以命令单击“vm_stat”以在libtop.h 中找到它作为libtop_tsamp_t 成员的声明。它被声明为类型vm_statistics_data_t。命令点击跳转到/usr/include/mach/vm_statistics.h中的定义。

在项目中搜索“vm_stat”,发现是libtop.c中的函数libtop_tsamp_update_vm_stats填写的:

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;
}

如果你想调用host_statistics,你需要弄清楚libtop_port是如何设置的。我相信你可以自己解决这个问题。

【讨论】:

    【解决方案4】:

    已经 4 年了,但我只是想添加一些关于计算总 RAM 的额外信息。

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

    您可以查看此post 了解问题所在。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 1970-01-01
      • 2020-09-04
      • 2011-01-13
      • 2012-04-28
      • 2016-08-10
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多