2016-11-23 2 views
2

getrusage возвращает структура, содержащаяЕдиницы `ru_maxrss` на BSD?

long ru_maxrss;  /* max resident set size */ 

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

FreeBSD man page и OpenBSD man page говорят единицы в килобайтах:

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

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

ответ

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

Смежные вопросы