синхронизация программы

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

Смотря на окончательный результат, я смущен, так как я думал "real=sys+user", или он по крайней мере приблизительно содержит. Здесь прибывает его вывод

реальный 189m6.807 s

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

sys 3m6.508 s

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

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

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

2
задан 02.10.2009, 15:24

2 ответа

У Вас есть по крайней мере семь (вероятно, восемь ;) ядра в Вашем компьютере. "Только" потребовалось общее количество 189 минут, но в течение тех 189 минут, это работало на большом количестве ядер одновременно.

Это включено в трактат Joe:

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

3
ответ дан 08.12.2019, 04:47

Реальный, User и Sys обрабатывают статистику времени

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

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

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

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

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

Об источниках статистики сообщает время (1)

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

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

Краткая краткая информация о Ядре по сравнению с Непривилегированным режимом

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

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

'Системные' вызовы в C libary (особенно описанные в Разделе 2 из страниц справочника) имеют компонент непривилегированного режима, который является тем, что Вы на самом деле называете из своей программы C. Негласно они могут выпустить один или несколько системных вызовов ядра, чтобы сделать определенные сервисы, такие как ввод-вывод, но у них все еще также есть код, работающий в непривилегированном режиме. Также довольно возможно непосредственно выпустить прерывание к привилегированному режиму из любого кода пространства пользователя при желании, хотя Вы, возможно, должны записать отрывок ассемблера для установки регистров правильно для вызова. Страница, описывающая системные вызовы, обеспеченные ядром Linux и конвенциями для установки регистров, может быть найдена здесь.

Подробнее

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

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

7
ответ дан 08.12.2019, 04:47

Теги

Похожие вопросы