2014-12-21 9 views
2

Я пытаюсь понять, какКак работает getrusage и что действительно внутри структуры rusage?

int getrusage(int who, struct rusage* usage) 

работы для того, чтобы рассчитать время одной моей программы.
Я краю страницу руководства, возможно, 10 раз, и все равно не могу ее получить. Пытался найти что-то в Интернете, но ничего, кроме справочной страницы об этой функции не найдено.
Что мне непонятно, так это то, что хранится внутри структуры rusage - страница руководства не очень ясна - поэтому я попытался запустить ее с помощью отладчика и посмотреть, что внутри, но все еще не понимаю, особенно, как два structs - 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}

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

ответ

4

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

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

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

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

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

+0

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

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

+1

Этот вид имеет смысл.Распределение памяти (через 'malloc') фактически выполняется в пользовательском пространстве, и оно запрашивает ядро ​​больше, если у него заканчивается внутреннее пространство буфера, и, следовательно, только небольшое изменение в времени ядра. Это означает, что 4.6s в пользовательской земле (ish). Остальное, вероятно, связано с тем, что другие задачи выполняются во время тестирования; вы не получаете полный непрерывный доступ к CPU! – slugonamission

+0

Итак, я должен учитывать только разницу между ru_utime до и после? ru_stime, похоже, не связано? – Root149