一个C可执行文件在两台不同的Linux计算机上如何进行资源分配

3

我在两台不同的Linux电脑上(一台是华为笔记本,8GB内存,运行Arch系统,另一台是iMac 2017,32GB内存,运行Ubuntu系统)编译和运行了下面这个C语言文件。

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

long get_mem_usage()
{
    struct rusage myusage;
    getrusage(RUSAGE_SELF, &myusage);
    return myusage.ru_maxrss;
}

int main()
{
    printf("usage: %ld\n", get_mem_usage());
    return 0;
}

编译器为: gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1
gcc (Arch Linux 9.3.0-1) 9.3.0
在Ubuntu上,我一直得到:
usage: 2432
usage: 2432
usage: 2432

在 Arch 上,输出结果不一致且更加庞大:

usage: 100584
usage: 100964
usage: 100524

我对为什么这两台计算机/发行版之间的这些值有如此大的差异感到相当困惑。这种内存分配模式的原因是什么?是编译器分配了这些内存资源吗?还是内核决定了内存分配?


关于调试get_mem_usage的一些想法,可以参考这个旧问题,例如保持进程运行并在proc下检查maps和smaps。然而,原因是由链接库中的静态初始化引起的,我猜你没有这样做。我假设你的Arch安装使用glibc,并进行动态链接? - Rup
@Rup 你分享的链接非常有用!我猜可能有一些进程在共享内存。我重新启动了系统并在我的笔记本电脑上再次运行可执行文件。现在它显示“1500”。我需要进行调查并确认这一点。 - Shahin
1个回答

1
可执行文件很可能与其他几个进程共享内存。我停止了桌面环境并终止了大部分不需要的程序,最终得到了一个稳定的值为1500。但是启用桌面管理器后,分配给该进程的内存大小会有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接