Проверка существования ленивого загруженного ребенка, не получая/загружая в Быстром NHibernate

Реальный, User и статистика времени процесса Sys

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

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

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

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

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

Источники статистики, о которой сообщают time (1)

, статистические данные, о которых сообщают time, собраны от различных системных вызовов. 'Пользователь' и 'Sys' приезжают от [1 118] wait (2) ( POSIX) или times (2) ( POSIX), в зависимости от конкретной системы. 'Реальный' вычисляется от запуска и время окончания, собранное от gettimeofday (2) вызов. В зависимости от версии системы различная другая статистика, такая как количество контекстных переключений может также быть собрана [1 111].

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

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

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

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

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

[еще 1159] о 'sys'

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

6
задан Justin 23 August 2009 в 03:31
поделиться

3 ответа

нм - можно просто проверить нулевое значение. Прокси-сервер будет только при наличии ребенка.

4
ответ дан 8 December 2019 в 18:39
поделиться

NHibernateUtil.IsInitialized(...) will tell you if a proxy object has been loaded.

8
ответ дан 8 December 2019 в 18:39
поделиться

Проверка нулевого значения - идеальное решение: эффективное, понятное.

1
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

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