2

Я запускаю программу на сервере Linux, а также рассчитываю время ее использования по времени команды.

Глядя на окончательный вывод, я запутался, так как подумал «реальный = sys+ пользователь» или он хотя бы приблизительно выполняется. Здесь приходит его вывод

настоящий 189m6.807s

пользователь 1173m6.203s

sys 3m6.508s

"Sys +user" измеряется в другой единице, чем "реальная"?

Почему "пользователь" намного больше, чем "реальный"? Разве это не должно быть меньше?

Я признаю, что на самом деле не так правильно понимаю эти времена, как думал. Так что любое объяснение приветствуется!

2 ответа2

7

Real, User и Sys обрабатывают статистику времени

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

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

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

* Sys - это количество процессорного времени, проведенного в ядре в процессе. Это означает выполнение процессорного времени, потраченного на системные вызовы в ядре, в отличие от библиотечного кода, который все еще выполняется в пользовательском пространстве. Как и «пользователь», это только процессорное время, используемое процессом. Ниже приведено краткое описание режима ядра (также известного как режим супервизора) и механизма системных вызовов.

Пользователь +Sys скажет вам, сколько фактического процессорного времени использовало ваш процесс.

Источники статистики, представленной по времени (1)

Статистика, представленная по времени, собирается из различных системных вызовов. «Пользователь» и «Sys» приходят из времени ожидания (2) или времени (2), в зависимости от конкретной системы. «Реальное» рассчитывается по времени начала и окончания, полученному из вызова gettimeofday (2). В зависимости от версии системы, различные другие статистические данные, такие как количество переключений контекста, также могут быть собраны по времени.

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

Краткое руководство по режиму «Ядро против пользователя»

В Unix или любой другой операционной системе с защищенной памятью режим «Ядро» или «Супервизор» относится к привилегированному режиму, в котором может работать ЦПУ. Некоторые привилегированные действия, которые могут повлиять на безопасность или стабильность, могут быть выполнены только тогда, когда ЦП работает в этом режиме; эти действия недоступны для кода приложения. Примером такого действия может быть манипулирование MMU для получения доступа к адресному пространству другого процесса. Обычно код пользовательского режима не может сделать это (по уважительной причине), хотя он может запрашивать общую память у ядра, которая может быть прочитана или записана несколькими процессами. В этом случае общая память запрашивается у ядра через безопасный механизм, и оба процесса должны явно подключиться к ней, чтобы использовать ее.

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

«Системные» вызовы в C-библиотеке (особенно те, которые описаны в Разделе 2 справочных страниц) содержат компонент пользовательского режима, который вы фактически вызываете из своей C-программы. За кулисами они могут выполнять один или несколько системных вызовов ядра для выполнения определенных услуг, таких как ввод-вывод, но у них все еще есть код, работающий в пользовательском режиме. При желании также вполне возможно напрямую перевести ловушку в режим ядра из любого кода пользовательского пространства, хотя вам может потребоваться написать фрагмент ассемблера, чтобы правильно настроить регистры для вызова. Страницу, описывающую системные вызовы, предоставляемые ядром Linux, и соглашения по настройке регистров можно найти здесь.

Больше информации

Чтобы уточнить про sys: Есть вещи, которые ваш код не может сделать из пользовательского режима, такие как выделение памяти или доступ к оборудованию (HDD, сеть и т.д.) Они находятся под наблюдением Ядра, и он один может сделать это. Некоторые операции, которые вы выполняете (например, malloc или fread/fwrite), будут вызывать эти функции ядра, которые затем будут считаться временем 'sys'. К сожалению, это не так просто, как "каждый вызов malloc будет учитываться во время 'sys'". Вызов malloc будет выполнять некоторую собственную обработку (все еще учитывается во время «пользователя»), а затем где-то по пути вызывать функцию в ядре (считая во время «sys»). После возврата из вызова ядра у пользователя будет еще некоторое время, а затем malloc вернется к вашему коду. Когда произойдет переключение и сколько его будет потрачено в режиме ядра - вы не можете сказать. Это зависит от реализации библиотеки. Кроме того, другие, казалось бы, невинные функции могут также использовать malloc и тому подобное в фоновом режиме, который снова будет иметь некоторое время в 'sys'.

Источник: здесь

3

У вас есть как минимум семь (возможно, восемь;) ядер на вашем компьютере. Это "всего" заняло всего 189 минут, но в течение этих 189 минут он работал на множестве ядер одновременно.

Это входит в трактат Джо:

На многопроцессорной машине многопоточный процесс или дочерний процесс может иметь истекшее время, меньшее общего времени ЦП, поскольку разные потоки или процессы могут выполняться параллельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .