Как работает getrusage и что на самом деле находится внутри структуры rusage?

Я пытаюсь понять как

int getrusage(int who, struct rusage* usage)

работает для того, чтобы рассчитать время работы одной моей программы.
Я красную справочную страницу, может быть, 10 раз, и до сих пор не могу получить ее. Пытался найти что-то в Интернете, но ничего, кроме справочной страницы об этой функции, не найдено.
Что мне неясно, так это то, что хранится внутри структуры rusage - страница руководства не очень понятна - поэтому я попытался запустить ее с помощью отладчика и напрямую посмотреть, что внутри, но до сих пор не понимаю, в частности, как эти две структуры - timeval ru_utime и timeval ru_stime - работа.
То, что внутри них, принимает разные значения, иногда 0, другое 2000 и т. Д.

Я запустил простую программу с циклом for, которая постоянно выделяет и освобождает память. Я использовал секундомер, чтобы реально увидеть, сколько времени это займет, это заняло 5,23 секунды. Но то, что я вижу в этих структурах, кажется совершенно не связанным:

Перед циклом:
ru_utime = {tv_sec = 0, tv_usec = 1000}, ru_stime = {tv_sec = 0, tv_usec = 1000}
После цикла:
ru_utime = {tv_sec = 4, tv_usec = 677000}, ru_stime = {tv_sec = 0, tv_usec = 2000}

Итак, кто-нибудь может объяснить это мне или дать хорошую ссылку, где это объясняется?
Я буду очень благодарен.

1 ответ

Решение

Две подструктуры, которые вас интересуют, описаны следующим образом:

ru_utime Это общее количество времени, потраченное на выполнение в пользовательском режиме, выраженное в временной структуре (секунды плюс микросекунды).

ru_stime Это общее количество времени, потраченное на выполнение в режиме ядра, выраженное в временной структуре (секунды плюс микросекунды).

Для того, чтобы предотвратить перегрузку всей памяти, ваша система имеет два "уровня привилегий", называемых режимом ядра и режимом пользователя. Чтобы сделать это быстрым и простым, ваш пользовательский режим не может видеть всю память, он не может обмениваться данными с устройствами ввода-вывода и может действительно только выполнять обработку чисел. Для чего-то более сложного (например, выделение страниц памяти, чтение / запись файловой системы, печать объектов на экран), оно должно попросить ядро ​​сделать это вместо этого, у которого есть доступ ко всему этому. Это делается с помощью механизма, называемого "системные вызовы"; прочитайте эту статью вики для дальнейшего чтения: http://en.wikipedia.org/wiki/System_call

На высоком уровне ru_utime struct возвращает количество времени, которое ваша программа потратила на выполнение реальных вычислений, и ru_stime struct возвращает количество времени, в течение которого ваша программа ожидала ответа от ядра при доступе к диску, печати на экран и т. д.

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