Почему время «user» и «sys» различается при нескольких выполнениях?

Почему время «user» и «sys» различается при нескольких выполнениях?

Есть хорошийвопрос и ответобъясняя взаимосвязь между «реальным», «пользователем» и «системой».

В нем объясняются причины, по которым «реальное» время может меняться, и определяются «пользователь» и «система» как время, фактически затраченное процессом на выполнение на процессоре.

Давайте теперь полностью проигнорируем 'real'. Я заметил, что при запуске одного и того же приложения несколько раз, оно выдает разные 'sys' и 'user'.

$time dummy_app
user    0m0.032s
sys     0m0.064s

$time dummy_app
user    0m0.020s
sys     0m0.084s

Dummy_app — это просто цикл for, который считает от 0 до 100000.

В чем причина того, что выполнение одного и того же двоичного файла будет тратить разное время на процессор? Другими словами, почему 'user' и 'sys' не всегда одинаковы для одного и того же приложения?

решение1

Почему время выполнения одного и того же двоичного файла различается при нескольких запусках

Ключевой проблемой здесь является недетерминированное поведение из-за способа работы ЦП. Современные суперскалярные ЦП могут выполнять несколько инструкций одновременно или изменять порядок выполнения команд (внеочередное выполнение). Что касается вашего примера, возможно, также применяется оптимизация использования кэша. Оперативная память на несколько порядков медленнее самого ЦП, поэтому используется интенсивное кэширование. Второй запуск вашего двоичного файла может выполняться в кэше, тем самым потребляя меньше циклов ЦП (циклов, которые ЦП ждал бы, пока данные будут извлечены из памяти).

О разнице реальной, пользовательской и системной статистики времени процесса

Одна из этих вещей не похожа на другую. Real относится к фактическому прошедшему времени; User и Sys относятся к использованному процессорному временитолько процессом.

  • Настоящийэто время по часам — время от начала до конца вызова. Это все прошедшее время, включая временные интервалы, используемые другими процессами, и время, которое процесс проводит в заблокированном состоянии (например, если он ожидает завершения ввода-вывода).

  • Пользовательэто количество процессорного времени, затраченногов пользовательском режимекод (вне ядра)в пределахпроцесс. Это только фактическое время ЦП, используемое для выполнения процесса. Другие процессы и время, которое процесс тратит на блокировку, не учитываются в этом показателе.

  • Сисэто количество процессорного времени, затраченногов ядрев процессе. Это означает выполнение процессорного времени, затраченного на системные вызовывнутри ядра,в отличие от библиотечного кода, который все еще выполняется в пользовательском пространстве. Как и 'user', это только процессорное время, используемое процессом. Ниже приведено краткое описание режима ядра (также известного как режим 'supervisor') и механизма системных вызовов.

User+Sysпокажет вам, сколько фактического времени ЦП использовал ваш процесс. Обратите внимание, что это относится ко всем ЦП, поэтому если у процесса несколько потоков, он может потенциально превысить время настенных часов, сообщаемое Real. Обратите внимание, что в выходных данных эти цифры включают Userи Sysвремя всех дочерних процессов (и их потомков), а также когда они могли быть собраны, например, wait(2)или waitpid(2), хотя базовые системные вызовы возвращают статистику для процесса и его потомков отдельно.

Источник

Связанный контент