【问题标题】:Units of `ru_maxrss` on BSD?BSD 上的“ru_maxrss”单位?
【发布时间】:2016-11-23 20:49:43
【问题描述】:

getrusage 返回一个包含

的结构体
long ru_maxrss;       /* max resident set size */

在 BSD 操作系统上,ru_maxrss 的单位是什么?这个值是以字节为单位还是以千字节为单位? “BSD”是指 FreeBSD、OpenBSD,但不是 Mac OS X / Darwin。

FreeBSD man pageOpenBSD man page 表示单位为千字节:

 ru_maxrss    the maximum resident set size utilized (in kilobytes).

但是,我知道在 Darwin / Mac OS X 上,单位以字节为单位(即使在线手册页另有声明),而且我还在网上找到了一些声明,声称 BSD ru_maxrss 也以字节为单位返回(参见例如here)。哪个是正确的?

【问题讨论】:

    标签: c memory memory-management bsd getrusage


    【解决方案1】:

    在 FreeBSD 上,它以千字节为单位,如 kern_clock.c 中的源代码所示:

    /* Update resource usage integrals and maximums. */
    MPASS(p->p_vmspace != NULL);
    vm = p->p_vmspace;
    ru = &td->td_ru;
    ru->ru_ixrss += pgtok(vm->vm_tsize) * cnt;
    ru->ru_idrss += pgtok(vm->vm_dsize) * cnt;
    ru->ru_isrss += pgtok(vm->vm_ssize) * cnt;
    rss = pgtok(vmspace_resident_count(vm));
    if (ru->ru_maxrss < rss)
        ru->ru_maxrss = rss;
    

    pgtok() 根据页面大小计算 kb。

    但是谁会相信内核源代码呢?让我们运行一个程序:

    $ cat x.c
    #include <sys/types.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <stdio.h>
    
    int main(void)
    {
        struct rusage r;
    
        if (getrusage( RUSAGE_SELF, &r) == 0) {
           printf ("ru_maxrss=%lu\n", (unsigned long)r.ru_maxrss);
        }
        return 0;
    }
    $ ./a.out
    ru_maxrss=5824
    $ ./a.out
    ru_maxrss=0
    $ ./a.out
    ru_maxrss=216
    $ ./a.out
    ru_maxrss=1880
    

    这些数字不是 1024 的倍数,所以不能是字节。

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多