Единицы `ru_maxrss` на BSD?

getrusage возвращает структуру, содержащую

long ru_maxrss;       /* max resident set size */

Каковы единицы ru_maxrss, на операционных системах BSD? Это значение в байтах или в килобайтах? Под "BSD" я подразумеваю FreeBSD, OpenBSD, но не Mac OS X / Darwin.

Справочная страница FreeBSD и справочная страница OpenBSD говорят, что единицы измерения в килобайтах:

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

Тем не менее, я знаю, что в Darwin / Mac OS X единицы измерения представлены в байтах (хотя онлайн-справочные страницы утверждают об обратном), и я также нашел в сети некоторые утверждения, которые утверждают о BSD ru_maxrss также возвращается в байтах (см., например, здесь). Что правильно?

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() вычисляет КБ от размера страницы.

Но кто поверит в источник ядра? Давайте запустим программу:

$ 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, поэтому не могут быть байтами.

Другие вопросы по тегам