РАЗРАБОТКА САМОАДАПТИВНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ НА ОСНОВЕ ТЕХНОЛОГИИ ТРАССИРОВКИ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА

УДК 004.4

DOI 10.21685/2072-3059-2020-3-3

А. С. Бождай, Ю. И. Евсеева, А. А. Гудков

РАЗРАБОТКА САМОАДАПТИВНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ НА ОСНОВЕ ТЕХНОЛОГИИ ТРАССИРОВКИ ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА1

Аннотация

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

Материалы и методы. В качестве технологического решения для трассировки вычислительного процесса используется программно-аппаратное решение Intel Processor Trace. Предлагаемые методы формализации используют математический аппарат динамических графов.

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

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

1 Исследование выполнено при финансовой поддержке РФФИ в рамках научного проекта № 18-07-00408.

© Бождай А. С., Евсеева Ю. И., Гудков А. А., 2020. Данная статья доступна по условиям всемирной лицензии Creative Commons Attribution 4.0 International License (http://creativecommons.org/licenses/ by/4.0/), которая дает разрешение на неограниченное использование, копирование на любые носители при условии указания авторства, источника и ссылки на лицензию Creative Commons, а также изменений, если таковые имеют место.

Ключевые слова: программная самоадаптация, адаптивные программные системы, трассировка вычислительного процесса, теория графов, динамический граф, Intel Processor Trace.

A. S. Bozhday, Yu. I. Evseeva, A. A. Gudkov

SELF-ADAPTIVE SOFTWARE DESIGN BASED ON THE COMPUTING PROCESS'S TRACE TECHNOLOGY

Abstract.

Background. The problem of creating a universal technology for the development of self-adaptive software (SW) has become more and more urgent in recent years, due to the breadth of application of complex software systems and high requirements for their performance and reliability. The purpose of the article is to describe the principles and prospects for developing adaptive software using the technology of tracing the computational process. As a practical example, the possibility of using a popular hardware and software solution for such tracing - Intel Processor Trace - is shown, which is a toolkit for recording traces of program code execution with the minimum amount of information required for this. Analyzing the accumulated set of traces, it is possible to evaluate the statistics of execution of various fragments of the program code and draw conclusions about their comparative efficiency in various conditions. The obtained data can be used as the basis for self-optimization algorithms for software products.

Materials and methods. Intel Processor Trace software and hardware solution is used as a technological solution for tracing the computational process. Proposed formalization methods use the mathematical apparatus of dynamic graphs.

Results. The concept of using the tracing of the computational process to create software libraries and toolkits aimed at developing self-adaptive software is proposed. Two main ways of practical implementation of the concept are considered: creation of algorithms for the development of self-adaptive software systems operating on the Intel hardware platform; development of a specialized software library for a high-level language that allows collecting and processing traces of the computational process. A method of formal representation of program traces is proposed, based on the mathematical apparatus of graph theory.

Conclusions. Computing process tracing is a software and hardware technology that allows you to track the characteristic features of the execution of a program code and describe them with the minimum required amount of information. By analyzing its own computational paths, the software system gains the possibility of low-level introspection with the possibility of further actions aimed at self-adaptation to changing operating conditions.

Keywords: self-adaptation software, adaptive software systems, computational process tracing, graph theory, dynamic graph, Intel Processor Trace.

Введение

Задача создания эффективной и универсальной технологии разработки самоадаптивного программного обеспечения (ПО) становится все более актуальной в последние годы [1, 2]. Сложные программные системы внедрены практически во все сферы деятельности человека, и несвоевременный выход из строя программного комплекса, отвечающего за управление техногенными, финансовыми или медицинскими вопросами, может привести к тяжелым

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

Одной из наиболее полезных методик, применяемых при разработке самоадаптивных программных систем, можно считать трассировку выполнения программных инструкций. В работе [4] авторами рассматривался вопрос разработки специфических методов динамического анализа кода для создания самоадаптивного ПО. Предложенный подход заключается в протоколировании вызовов функциональных объектов программы и применении к составленным протоколам методов интеллектуального анализа данных для выявления закономерностей. Выявленные закономерности позволяют находить те компоненты программы, которые в текущих условиях запуска работают неоптимально, и автоматически реконфигурировать их. Выделенные компоненты будут способны к дальнейшей реструктуризации на основе информации, циркулирующей в программном приложении (например, технических характеристик устройства, на котором запускается программа). В качестве основной модели для анализа протоколируемых вызовов функциональных объектов предлагается использование динамического графа вызовов с расширенными свойствами.

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

Перспективным решением является применение технологии трассировки вычислительного процесса. К настоящему моменту наиболее продвинутой реализацией такой технологии является Intel Processor Trace (Intel PT) [5], возникшая вместе с пятым поколением процессоров от Intel. Трассировка вычислительного процесса позволяет получить полный поток исполнения некоторого приложения с минимальными издержками (<5 %), поддерживая при этом многопоточность и помогая отслеживать так называемые «состояния гонки» благодаря отметкам времени при записи трассы приложения [6].

Важным преимуществом технологии Intel PT является возможность отслеживать выполнение кода на максимально низком уровне - вплоть до выполнения отдельных инструкций, чего невозможно достичь, используя другие методы трассировки.

Intel PT не только открывает большие возможности для написания инструментов поиска уязвимостей и ошибок в приложениях, но и может использоваться в качестве потенциально полезного решения при разработке адаптивного ПО. В данной статье приводится обзор этой технологии и ее возможное применение при создании самоадаптивных программных продуктов.

1. Обзор технологии Intel Processor Trace

Intel PT позволяет отслеживать две критически важные характеристики программного приложения:

1) поток выполнения, т.е. последовательность выполнения машинных команд после запуска программы;

2) время выполнения инструкций.

Для сбора необходимой информации достаточно запустить исследуемое приложение с включенным параллельно инструментарием Intel PT. Как только инструментарий оказывается запущен, начинается запись трасс в оперативную память. Подобно другой технологии трассировки - «последняя ветвь записи» (Last Branch Record Trace, LBR) [7] - Intel PT осуществляет трассировку путем записи ветвей выполнения кода.

В процессе выполнения каждый раз, когда процессор встречает какую-либо инструкцию перехода (например: je, call или ret), фиксируется, как именно был осуществлен переход. В случае с простой командой условного перехода процессор запишет, был он совершен (T) или нет (NT), используя всего 1 бит. Для косвенного (вычисляемого) перехода будет записан целевой адрес. Безусловные переходы игнорируются, поскольку участок кода, на который они ведут, известен заранее. Затем процессор сохраняет трассу в сильно сжатой форме в оперативной памяти.

Во время анализа с помощью специальных инструментов осуществляется объединение записанных трасс с двоичным кодом программы. Это необходимо для определения того, какие именно инструкции были выполнены при запуске программы.

В табл. 1 приведен пример трассировки с использованием Intel PT [8]. Первый столбец содержит исходный ассемблерный код программы (операнды некоторых инструкций опущены), второй - записанную трассу, последний -восстановленный с использованием трассы поток выполнения инструкций. Регистр edx в инструкции call edx содержит адрес виртуальной функции; ее фактический адрес можно определить только во время выполнения программы.

Таблица 1

Трассировка потока выполнения программы с помощью Intel PT

Инструкции Трасса Intel PT Поток выполнения

push push

mov mov

add add

cmp cmp

je .label T je .label

mov

.label: .label:

call edx 0x407e1d8 call 0x407e1d8

Intel PT позволяет отслеживать не только поток выполнения команд, но и время их выполнения. В табл. 2 показан пример такой трассировки [8].

Таблица требует некоторых пояснений. Переход jnz не был совершен, поэтому он и предшествующие команды записаны с отметкой времени 0 наносекунд. Затем можно увидеть обновление времени на 2 нс и сработавший переход je, поэтому все инструкции от je и выше (и ниже jnz) идут с пометкой времени 2 нс. Затем следует косвенный переход, однако, поскольку

вместе с ним не обновляется фиксируемое время, временные метки у команд тоже не обновляются. Затем мы видим, что прошло 100 нс и переход jb не был совершен, поэтому все инструкции от jb и выше обновляются с отметкой времени в 102 нс.

Таблица 2

Учет времени выполнения инструкций с помощью Intel PT

Инструкции Трасса Intel PT Результат декодирования

Время (нс) Инструкция

mov 0 mov

jnz NT 0 jnz

add 2 add

cmp 2 cmp

je .label TIME 2ns + T 2 je .label

mov

.label: .label:

call edx 0x407e1d8 102 call 0x407e1d8

test 102 test

jb TIME 100ns + NT 102 jb

На основе приведенных примеров можно сделать вывод, что трассировка потока выполнения команд с помощью Intel PT осуществляется точно, однако информация о времени выполнении команд менее точна. Очевидно, что инструкции call, test и jb не выполнялись в одно и то же время, но более точная информация об их выполнении отсутствует.

2. Концепция применения трассировки вычислительного процесса для разработки самоадаптивных программных продуктов

Трассы, генерируемые с помощью трассировки вычислительного процесса, могут быть полезны при создании программных библиотек и инстру-ментариев, нацеленных на разработку самоадаптивного ПО. Выделим два основных направления работ в данной области:

1) создание алгоритмической основы разработки самоадаптивных программных систем, функционирующих на основе технологии трассировки вычислительного процесса;

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

В рамках первого направления наиболее существенной задачей будет разработка алгоритма поиска наиболее часто встречающихся подграфов в наборе динамических графов, построенных на базе трасс вычислительного процесса. Задача поиска часто встречающихся подграфов является одной из основных в сфере интеллектуального анализа графов (Graph Mining) [9] и обычно трактуется в двух аспектах [10]:

1) поиск часто встречающихся подграфов в наборе графов, как правило, это поиск наиболее часто встречающегося наибольшего подграфа;

2) поиск часто встречающихся одинаковых подграфов в рамках одного графа.

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

Для того чтобы дать некоторое представление об используемом для решения задачи математическом аппарате, введем ряд определений [11].

Пусть Gts - множество графов {О^...,Gn}, где Gi = (У,Е^) для 1 <1 <п .

Множество Gts будет являться временной последовательностью графов, если У = У для любого 1 < 1 < п ; О^ будет являться 1 -м состоянием О^ .

Временную последовательность графов можно представить как динамический граф БО(О^) = (УБО, ЕвО, еъ), где УБО = VI для любого

1 < 1 < п и ЕПО = ип=1 Е^. Отображение еъ : Е^о ^ {011}П позволяет представить каждое ребро е в ЕБО как двоичную последовательность еъ(е) длиной п элементов: 1 -й элемент еъ(е) равен 1, если ребро е присутствует в 1 -м состоянии О^, и 0 в случае его отсутствия.

В рамках проводимого исследования особый интерес представляют подграфы такого графа, а именно топологические и динамические подграфы.

Пусть БО1 = УЕ1,е$1) и БО^ = (У2,Е2,еъ2) - динамические графы. БО1 будет топологическим подграфом БО2 (БО1 с БО2) при выполнении условий У1 с У2, Е С Е2, еъ1(е1) = для каждого соответствующего

ребра е1 из Е1 и е2 из Е2 .

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

Для определения динамического подграфа потребуется определение понятия подстроки в последовательности. Пусть и ъ2 - последовательности длиной к и п соответственно. Для 1 < 1 < п — (к — 1) обозначим как

(ъ2,1,1 + (к — 1)) тот факт, что является подстрокой ъ2 начиная с 1 -го символа в ъ2 и заканчивая 1 + (к — 1) -м символом в ъ2.

Граф DSОl = (У^Е1,еъ1,startl) является динамическим подграфом размерностью к динамического графа БО^ = (У2, Е2, еъ^) с п состояниями (DSGl Ск БО2 ), если выполняются условия У1= У2, Е1 = Е2 и для всех

соответствующих ребер е1 из Е1 и е2 из Е2 esl(el) = тЪъ^(es2(e2),start1, startl + (к -1)), где start1 - это состояние DG2, с которого начинается , 1 < start1 < п - (к -1).

Рассмотрим теперь понятие часто встречающегося динамического подграфа.

Динамический подграф 0Б01 имеет динамическое включение в динамическом графе DG2, если существует топологический подграф 5" графа DG2 такой, что ,££¡1 с,к 5 .

Динамический подграф ВБ01 является часто встречающимся подграфом динамического графа DG2, если DG2 содержит как минимум t динамических включений ВБОх, где t - определяемый пользователем порог частоты.

function f

while

Рис. 1. Граф возможных переходов функции /

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

В рамках второго направления необходимо разработать библиотеку классов, реализующих следующие группы методов:

1) методы, интегрируемые в код программного приложения и позволяющие осуществлять фиксацию трасс на отдельных его участках с использованием различных масштабов;

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

Практическая реализация предлагаемого инструментария позволит разрабатывать самоадаптивные системы различного уровня - от сложных программных комплексов в сферах образования, медицины и управления предприятием до низкоуровневого программного обеспечения [12].

Заключение

Повсеместное внедрение сложных программных систем в процессах жизнедеятельности современного общества требует создания новых парадигм и подходов программной инженерии. Отдельной актуальной проблемой при этом является создание специализированных методов разработки самоадаптивного ПО. В качестве перспективного подхода в статье рассмотрена концепция использования технологии трассировки вычислительного процесса. В частности, рассмотрен вариант использования технологии Intel Proccessor Tracе с возможностью отслеживания особенностей выполнения программного кода в различных условиях и режимах функционирования. Анализируя эффективность собственных вычислительных трасс, программная система получает возможность низкоуровневого самоанализа, результаты которого могут быть использованы при ее дальнейшей самоадаптации.

Библиографический список

1. Chang, V. A Cybernetics Social Cloud / V. Chang. - N. Y. : Electronics & Computer Science, 2015.

2. Ding, Z. A software cybernetics approach to self-tuning performance of on-line transaction processing systems / Z. Ding, Z. Wei, H. Chen // J. Syst. Software. - Amsterdam : Elsevier, 2016. - P. 13-18.

3. Mayer, P. The autonomic cloud: a vision of voluntary, peer-2-peer cloud computing / P. Mayer, A. Klarl, R. Hennicker // 7th IEEE International Conference on Self-Adaptation and Self-Organizing Systems Workshops (SASOW). - Washington : IEEE Computer Society, 2013. - P. 89-94.

4. Бершадский, А. М. Исследование и разработка методов динамического анализа кода для создания самоадаптивного программного обеспечения / А. М. Бершадский, А. С. Бождай, Ю. И. Евсеева, А. А. Гудков // Моделирование, оптимизация и информационные технологии. - 2018. - № 4. - С. 108-120.

5. Processor Tracing // Intel Developer Zone. - URL: https://software.intel.com/content/ www/us/en/develop/blogs/processor-tracing.html (дата обращения: 23.08.2020).

6. Intel 64 and IA-32 ArchitecturesSoftware Developer's Manual // Intel Developer Zone. -URL: https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf (дата обращения: 23.08.2020).

7. Last Branch Record Trace // Intel Developer Zonea. - URL: https://software.intel. com/content/www/us/en/develop/documentation/system-debug-legacy-user-guide/top/common-debugger-tasks/execution-trace/last-branch-record-trace.html (дата обращения: 23.08.2020).

8. Enhance performance analysis with Intel Processor Trace // Performance explained easy. - URL: https://easyperf.net/blog/2019/08/23/Intel-Processor-Trace (дата обращения: 23.08.2020).

9. Jiang, C. A Survey of Frequent Subgraph Mining Algorithms / C. Jiang, F. Coenen, M. Zito // The Knowledge Engineering Review. - 2004. - № 1. - P. 1-31.

10. Elseidy, M. GraMi: frequent subgraph and pattern mining in a single large graph / M. Elseidy, E. Abdelhamid, S. Skiadopoulos, P. Kalnis // Proceedings of the VLDB Endowment. - N.Y. : ACM, 2014. - P. 445-450.

11. Karsten, M. Pattern Mining in Frequent Dynamic Subgraphs / M. Karsten, H. Kriegel, P. Wackersreuther // In Sixth International Conference on Data Mining (ICDM'06). - Washington : IEEE Computer Society, 2006. - P. 18-22.

12. Бождай, А. С. Метод рефлексивной самоадаптации программных систем / А. С. Бождай, Ю. И. Евсеева // Известия высших учебных заведений. Поволжский регион. Технические науки. - 2018. - № 2 (46). - С. 74-86.

References

1. Chang V. A Cybernetics Social Cloud. New York: Electronics & Computer Science, 2015.

2. Ding Z., Wei Z., Chen H. J. Syst. Software. Amsterdam: Elsevier, 2016, pp. 13-18.

3. Mayer P., Klarl A., Hennicker R. 7th IEEE International Conference on Self-Adaptation and Self-Organizing Systems Workshops (SASOW). Washington: IEEE Computer Society, 2013, pp. 89-94.

4. Bershadskiy A. M., Bozhday A. S., Evseeva Yu. I., Gudkov A. A. Modelirovanie, op-timizatsiya i informatsionnye tekhnologii [Modeling, optimization and information technology]. 2018, no. 4, pp. 108-120. [In Russian]

5. Processor Tracing. Intel Developer Zone. Available at: https://software.intel.com/ content/www/us/en/develop/blogs/processor-tracing.html (accessed Aug. 23, 2020).

6. Intel 64 and IA-32 ArchitecturesSoftware Developer's Manual. Intel Developer Zone. Available at: https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf (accessed Aug. 23, 2020).

7. Last Branch Record Trace. Intel Developer Zonee. Available at: https://software. intel.com/content/www/us/en/develop/documentation/system-debug-legacy-user-guide/ top/common-debugger-tasks/execution-trace/last-branch-record-trace.html (accessed Aug. 23, 2020).

8. Enhance performance analysis with Intel Processor Trace. Performance explained easy. Available at: https://easyperf.net/blog/2019/08/23/Intel-Processor-Trace (data obrash-che-niya: 23.08.2020).

9. Jiang C. A, Coenen F., Zito M. The Knowledge Engineering Review. 2004, no. 1, pp. 1-31.

10. Elseidy M., Abdelhamid E., Skiadopoulos S., Kalnis P. Proceedings of the VLDB Endowment. New York: ACM, 2014, pp. 445-450.

11. Karsten M., Kriegel H., Wackersreuther P. In Sixth International Conference on Data Mining (ICDM'06). Washington: IEEE Computer Society, 2006, pp. 18-22.

12. Bozhday A. S., Evseeva Yu. I. Izvestiya vysshikh uchebnykh zavedeniy. Povolzhskiy region. Tekhnicheskie nauki [University proceedings. Volga region. Engineering sciences]. 2018, no. 2 (46), pp. 74-86. [In Russian]

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

E-mail: bam@pnzgu.ru

Bozhday Aleksandr Sergeevich Doctor of engineering sciences, professor, sub-department of computer aided design systems, Penza State University

Евсеева Юлия Игоревна

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

E-mail: bam@pnzgu.ru

Гудков Алексей Анатольевич

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

E-mail: bam@pnzgu.ru

Образец цитирования:

Бождай, А. С. Разработка самоадаптивного программного обеспечения на основе технологии трассировки вычислительного процесса / А. С. Бождай, Ю. И. Евсеева, А. А. Гудков // Известия высших учебных заведений. Поволжский регион. Технические науки. - 2020. - № 3 (55). - С. 26-35. - DOI 10.21685/2072-3059-2020-3-3.

Evseeva Yuliya Igorevna

Candidate of engineering sciences, associate

professor, sub-department of computer

aided design systems, Penza State

University (40 Krasnaya street,

Penza, Russia)

Gudkov Aleksey Anatol'evich Candidate of engineering sciences, associate professor, sub-department of computer aided design systems, Penza State University