【问题标题】:sysinfo returns incorrect value for freeram (even with mem_unit)sysinfo 为 freeram 返回不正确的值(即使使用 mem_unit)
【发布时间】:2012-12-30 00:51:27
【问题描述】:

我的完整 C MATE 小程序可以在 github 上找到:https://github.com/geniass/mate-resource-applet/tree/cmake (BRANCH CMAKE)。现在是一团糟,所以请看下面的代码。

我找不到一个小程序来显示我计算机的空闲内存,所以基本上就是这样。我正在使用 sysinfo 获取此信息,它适用于我系统的总内存(大约 4GB,显示 3954 MB)。 htop 显示 3954 MB 中使用了 3157 MB。

但是,sysinfo 为空闲内存(136 MB)给出的值显然是错误的(如果空闲内存是尚未分配的内存或其他什么,我不知道)。

This question 是同样的问题,但是涉及 mem_unit 的解决方案不起作用,因为我的系统上的 mem_unit = 1。

这是一个给出相同值的最小程序:

#include <stdio.h>
#include <sys/sysinfo.h>


int main() {
    /* Conversion constants. */
    const long minute = 60;
    const long hour = minute * 60;
    const long day = hour * 24;
    const double megabyte = 1024 * 1024;
    /* Obtain system statistics. */
    struct sysinfo si;
    sysinfo (&si);
    /* Summarize interesting values. */
    printf ("system uptime : %ld days, %ld:%02ld:%02ld\n", 
            si.uptime / day, (si.uptime % day) / hour, 
            (si.uptime % hour) / minute, si.uptime % minute);
    printf ("total RAM   : %5.1f MB\n", si.totalram / megabyte);
    printf ("free RAM   : %5.1f MB\n", si.freeram / megabyte);
    printf ("mem_unit:   : %u\n", si.mem_unit);
    printf ("process count : %d\n", si.procs);
    return 0;
}

输出:

system uptime : 0 days, 10:25:18
total RAM   : 3953.9 MB
free RAM   : 162.1 MB
mem_unit:   : 1
process count : 531

这里发生了什么? freeram 不是我想的那样吗?

【问题讨论】:

  • 嗯...你如何定义“空闲内存”?!
  • 如果 Linux 在 RAM 中保留了一些东西,即使它没有必要(它可以随时丢弃它们),那么这些 RAM 是空闲的还是已使用的?
  • @KerrekSB 那么 htop 如何定义“空闲内存”?关于 Linux 将内容保存在内存中,我会说...免费?
  • Linux 使用大量空闲内存作为缓冲区的缓存 - 并在应用程序需要时自动释放缓冲区分配的内存。见blog.scoutapp.com/articles/2010/10/06/…
  • @ring0 感谢这对 Linux 来说很有意义。您应该将其添加为答案(添加 tbebuffers 和缓存以获得总可用内存)

标签: c linux sysinfo


【解决方案1】:

Linux 不喜欢 free 内存无处使用。因此,当有空闲内存可用时,它会暂时将其用作 cache 内存和缓冲区。 可用内存似乎非常低,但一旦程序需要内存,Linux 就会减少其缓存/缓冲区的使用并为程序提供所需的内容。

Linux 命令free -m 显示内存、缓存和缓冲区的状态。

请参阅this link 了解示例和详细信息。

【讨论】:

  • 刚刚意识到sysinfo没有cachedram,只有bufferram。所以我就用 /proc/meminfo 吧。
猜你喜欢
  • 2012-02-17
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多