Что конкретно такое время настенных часов, время пользовательского процессора и системное время процессора в UNIX?


149

Я могу предположить, основываясь на названиях, но что конкретно такое время настенных часов, время пользовательского процессора и системное время процессора в UNIX?

Является ли время пользовательского процессора количеством времени, потраченным на выполнение кода пользователя, а время ядром-процессор - количеством времени, затраченным в ядре из-за необходимости выполнения привилегированных операций (например, ввода-вывода на диск)?

В какой единице времени это измерение.

И действительно ли время настенных часов - это количество секунд, которое процесс потратил на процессор, или название просто вводит в заблуждение?


Ответы:


151

Время настенных часов - это время, которое часы на стене (или секундомер в руке) будут измерять как прошедшее между началом процесса и «сейчас».

Время user-cpu и system-cpu в значительной степени, как вы сказали, - количество времени, потраченное на пользовательский код, и количество времени, потраченное на код ядра.

Единицы измерения - секунды (и подсекунды, которые могут быть микросекундами или наносекундами).

Время настенных часов - это не количество секунд, которое процесс потратил на процессор; это затраченное время, включая время, потраченное на ожидание включения ЦП (пока другие процессы запускаются).


18
Значит ли это, что время настенных часов всегда будет больше, чем время процессора?
Pacerier

40
@Pacerier: на одноядерной машине - да, но многоядерные машины и многопоточные программы могут использовать более 1 секунды ЦП за прошедшую секунду.
Джонатан Леффлер

@JonathanLeffler спасибо за ответ, я хотел получить количество прошедших наносекунд, но вычисление процессорного времени по формуле CPUtime = #clock_cycles / clock_rateне может быть таким же, как вычисление прошедшего времени. Вы знаете, могу ли я узнать прошедшее время из процессорного времени?
Bionix1441 06

2
@ Bionix1441: Вы не можете определить прошедшее время из процессорного времени по ряду причин. Во-первых, процесс может простаивать, не потребляя процессорного времени, в течение произвольных периодов (например, процесс-демон ожидает, пока клиент подключится к нему по сети), поэтому он может ничего не делать в течение нескольких дней за прошедшее время. . Во-вторых, если он запущен, он может иметь несколько потоков, а если он, скажем, имеет 4 потока и в системе 4 или более ядер, он может загружать 4 секунды затраченных усилий процессора на секунду затраченного времени. Они показывают, что не существует простой (или даже сложной) формулы, которую вы могли бы использовать.
Джонатан Леффлер

1
@Catbuilts: известно ли вам, что ядро ​​Unix работает отдельно от пользовательских программ. Когда ваша программа выполняет системный вызов (например, read()или getpid()), ядро ​​выполняет код от имени вашей программы. Ядро также выполняет упреждающую многозадачность, чтобы другие программы могли запускаться, и выполняет некоторые общие служебные действия, чтобы система работала бесперебойно. Этот код выполняется в «коде ядра» (также в «режиме ядра»). Это отличается от написанного вами кода и пользовательских библиотек (включая системную библиотеку C), которые вы запускаете.
Джонатан Леффлер,

36

Время на настенных часах: время, прошедшее по внутренним часам компьютера, должно соответствовать времени во внешнем мире. Это не имеет ничего общего с загрузкой процессора; это дано для справки.

Пользовательское время процессора и системное время: именно то, что вы думаете. Системные вызовы, которые включают вызовы ввода-вывода, такие как read, writeи т.д., выполняются путем перехода в код ядра и его выполнения.

Если время настенных часов <процессорного времени, значит, вы выполняете программу параллельно. Если время настенных часов> процессорного времени, вы ждете диска, сети или других устройств.

Все измеряются в секундах согласно СИ .


7

Время на настенных часах - это именно то, что написано, прошедшее время, измеренное часами на стене (или наручными часами)

User cpu time - это время, проведенное в "пользовательской зоне", то есть время, потраченное на неядерные процессы.

Системное время процессора - это время, затраченное на ядро, обычно время, затраченное на обслуживание системных вызовов.


7
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

настоящие или настенные часы

реальный 7м2.444с

В системе с 24-ядерным процессором эта команда / процесс заняла 7+ минут. Это за счет использования максимально возможного параллелизма со всеми заданными ядрами.

пользователь

пользователь 76m14.607s

Команда cmd / process использовала столько времени процессора. Другими словами, на машине с одноядерным процессором реальный и пользовательский будут примерно равны, поэтому выполнение одной и той же команды займет ~ 76 минут.

sys

sys 2m29.432s

Это время, необходимое ядру для выполнения всех операций базового / системного уровня для запуска этого cmd, включая переключение контекста, выделение ресурсов и т. Д.

Примечание. В этом примере предполагается, что ваша команда использует параллелизм / потоки.

Подробная справочная страница: https://linux.die.net/man/1/time


Учитывая количество публикаций, разве это не половина параллелизма? (Я просто пытаюсь (user + sys) / realпредставить это.
dtc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.