【问题标题】:Determine physical mem size programmatically on OSX在 OSX 上以编程方式确定物理内存大小
【发布时间】:2009-02-24 21:43:45
【问题描述】:

我们试图找出运行 Mac OS X 的机器上安装了多少物理内存。我们发现了 BSD 函数 sysctl()。问题是这个函数想要返回一个 32 位的值,但是一些 Mac 能够处理高达 32 GB 的地址,这不适合 32 位的值。 (实际上,即使 4 GB 也不适合 32 位值。)OS X(10.4 或更高版本)上是否有其他可用的 API 可以为我们提供此信息?

【问题讨论】:

    标签: macos memory


    【解决方案1】:

    答案是使用 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);
    

    【讨论】:

    • 一个小修正:sizeof(int64) 应该是 sizeof(int64_t)
    【解决方案2】:

    你试过谷歌搜索吗?

    这似乎是答案: http://lists.apple.com/archives/scitech/2005/Aug/msg00004.html

    sysctl() 确实有效,您只需要获取 hw.memsize 而不是 hw.physmem。 hw.memsize 会给你一个 uint64_t,所以没有 32 位问题。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 脚本编写简单又好用!另外,如果您只想要内存:sysctl hw.memsizesysctl -a | grep mem
      • 注意:hw.physmem 和 hw.usermem 将为超过2GB RAM muc.lists.FreeBSD.hackers Discussion 的系统返回较小的值,请参阅/usr/include/sys/sysctl.h cmets 了解更多信息。
      【解决方案4】:

      或者,您可以添加来自 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);
      

      【讨论】:

      • 我在这里收到警告:“函数 'host_statistics' 的隐式声明在 C99 中无效”,我该如何解决这个问题?
      • #include
      • 感谢@valexa,但它不起作用,即使添加了 Kernel.framework,它也会在行上显示一个错误,说它不存在。该警告不是错误,因此它与不推荐使用的代码有关。也许你有一个想法?
      • 我通过包含#import &lt;mach/mach.h&gt; 修复了错误,并通过 host_statistics64 将函数更新为 64 位。
      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 2010-09-16
      • 2010-09-18
      • 1970-01-01
      • 2019-11-18
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多