【问题标题】:How can the physical RAM size be determined in Linux programatically?如何在 Linux 中以编程方式确定物理 RAM 大小?
【发布时间】:2010-12-19 13:31:10
【问题描述】:

在命令行上,可以使用“free”实用程序和“cat /proc/meminfo”找到它。 在 Linux 中以编程方式找出物理 RAM 大小的不同方法是什么:

  1. 用户空间应用程序
  2. 内核模块

有哪些 API 调用可用?

【问题讨论】:

  • 如果重复,请指出类似的问题,然后可以关闭。

标签: linux memory linux-kernel


【解决方案1】:
#include <unistd.h>

long long physical_mem_bytes = (long long) sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

除了命令行 ulimit,我不知道找到单个进程最大内存的方法。

【讨论】:

  • 我不是在寻找特定进程的内存大小,而是整个物理 RAM。
  • 注意,如果编译成 32 架构并在 64 位机器上执行,这可能会溢出,这可能超过 2^32 字节。发生在我身上。最好将这两个值都转换为 uint64_t 或 long long。
  • "除了命令行 ulimit..." -> 如果 ulimit 可以显示信息,ulimit 源代码将展示我们如何获取这些数字。
【解决方案2】:

以编程方式,Linux 不会告诉您实际的物理大小。相反,您应该从 SMBIOS 读取此信息,例如,

sudo dmidecode -t memory | fgrep -ie 'size:'

这将为您提供如下结果(来自具有 4 个 RAM 组的盒子,仅安装了 2 个):

Maximum Memory Module Size: 16384 MB
Maximum Total Memory Size: 65536 MB
Installed Size: 2048 MB (Single-bank Connection)
Enabled Size: 2048 MB (Single-bank Connection)
Installed Size: Not Installed
Enabled Size: Not Installed
Installed Size: 2048 MB (Single-bank Connection)
Enabled Size: 2048 MB (Single-bank Connection)
Installed Size: Not Installed
Enabled Size: Not Installed
Size: 2048 MB
Size: No Module Installed
Size: 2048 MB
Size: No Module Installed

添加报告的大小(或Enabled Sizes,但某些 BIOS 凭经验不会报告)以获得(在这种情况下)4096 MB。 (自动解析和算术的代码加分,但你可以在你的脑海中几乎同样可靠地做到这一点。)

要检查您的计算,请运行

fgrep -e 'MemTotal:' /proc/meminfo

/proc/meminfo 报告的值不应大于您从dmidecode 计算的值。在这种情况下,凭经验我得到

MemTotal:        3988616 kB

【讨论】:

  • 这个问题的字面解释比我想的要多。确实,内核的可见/可用内存和机器机箱上的物理 DRAM 数量不需要相同。但几乎在所有情况下,程序员感兴趣的都是前一个数字。
  • 从经验证据调用 sysconf 将为您提供诸如 2037mb 之类的值。使用 SMBIOS,您将得到正确的答案,例如 2048mb,保证。此外,您可以在用户空间和内核代码之间共享代码,解析是一样的。
  • 但正如我所指出的,内核可能会或可能不会使用该物理内存,即使它在板上并由固件公开。检查 /proc/meminfo 的问题“有多少 DRAM 可用”的正确答案。仅当您询问有关硬件配置而不是软件调整的问题时,您的答案才是正确的。我对问题上下文的理解并非如此。
  • 我认为 Jared 的回答很有道理。它确实给出了确切的值。只是 API 调用可能不可用。
【解决方案3】:

cat /proc/meminfo

【讨论】:

  • 你刚刚从问题中得到了这个:-p
  • 嗯,早上的咖啡太少了。但是从应用程序中读取和解析 /proc/meminfo 有什么问题呢?
  • 绝对没有。从 /proc 文件系统读取和解析是一个成熟的 Linux 内核编程接口。
【解决方案4】:

特别是从记忆中,我从 Jared 所说的内容中得到了这个结果 sudo dmidecode -t memory 在那里你可以阅读每个单独的内存插槽的规格,所以你会读到类似 2048MB 的东西,在我的情况下,我有 2 个是 4gb,尽管我的非 PAE 内核只显示大约 3.3gb,所有其他应用程序都不会说真正的物理内存,只有 dmidecode,谢谢!

【讨论】:

  • 这句话好长啊!下次写答案时,您能花时间格式化吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多