Среда NetBeans IDE 6.9 с функциями подключаемого модуля для C/C++/Fortran предоставляет средство микросостояний потока для наблюдения за состояниями выполнения потоков. В этом средстве приведено общее представление изменяющихся состояний среды выполнения, а также более подробное представление отдельных потоков. Это позволяет определять проблемы, которые могут быть пропущены при отладке кода.
В этом учебном курсе описано применение средства микросостояния потока для проектов C/C++ в системах Solaris 10 или OpenSolaris. Это средство поддерживается только в операционных системах Solaris, так как для сбора данных о состоянии потоков необходима технология учета микросостояний Solaris и средство DTrace. Средство микросостояний потока запускается по умолчанию при запуске проекта NetBeans в операционных системах Solaris.
Если среда IDE используется в системах Linux, Windows или MacOS X, а в сети доступна система Solaris, то разработчик может настроить проект на использование системы Solaris в качестве удаленного узла разработки. Удаленная разработка позволяет применять средство микросостояний потока, а также другие средства Solaris при запуске среды IDE в ОС Linux, Windows или MacOS X. См. указания по настройке построения на удаленном узле в учебном курсе по удаленной разработке на языке C/C++.
В этом учебном курсе используется проект, выполняемый в системе на базе процессора Solaris SPARC. Можно последовать указаниям из руководства, если среда NetBeans IDE 6.9 работает на платформе Solaris или OpenSоlaris для систем на основе SPARC или x86. Обратите внимание на то, что понятие "операционная система Solaris" в этом руководстве применяется для систем OpenSolaris и Solaris 10.
Учет микросостояний Solaris
Многие операционные системы собирают сведения о ЦП на каждом цикле ЦП или с определенным интервалом. Операционные системы Solaris используют технологию учета микросостояний для сбора статистики из ЦП и потоков для каждого события. Действия каждого потока отслеживаются, а система записывает время перехода потоков из одного состояния исполнения в другое. Эти метки времени позволяют определить длительность пребывания потока в состоянии выполнения, сна, ожидания, блокировки и т.п. Такая схема позволяет собирать точные статистические данные без увеличения нагрузки на систему.
Для получения дополнительных сведений об учете микросостояний обратитесь к записи в блоге разработчика Sun Эрика Шрока (Eric Schrock) Учет микросостояний в Solaris 10.
Настройка среды Solaris в целях учебного курса
Для применения средства микросостояний потока используемая при выполнении среды NetBeans учетная запись Solaris должна иметь достаточные полномочия DTrace для отслеживания поведения системы. Учетная запись пользователя должны иметь полномочия dtrace_user, dtrace_proc и dtrace_kernel.
При выполнении проекта на узле удаленной разработки Solaris полномочия средства DTrace должны быть настроены для учетной записи пользователя на удаленном узле.
Для проверки полномочий DTrace введите следующую команду в командной строке: /bin/ppriv $$
Если учетная запись имеет требуемые полномочия, то команда ppriv должна возвратить следующие данные:
E: basic,dtrace_kernel,dtrace_proc,dtrace_user
I: basic,dtrace_kernel,dtrace_proc,dtrace_user
P: basic,dtrace_kernel,dtrace_proc,dtrace_user
L: all
Строка, начинающаяся с "I:", имеет особое значение, так как в ней указываются полномочия, наследуемые программами, которые запускаются из данного интерпретатора команд. Если учетная запись не имеет требуемых наследуемых полномочий, а пользователь не имеет полномочий администратора или пользователя root, следует попросить администратора системы добавить для данной учетной записи наследуемые полномочия dtrace_user, dtrace_proc и dtrace_kernel.
При наличии полномочий администратора или пользователя root пользователь может добавить эти полномочия самостоятельно, как описано ниже.
Постоянное предоставление необходимых полномочий DTrace учетной записи пользователя:
Убедитесь в том, что для изменяемой учетной записи пользователя не выполнен вход в систему.
Выполните вход в систему в качестве пользователя root или администратора.
Введите в командной строке следующую команду и замените имя_пользователя именем изменяемой учетной записи:
$ usermod -K defaultpriv=basic,dtrace_kernel,dtrace_user,dtrace_proc имя_пользователя
Затем необходимо выполнить вход в систему с помощью этой учетной записи, запустить среду IDE NetBeans и применить средства профилирования для поставщика данных DTrace.
Временное предоставление необходимых полномочий DTrace учетной записи пользователя:
Для определения идентификатора процесса интерпретатора команд введите следующую команду:
$ echo $$
Выполните вход в систему в качестве пользователя root или администратора.
Введите следующую команду, заменяя строку идентификатор_процесса идентификатором, полученным при выполнении команды echo:
$ ppriv -s I+dtrace_user,dtrace_proc,dtrace_kernelидентификатор_процесса
Все команды, введенные в интерпретатор команд с идентификатором идентификатор_процесса, теперь наследуют требуемые полномочия. Учетная запись пользователя теперь способна запустить среду IDE NetBeans в этом интерпретаторе и использовать средство профилирования микросостояний потока.
Создание проекта для учебного курса
Чтобы продемонстрировать работу функций профилирования микросостояний потока, создадим новый проект из примера приложения ProfilingDemo, который включен в состав среды IDE.
Приложение ProfilingDemo состоит из трех частей, каждая из которых выполняет две задачи на протяжении 10 секунд. При этом используются различные способы, позволяющие создать и наглядно отобразить в средствах профилирования действия программы. Первой задачей является запись данных в файл, а второй задачей – определенные вычисления. Количество запусков набора из двух задач равно количеству ЦП на узле разработки. Для однопроцессорной системы программа выполняет два действия один раз. Для узла разработки с 32 ядрами две задачи будут выполнены 32 раза подряд. Для выполнения каждой операции следует нажать клавишу ВВОД, поэтому следует обращать внимание на окно выходных данных.
Проект ProfilingDemo разделен на следующие этапы:
Этап Sequential Demo имеет один поток и последовательно выполняет 10 операций по 10 секунд. Выполнение этого этапа может занять определенное время в системе с большим количеством ЦП, так как при этом последовательно выполняется несколько наборов задач.
Этап Parallel Demo содержит несколько потоков и одновременно выполняет операцию записи в файл и операции вычислений в разных потоках, количество которых равно количеству ЦП. На многоядерных компьютерах этот этап выполняется гораздо быстрее, чем этап Sequential Demo, так как то же количество операций теперь выполняется одновременно. При этом потоки могут обращаться к одинаковым данным, что может привести к неточным результатам.
Этап Pthread Mutex Demo также имеет несколько потоков и выполняет те же операции записи и вычисления, что и другие этапы. При этом код использует взаимные блокировки исключений для предотвращения перекрывающегося доступа к определенным функциям из нескольких потоков.
Создание проекта ProfilingDemo
Откройте мастер "New Project" с помощью команды "File" > "New Project".
Выберите в мастере категорию "Samples", а затем – подкатегорию "C/C++".
Выберите пример "Profiling Demo", как показано на рисунке, а затем нажмите кнопку "Next".
Название проекта и его расположение выбираются разработчиком. В данном примере используется имя по умолчанию "ProfilingDemo_1" и каталог NetBeansProjects.
Нажмите кнопку "Finish", чтобы выйти из мастера и создать проект.
Настройка свойств проекта
Правой кнопкой мыши щелкните узел проекта "ProfilingDemo_1" на вкладке "Projects" и выберите команду "Properties".
Выберите узел "Build" на панели "Categories".
Выберите коллекцию средств SunStudio_12 и нажмите кнопку "Применить".
Возможно также использование коллекции средств GNU, так как средство микросостояний потоков не использует средства Sun Studio.
Выберите узел "Запуск" на панели "Категории". Выберите окно вывода в качестве типа консоли и нажмите кнопку "Применить". Это позволяет отображать выходные данные программы в окне вывода среды IDE, а не во внешнем окне терминала, как показано в этом руководстве.
Выберите узел "Profile" на панели "Categories". Установите флажок "Показывать индикаторы профилирования во время выполнения".
Выберите настройку профиля "DTrace для C/C++, расширенная версия".
Нажмите кнопку "OK" в диалоговом окне "Свойства проекта".
Создание и выполнение проекта ProfilingDemo
Правой кнопкой мыши щелкните узел проекта ProfilingDemo и выберите команду "Построить".
На вкладке "Output" отобразятся результаты сборки, как показано ниже. При появлении предупреждений о несоответствии аргументов их можно игнорировать.
Правой кнопкой мыши щелкните узел проекта ProfilingDemo и выберите команду "Run".
При выполнении проекта ProfilingDemo нажмите клавишу ВВОД в случае вывода соответствующего запроса. Результат выполнения показан на следующем снимке экрана.
Откроется вкладка "Монитор выполнения", на которой отображается динамический график для средства микросостояний потока, а также для других средств, определенных в настройке профиля "DTrace для C/C++, расширенная версия".
На следующем снимке экрана отображаются все средства, а средство микросостояний потоков выделено красным цветом.
Чтобы просмотреть все средства, следует увеличить размер вкладки "Монитор выполнения". Для этого необходимо щелкнуть верхнюю границу вкладки и перетащить ее вверх. Пользователь может также перетащить правый край, чтобы расширить окно.
Обратите внимание на то, что программа ProfilingDemo выводит сообщения о выполняемых операциях в окне вывода. Это позволяет сравнить вывод с графическими данными средств в среде IDE. Например, программа отображает сведения о выделяемой памяти, выполняет вычисления, а затем освобождает память. График отражает действия программы.
Обзор микросостояний потока
График микросостояний потоков в окне "Монитор выполнения" отображает сведения о потоках программы по мере того, как они получают различные состояния выполнения в ходе выполнения программы. Функция учета микросостояний Solaris использует средство DTrace для предоставления подробных сведений о состоянии каждого потока по мере смены 10 различных состояний выполнения.
Средство "Микросостояния потоков" графически отображает итоговые табличные сведения для всех потоков, созданных в ходе выполнения проекта. Отображаются только четыре состояния: "Сон", "Ожидание", "Блокировка" и "Выполнение". Эти состояния являются упрощенным представлением 10 возможных микросостояний, а также предоставляют общие сведения о состояниях потоков, запущенных в программе. Например, состояние "Выполнение" соответствует всем типам состояний выполнения: выполнение в пользовательском режиме, выполнение в системных вызовах, выполнение при отсутствии страницы, выполнение в прерываниях.
Следующий снимок экрана был сделан в начале выполнения части программы SEQUENTIAL DEMO, в которой две задачи выполняются последовательно в одном потоке. Точки, в которых поток находится в спящем режиме, соответствует моментам, в которых программа ожидает нажатия клавиши Enter.
Обратите внимание на то, что в нижней части окна "Монитор выполнения" появилась полоса прокрутки. Щелкните ее и перетащите вправо, чтобы просмотреть данные во всех средствах профилирования от начала до конца выполнения программы.
Обратите внимание на то, что на снимке экрана в момент времени 0:42 количество потоков в средстве микросостояний увеличивается до 3. В этот момент начинается выполнение части программы PARALLEL DEMO. Основной поток запускает два дополнительных потока для параллельного выполнения двух задач. Можно заметить, что увеличилась продолжительность пребывания в состояниях "Ожидание" (желтый цвет) и "Сон" (синий цвет), а продолжительность пребывания в состоянии "Выполнение" (зеленый цвет) уменьшилась. На этапе PARALLEL DEMO состояние "Блокировка" (оранжевый цвет) не используется, так как в этой части программы не применяются средства синхронизации потоков, блокирующие их (например, взаимные блокировки).
Обратите внимание на то, что в момент времени 0:56 в первый раз при выполнении программы возникает состояние "Блокировка" (оранжевый цвет). В этот момент начинается выполнение части программы PTHREAD MUTEX DEMO, при которой потоки используют блокировки взаимного исключения, предотвращающие вмешательство других потоков в процесс. Активное выполнение потока возможно только при получении блокировки mutex. Поток блокируется при попытке доступа к заблокированной части кода, если другой поток владеет блокировкой mutex. Использование блокировок взаимного исключения предотвращает состояние состязания, в котором потоки устанавливают перекрывающийся доступ к одним и тем же данным.
Нажмите кнопку "Подробные сведения о потоке", чтобы просмотреть подробные сведения о микросостояниях потока.
Откроется вкладка "Подробные сведения о потоке", отображающая графическое представление шкалы времени для всех потоков, а также подробные сведения о состоянии.
В окне "Подробные сведения о потоке" отображаются переходы состояний для каждого потока в ходе выполнения программы. Рассмотрим функции этого окна более подробно.
Наведите указатель мыши на одну из цветных областей потока, но не щелкайте ее. Отобразится всплывающее окно со сведениями о событиях, происходящих в настоящий момент. Отображаются в том числе сведения о времени записи данных, а также о доле времени, проведенном в каждом из состояний на данный момент. При наведении указателя мыши на область "Сводка" всплывающее окно отображает процентные значения для полного периода выполнения потока.
Пользователь может выбрать сведения для отображения в окне "Подробные сведения о потоке" путем установки нескольких параметров.
Щелкните элемент "Уровень подробности", чтобы изменить необходимый уровень подробности отображаемых данных. Возможны значения "Основной", "Средний" и "Расширенный". В наиболее простом виде отображаются только общие состояния выполнения, а в наиболее сложном виде – 10 микросостояний.
Щелкните список отображения и выберите отображаемый тип потоков. Параметр "Только закончившиеся потоки" позволяет отобразить только потоки, которые завершились в ходе выполнения программы. Параметр "Только живые потоки" позволяет отобразить только незавершенные потоки. При выбранном параметре "Все потоки" отображаются активные и завершенные потоки.
Щелкните поток и обратите внимание на то, что он выделяется. Затем нажмите клавишу Shift и щелкните другой поток, чтобы выбрать диапазон потоков. Для выбора несмежных потоков следует нажать клавишу Ctrl, а затем щелкнуть требуемые потоки. После завершения выбора требуемых потоков щелкните их правой кнопкой мыши и выберите команду "Показывать только выделенные потоки". Чтобы включить отображение всех потоков, следует использовать список отображения.
Щелкните поток правой кнопкой мыши и выберите элемент "Имя потока", чтобы изменить имя потока по умолчанию "Поток n" на имена функций, выполняемых потоками.
Для просмотра более подробных данных микросостояний, нажмите кнопку "+" в левом верхнем углу окна "Подробные сведения о потоке". Для отображения большего интервала данных нажмите кнопку "-". Кнопка "Показать весь ход выполнения" позволяет отобразить данные для всего выполнения проекта в окне "Подробные сведения о потоке" без необходимости прокрутки. Нажмите кнопку второй раз, чтобы вернуться в представление прокрутки подробных сведений потока.
На снимке экрана ниже масштаб окна "Подробные сведения о потоке" увеличен. Идентификаторами потоков являются функции входа потока, а уровень подробности имеет значение "Расширенный".
Щелкните одну из точек в окне "Подробные сведения о потоке". Откроется вкладка "Стек вызовов потоков", на которой отображается дамп стека. Окно дампа стека позволяет пользователю раскрывать отдельные узлы стека для просмотра вызовов в стеке. Пользователь также может выбрать команду "Развернуть все", чтобы просмотреть все вызовы.
На снимке экрана ниже выбран поток 5 в момент времени 1:03 ближе к концу выполнения.
Дважды щелкните незатемненную функцию на следующем экране (например, mutex_threadfunc), чтобы открыть файл исходного кода на месте вызова этой функции.
Еще раз щелкните поток в окне "Подробные сведения о потоке". Перемещение по шкале времени потока возможно с помощью мыши или клавиатуры.
Пользователь может нажать правую кнопку мыши и выбрать в меню команды "Переход > Перемещение курсора налево", чтобы переместить фокус влево от выбранного в настоящий момент потока. Кроме того, с помощью команды "Переход > Установка курсора" можно установить точку на шкале времени. Эта команда вызывает обновление содержимого стека вызовов потоков. Для переключения фокуса на стек вызовов потоков следует выбрать команду "Переход > Переход к представлению стека".
Для навигации по шкале времени потока в окне "Подробные сведения о потоке" также можно использовать следующие сочетания клавиш:
"Ctrl+стрелка влево" и "Ctrl+стрелка вправо" для прокрутки шкалы времени потока влево и вправо.
"Ctrl+стрелка вниз" для выбора точки на шкале времени и обновления стека вызовов потока в этой точке.
"Alt+стрелка вниз" для перемещения фокуса ввода в окно стека вызовов потока.
В стеке вызовов потока можно использовать клавиши со стрелками и клавишу Enter для открытия файлов с исходным кодом, связанных с функциями.
Определения состояния потока
Ниже описаны микросостояния потока Solaris, отображаемые при уровне подробностей со значением "Расширенный".
Состояние
Описание
Пользовательский - выполняется
Процентная доля времени, в течение которого процесс выполнялся в пользовательском режиме.
Системный - выполняется
Процентная доля времени, в течение которого процесс выполнялся в системном режиме.
Другой - выполняется
Процентная доля времени, в течение которого процессом обрабатывались системные прерывания.
Отсутствует текстовая страница
Процентная доля времени, в течение которого процесс обрабатывал случаи отсутствия текстовых страниц.
Отсутствует страница данных
Процентная доля времени, в течение которого процессом обрабатывались случаи отсутствия страниц данных.
Блокировка
Процентная доля времени, в течение которого процесс ожидал блокировки пользователя.
Сон
Процентная доля времени, в течение которого процесс находился в спящем режиме.
Ожидание
Процентная доля времени, в течение которого процесс ожидал ЦП.
Дополнительные сведения
Дополнительные сведения о технологии DTrace, используемой в фоновом режиме для компиляции данных по запущенному проекту, см. на портале BigAdmin DTrace.
В этом учебном курсе рассмотрены следующие сведения о средстве профилирования микросостояний потока:
Данные о микросостояниях потока на платформах Solaris собираются автоматически с помощью средства Solaris DTrace.
Отображаемые графические индикаторы профилирования можно выбрать посредством выбора настроек профиля.
Средство анализа микросостояний потока вывода содержится только в настройке "DTrace для C/C++, расширенная версия" или в пользовательских настройках.
Параметры профилирования расположены в категории "Профиль" свойств проекта.
При нажатии кнопки "Подробные сведения о потоке" отображаются более подробные сведения о состоянии отдельных потоков.
При нажатии потоков на вкладке "Подробные сведения о потоке" отображается дамп стека для всех потоков, запущенных в выбранный момент времени.
При нажатии функций в дампе стека соответствующий файл исходного кода открывается в редакторе.
Если в сети доступна система Solaris, то возможно использование средства анализа микросостояний потока с компьютера под управлением Windows или Mac. Для этого необходимо настроить систему Solaris в виде узла удаленного управления для сборки и выполнения проектов.