【发布时间】:2009-02-24 21:43:45
【问题描述】:
我们试图找出运行 Mac OS X 的机器上安装了多少物理内存。我们发现了 BSD 函数 sysctl()。问题是这个函数想要返回一个 32 位的值,但是一些 Mac 能够处理高达 32 GB 的地址,这不适合 32 位的值。 (实际上,即使 4 GB 也不适合 32 位值。)OS X(10.4 或更高版本)上是否有其他可用的 API 可以为我们提供此信息?
【问题讨论】:
我们试图找出运行 Mac OS X 的机器上安装了多少物理内存。我们发现了 BSD 函数 sysctl()。问题是这个函数想要返回一个 32 位的值,但是一些 Mac 能够处理高达 32 GB 的地址,这不适合 32 位的值。 (实际上,即使 4 GB 也不适合 32 位值。)OS X(10.4 或更高版本)上是否有其他可用的 API 可以为我们提供此信息?
【问题讨论】:
答案是使用 sysctl 来获取 hw.memsize,如上一个答案中所建议的那样。这是执行此操作的实际代码。
#include <sys/types.h>
#include <sys/sysctl.h>
...
int mib[2];
int64_t physical_memory;
size_t length;
// Get the Physical memory size
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length = sizeof(int64_t);
sysctl(mib, 2, &physical_memory, &length, NULL, 0);
【讨论】:
你试过谷歌搜索吗?
这似乎是答案: http://lists.apple.com/archives/scitech/2005/Aug/msg00004.html
sysctl() 确实有效,您只需要获取 hw.memsize 而不是 hw.physmem。 hw.memsize 会给你一个 uint64_t,所以没有 32 位问题。
【讨论】:
【讨论】:
sysctl hw.memsize 或 sysctl -a | grep mem
/usr/include/sys/sysctl.h cmets 了解更多信息。
或者,您可以添加来自 vm_statistics_data_t 的数据以获取总内存
vm_statistics_data_t vm_stat;
int count = HOST_VM_INFO_COUNT;
kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (integer_t*)&vm_stat, (mach_msg_type_number_t*)&count);
【讨论】:
#import <mach/mach.h> 修复了错误,并通过 host_statistics64 将函数更新为 64 位。