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

149

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

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

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

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

Джон Хамфрис - w00te
источник
Возможный дубликат. Что означают слова real, user и sys на выходе time (1)?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

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