Исправление аномалий в графах реконструкции деревьев процессов Linux

Бесплатный доступ

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

Еще

Математическое моделирование, анализ зависимостей, операционные системы, контрольные точки, деревья процессов, восстановление состояний, полурешётки

Короткий адрес: https://sciup.org/142223076

IDR: 142223076

Текст научной статьи Исправление аномалий в графах реконструкции деревьев процессов Linux

Реконструкция дерева, процессов является ключевой подзадачей в системах сохранения-восстановления состояний Unix-подобных операционных систем с поддержкой многопро-цессности и разделения ресурсов [1]. Одним из универсальных способов реконструкции дерева, является построение частично упорядоченного множества, состояний, через которые должны пройти процессы, чтобы сформировать итоговое дерево в заданной конфигурации. По отношениям на. данном множестве формируются цепочки действий, восстанавливающих состояния процессов - цепочки системных вызовов. Целью работы является,

«Московский физико-технический иистритут (национальный исследовательский университет)», 2019

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

2.    Предыдущие работы и основания исследования

В работах [2,3] были предложены алгоритмы, строящие графы реконструкции некоторых классов деревьев процессов за полиномиальное время. Алгоритмы представляют собой двухфазные анализаторы деревьев процессов, первой фазой которых служит LR-разбор входного представления как контекстно-свободного, с дальнейшим контекстным анализом на второй фазе: либо переписыванием результата разбора в специальной стеково-кадровой структуре данных [2], либо общими методами атрибутного анализа - переписыванием абстрактного семантического дерева, управляемым атрибутной грамматикой [3]. Результат такого разбора - промежуточное представление, включающее состояния процессов, которые следует воспроизвести для восстановления дерева, и отношения между состояниями. Семантика таких отношений - системные вызовы, переводящие процессы из состояния в состояние. Полученная конструкция может быть топологически отсортирована, и выполнение системных вызовов в порядке сортировки восстановит исходное дерево процессов из начального состояния - корневого init-процесса [2-4]. Далее будет показано, что существуют отдельные случаи, когда алгоритм [3] возвращает конструкцию, по которой невозможно восстановить дерево процессов.

С другой стороны, исследования корректности процедур восстановления деревьев, а также множеств состояний Linux-процессов как частично-упорядоченных относительно атрибутных зависимостей, заключают полурешёточную упорядоченность вершин орграфа реконструкции [5]. В разделе 3 данной работы демонстрируется связь аномалии алгоритма [3] с нарушением полурешёточной упорядоченности, а также обусловленность такого нарушения отступлением от общего случая построения полурешётки множества состояний. В разделе 4 предлагаются способы ликвидации такой аномалии добавлением необходимых состояний и доупорядочиванием.

3.    Анализ аномалий в графах реконструкции3.1.    Определения

Будем пользоваться определениями, введёнными в работах [4,5]. Рассматривается дерево процессов [2-5] - ориентированное дерево:

Т = (V,E),                                      (1)

а также орграф реконструкции дерева процессов [3-5] - промежуточное представление, по которому восстанавливается исходное дерево из некоторого начального состояния:

G(T ) = (V + ,E +),                                   (2)

где V + = V U V ,н! - финальные вершины V, дополненные промежуточными V mt, соответствующие состояниям процессов в ходе выполнения системных вызовов, описываемых E + как переходами между состояниями и иерархическими зависимостями [3, 5]. В вершинах хранятся словари атрибутов состояний процессов:

Vv Е V + B v. attr : v.key = val(v .attr [key]) |' None', V key Е К, К список атрибутов процесса - идентификаторов, файловых дескрипторов, других описателей системных ресурсов, и val(v.attr[key]) : К ^ typed _val (key) - отображение таких имён на типизированные значения атрибутов. Вспомогательно вводится понятие множества вершин с равным значением атрибута u.attr1:D(attr1 ,u.attr 1 ) = {v Е V + |v.attr1 = u.attr1 }.

Рис. 1. Промежуточное представление - орграф реконструкции для атрибутов процесса, сессий и групп процессов G ( T ) некоторого дерева процессов Т, дополненный зависимостями между состояниями процессов. Исходные ребра иерархичности из Т выделены меткой «Һ»

Следует отметить свойства атрибутов образовывать иерархии.

Определение 1. Будем говорить, что attr2 доминирует над attr1, attr1, attr2 Е К, если V u Е V + : V v Е D(attr1 ,u.attr1 ) ^ val(u.attr2 ) = const.

Определение 2. Доминирующий над attr1 атрибут attr2 называется минимально доминирующим, если и только если V u Е V +B{v} Е V + : v.attr2 = u.attr2, VV' = {v} U v ', и V v ' Е V + \ {v} ^ v ' .attr2 = const.

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

Зависимость между состояниями u,v Е V + вводится в [5] как отношение (u, v) с семантикой «для реализации u требуется сначала реализовать v». Таким образом, если в некоторый момент в системе существует процесс в состоянии v, то выполнено необходимое (но не достаточное!) условие для реализации состояния u некоторого процесса, а зависимость называется разрешённой. Будем говорить, что зависимость происходит по атрибуту attr, если v либо создаёт атрибут attr, либо в его контексте происходит системный вызов, выставляющий данный атрибут в u. Зависимости определяют частичный порядок на V +, причём такой порядок - полная верхняя полурешётка [5].

Используя данное определение, рассморим ещё одно промежуточное представление.

Определение 3. Графом реконструкции, дополненным зависимостями, назовём ориентированный мультиграф Gdep:

Gdep(T ) = (V + dep U E +),

где Е dep - множество зависимостей между состояниями процессов как вершинами.

При формальном анализе зависимостей в [5] вводится экстенсивный и монотонный оператор CL, смысл которого - определение множества состояний, на котором замкнуты действия с некоторым атрибутом.

Определение 4. Пусть CL(v.attr i ) : V + ^ V + - oneратор, Vv G V + определяющий f G V+ с минимальным доминирующим атрибутом для некоторого attr^. такой, что v U CL(v) = CL(v) = f. Если единственная неподвижная точка CL - состояние, в котором создан минимально доминирующий атрибут для attr, то CL - оператор замыкания. В противном случае назовём такой оператор оператором предзамыкания PCL.

Оператор PCL рассматривается для получения промежуточных носителей атрибутов, создателей атрибутов и определения состояний-предшественников. Ключевые свойства CL л PCL обсуждены в [5].

3.2.    Алгоритм атрибутной реконструкции [3]

Напомним основную процедуру алгоритма [3]:

function AGTTM (IR,Т,схр 1'):

Output: D for any Node in dfs(T.root) do cond = f (expr(Node.^ttr)-) // проверка текущей вершины и предка if cond not in IR then

// проверка жестко наследуемых атрибутов - сессий, пространств имён cond = upbranch(...) if not cond in IR then

// проверка выставляемых в поддереве атрибутов - групп процессов и др. cond = dfs(expr(Node, Current)) end

end

D = TR(D, Ex, IR, k(cond))- end return D.

Algorithm 4: Восстановление дерева процессов Linux трансформациями, управляемыми атрибутной грамматикой.

Алгоритм производит проход по всем вершинам входного дерева. Для каждой вершины и некоторых других вершин алгоритм сопоставляет атрибуты с шаблонами, называемыми «правилами вывода» (Inference Rules, IR"), запоминает вершины с атрибутами, подходящими под шаблон:

  • 1)    если проверка родителя даёт наследование всех атрибутов, кроме идентификатора процесса, то произошёл вызов ’fork’;

  • 2)    иначе, если атрибут жестко наследованный, как сессия, и не совпал с родительским, добавляются носители атрибута в цепочке от возможно добавленного создателя в процедуре ’upbranch’, выполняемой, в худшем случае, за O(|V intermediate l ) 6 O(|V +|), V intermediate _ теКущИе состояния: входные и уже воссозданные в ходе работы;

  • 3)    иначе, производится внутренний обход за O(|Vintermediate|) 6 O(|V +|), в котором сопоставляются правила для атрибутов, выставляемых не только наследованием, как группа процессов.

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

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

  • 2)    добавить ребро - системный вызов, а в случае с жестким наследованием приписать соответствующий вызов каждому ребру цепи;

  • 3)    возможно, добавить промежуточную вершину, перебросить иерархическое ребро и добавить ребро от вновь созданной вершины к текущей - добавить процесс-родитель взамен init-процесса - «обратный reparent» [2,3].

  • 3.3.    Анализ особого случая дерева процессов

Корректность сопоставления шаблонов только по атрибутам следует из того, что алгоритм работает с корректными, то есть полученными из реальных снапшотов, деревьями: так, например, если найден создатель атрибута, состояние-носитель атрибута не может быть реализовано до него: это гарантируется невозможностью создать такое дерево процессов в ОС. Алгоритм корректно обрабатывает большое количество различных конфигураций деревьев процессов на практике [3], однако, как будет показано далее, существуют деревья, для которых жадный подход может приводить к некорректным графам реконструкции.

Рассмотрим следующее дерево процессов (рис. 2а): init-процесс, потомок которого имеет pid 2, pgid 3, и потомка, имеющего pid 3 и pgid 2. Все процессы лежат в едином пространстве имён процессов и единой сессии, созданной init-процессом.

а)                                                       б)

Рис. 2. Граф реконструкции с зависимостями Gdep == (V+, Е + U Еdep ) рассматриваемого дерева (а) и соответствующая диаграмма Хассе множества состояний процессов по зависимостям V +(б)

Запустим процедуру построения графа реконструкции по алгоритму [3]. Для каждой из вершин, встреченных во внешнем цикле, алгоритм будет совершать вложенный проход и искать подходящие по атрибутам вершины, определять места вставки промежуточных состояний и рёбер с системными вызовами между ними. Также будем сохранять восстановленные зависимости, которыми алгоритм неявно оперирует в сверке условий, налагаемых на атрибуты во вложенном обходе. В результате получим граф реконструкции с зависимостями Gdep, изображённый на рис. 2а.

Зависимости, разрешаемые в ходе построения G ^P разделяются на 4 типа и определяются соответствующими операторами предзамыкания и замыкания [5]:

  • 1)    Зависимость от вершины-предшественника PCL(u,attr) pTec i.

  • 2)    Зависимость от вершины-создателя attr, PCL(u, attr) crea t or.

  • 3)    Зависимость от вершины-исполнителя системного вызова, добавившего состояние с данным атрибутом PCL(u,attr) sysca ii er.

  • 4)    Зависимость от минимально доминирующего атрибута для attr, C L(u,attr); в замыкании, задаваемом данным атрибутом, и происходят действия над attr следовательно, все образы, определяемые PCL, лежат в замыкании, определяемом CL. Рассматривается технически, и в дальнейших рассуждениях не участвует.

PCL(u,attr) sysca ii er задают отношения, соответствующие рёбрам, антинаправленным рёбрам системных вызовов в G, кроме того, можно считать, что PCL(u, attr) sysca ii er совпадают с PCL(u, attr) pre a так как в случае с вызовами fork, setsid и setpgid процесс-предшественник, лежащий в замыкании по минимально доминирующему атрибуту - сессии в случае группы процессов, пространству имён процессов в случае сессии и номера процесса, имеет возможность самостоятельно выполнить действие по созданию потомка или выставлению собственного атрибута [7]. Таким образом, для анализа представленного примера достаточно рассмотреть разрешение зависимостей типа PCL(u, attr)crea^or и PCL(u, attr) pre d.

Рассмотрим зависимости, разрешаемые при последовательной реконструкции вершин (231) и (321). Пусть сначала производится реконструкция (231), для которой требуется, чтобы в системе существовала группа процессов 3, что достигается наличием (331): PCL((231), attr)crea^or = (331), и найден предшественник PCL((231), attr)pre^ = (221). При реконструкции (321) требуется, чтобы в системе существовала группа процессов 2, что достигается наличием (221): PCL((321), attr)crea^or = (221), и предшественник: PCL((321), attr) pr e d = (331). Но в момент реконструкции (321) состоянием процесса 2 является состояние (231), и группы 2 уже не существует. Случай с реконструкцией (231) после (321) симметричен и также приводит к конфликту по зависимостям.

Построим диаграмму Хассе множества вершин V + как частично упорядоченного по зависимостям множества. Диаграмма, представленная транзитивным сокращением Gdep, изображена на рис. 26.

= PCL(u,a

а)                                           б)                             в)

Рис. 3. Общая схема реконструкции состояния u с атрибутом attr [5] (а), фактическая схема из алгоритма [3] (б) и вариант исправления (в)

Заметим, что диаграмма не является диаграммой полурешётки [6]: полурешёточ-ная упорядоченность нарушается на вершинах с атрибутами (221), (231), (331), (321). Действительно, (231) U (321) не определяется однозначно. При этом исключение любого из отношений между вышеуказанными состояниями, очевидно, приведёт к неразрешённости соответствующей зависимости, следовательно, к некорректности полученной конструкции.

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

4. Поправки в процесс реконструкции

Предложим вариатны исправления исходного G^ непосредственно на этапе построения.

X р1[1]=2                 х р2[1]=3

(2 2 1) 91[1]=2            А о Л д2[1]=з

Vy si[i]=i          у ° у s2[i]=i

6 зщ р1и]          6 р2и]

V У 91[2]=д2[1]        V 7 д2[2]=д1[1]

s1[1]                              s2[1]

а)

Д р1[1]=2                х р2[1]=3

(2 2 1) ді[і]=2            Д о У д2[1]=з

s1[1]=1                         s2[1]=1

.'4 2 1;     (23^) РШ1

x <    V У ді[2]=д2[і]

S1[1] p4[1]=4

д4[1]=д1[1]

s4[1]=s1[1]

(Л 2 T) Р2И]

Г 7 g2[2]=g4[1] s2[1]

в)

Д-Д p1[1]=2                  p2[1]=3

22 1 W2      УоДд2[і]=з

S1[1]=1            У °ІД2[1]=1

i'4 2 1;                P1M1 /         (5 3 1

x <    V У g1[2i=92[1i       x

s1[1] \ p4[1]=4                             \

д4[1]=д1[1]

s4[1]=s1[1]

(3 2 Ц p2[U

V 7 g2[2]=g4[1]

s2[1]

как на этапе пост-обработки, так и

Д-Д р1[1]=2                  р2[1]=3

(2 2 1) д1[1]=2 X          А о У д2[1]=з

s1[1]=1 \                     s2l1l=1

\     р4[1]=4\    /

. ,д4[1]=д1[1] /

/    \(s 4[1]=s1j1]y

V у д1[2]=д2[1]         V 7 д2[2]=д4[1]

s1[1]                              s2[1]

б)

Д-Д р1[1]=2                  р2[1]=3

(2 2 1) 91[1]=2            А о Л д2[1]=з

хЛу S1[1]=1            к ° У s2[1]=1

У \ р4[1]=4 у '< р5[1]=5

i4 2 1 )g4[1]=g1[1]i5 3 1 , д5[1]=д2[1]

x-.__Xs4[1]=s1[1]         s5[1]=s2[1]

3 Й РЯ1]                 2 Г) Р2П]

V 7 д1[2]=д5[1]         V 7 д2[2]=д4[1]

s1[1]                             s2[1]

г)

. р5[1]=5

/ д5[Ц=д2[1]

s5[1]=s2[1]

Рис. 4. Изменение конфликтного подмножества из примера раздела 3 анализом SSA-представления (а) - добавление носителя (б) и диаграмма Хассе полученного исправленного подмножества (в). Подмножество с избыточно созданными носителями (г) можно переупорядочить (д) и вложить в полурешётку, не нарушая её свойств

4.1. Анализ графа реконструкции, переведённого в SSA-форму

Из естественного требования, что в любой момент времени в системе может быть не более одного процесса с некоторым pid из одного пространства имён, следует, что множество состояний процесса - либо цепь в G dep, либо пустое множество. Следовательно, можно рассмотреть версионирование состояний для каждого из процессов: для каждого атрибута в цепи состояний, если его значение отлично от предшественника, нужно присвоить номер из некоторой возрастающей последовательности, а также отметить первое и последнее состояния. В результате получим представление (рис. 4а), называемое SSA (Single-Statement

Assignment [8]), в котором каждое новое значение присваивается уникальной переменной и лишь единожды. При этом переменным соответствуют атрибуты, а разбиение на уникальные переменные будет производиться по состояниям каждого из процессов на этапе пост-обработки G(T) dep, Сформулируем процедуру правки исходного графа: каждый раз, когда в некотором состоянии встречается атрибут с новым номером, для неё проверяется зависимость по данному атрибуту: если происходит присваивание значения из создателя, следует встроить промежуточную вершину-носитель, к переменной которой присваивается исходное значение, а затем из данной переменной присваивается в целевую вершину.

function Gdep2SSA (Gdep,K );

Input : Gdep. K

if isCreator(PC L(proc, attr) creator, attr) then

// в модифицированном графе значение может передаваться через носитель, creator - наследованное название addNode(Gdep,from=PCL(proc, attr )creator, to=proc)

end end end end end return Gdep:

Algorithm 5: Gdep2SSA - алгоритм правки графа реконструкции с зависимостями переводом в SSA-представление.

Процедуры, создающие новую переменную, добавляющие вершину между создателем и целевым состоянием и проверяющим создателя - addNewVar, addNode, isCreator, а также вычисление нужных PCL, обладают сложностью 0(1) как по времени, так и по памяти, ввиду того, что вся необходимая информация уже хранится либо в Gdep, либо в счётчиках i, epoch и извлекается также за 0(1). Кроме того, состояния по-прежнему хранят только текущее значение атрибута, и для каждого атрибута исправление добавляет не более одной вершины в граф, следовательно, сложность по памяти остаётся О(|V +|), если атрибутов много меньше числа вершин. Извлечение цепей состояний getChains с одинаковым pid может производиться обходом в глубину от init-процесса антинаправленно рёбрам предшествования [9], а храниться - как 2 указателя для каждой цепи - на начало и конец. Следовательно, сложность по памяти с учётом исправлений составляет О(|V +|), как и у исходного алгоритма [3]. Сложность по времени возрастает на О(|V +|), так как добавленные вершины не требуют исправления, то есть итоговая сложность составляет О(|V +|2), как у исходного алгоритма.

На практике процедуру добавления не требуется выполнять для каждого состояния. Так, конструкция на рис. 46, в уже корректно исправлена добавлением вершины 4. Конструкция с исправлениями для всех атрибутов группы избыточна (рис. 4г), однако её, очевидно, можно переупорядочить и вписать в исходную полурешётку (рис. 4д): зависимости уже «избыточно» удовлетворены, и некоторые из них могут быть исключены без нарушения разрешимости, то есть формально полурешёточная упорядоченность V+ соблюдается.

Возможны две основные стратегии внесения поправок:

  • 1)    перевод в SSA всего графа реконструкции. Может давать избыточные носители;

  • 2)    перевод в SSA подграфов, изоморфных характерным нарушениям полурешётки, как в примере раздела 3. Более математически изящный способ внесения поправок: гарантирует отсутствие избыточных носителей в подграфах, неизоморфных аномальным подграфам, но потребует проверку орграфов на изоморфизм, что может составлять квадратичную сложность по памяти и, по меньшей мере, квадратичную, а в некоторых случаях и экспоненциальную сложность по времени.

  • 4.2. Принудительная передача атрибута через носитель 5.    Оценки роста числа состояний

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

Алгоритм [3] строит граф реконструкции за O(|V + |2) по времени для групп процессов, сессий и любых других атрибутов, требующих малое число вложенных проходов по сравнению с числом вершин. Исправление переводом в SSA приводит к такой же сложности. Однако представляют интерес временные оценки от |V| как количества вершин во входном дереве процессов, по которым и можно априорно оценивать время работы алгоритма. Покажем, что |V +| для любых корректных входных деревьев с группами процессов и сессиями - той же степени, что и |V|, то есть по размеру входного множества оценка также квадратична.

Теорема 1. Если VG(T ) = (V + ,Е+) :Т = (V, Е ) - корректное дерево процессов с атрибутами {pid,sid,pgid}. пго |"jyq| 6 0(1).

Доказательство. Пусть |V| = N. Для каждого процесса рассмотрим атрибут группы процессов, выставляемый в поддереве, и жестко наследуемый атрибут сессии. Нужно добавить к V носители и создатели различных атрибутов C s и C g, которые будут использоваться в V s ii V g. которых, в худшем случае, не более N [4]:

|V +| =N + |CS| + |Cg | + |VS| + \ Vg | 6 3N + |CS| + |Cg |.

Для реконструкции группы процессов нужен создатель, лежащий в одной с целевым состоянием сессии, и, возможно, отдельный носитель. Создатель и носитель группы «1» уже создан - это корневой процесс. Таким образом, |Cg| 6 2(N — 1). Рассмотрим передачу атрибута сессии процессу. Пусть Зг, и Е V + : v.sid == u.pid. Любой атрибут сессии, отличный от собственного, нужно наследовать, то есть для любого процесса ж в цепочке между и и г существует такое состояние, что x.sid = u.pid. Пусть 1(г,и) - длина цепи от и к г, a d(T ) -высота дерева Т. Очевидно, 1(г,и) 6 l(r,root) <  d(r), то есть требуется дополнительно не более (d(r) — 1) промежуточных состояний для наследования сессии. Тогда

|(А| 6 £ l(r,root) 6 |VS|(d(T) — 1).

^ E V s

Сессия, отличная от наследованной, выставляется лишь единожды, поэтому можно исключить такие процессы из требующих дополнительных - они сначала переносят чужую, а затем создают свою сессию, откуда следует более точная оценка |I4| = (N d(T ) — 1):

|CS| 6 (N — d(T) — 1)(d(T) — 1) = Nd(T ) — d2(T) + 1.

Заметим, что d(T ) 6 (N — 1). слелователыю.

|CS| 6 (N(N — 1) — (N — 1)2 + 1) = N2 — N — N 2 + 2N — 1 + 1 = N,

|V +|   3N + 2(N — 1) + N    O(N )

ТЩ 6------ N ------~ O(N) ~ O(1).

6.    Заключение

Рассмотренные в работе способы внесения исправлений позволяют ликвидировать аномалии, связанные с нарушением полурешёточной упорядоченности, вносимые в процесс реконструкции деревьев процессов жадными методами поиска промежуточных состояний. При этом число промежуточных состояний для основных типов атрибутов увеличивается не критично, что практически важно. В дальнейшем следует привести строгое обобщение теоремы 1 на случай других атрибутов: дескрипторов межпроцессного взаимодействия, сигналов, пространств имён, отличных от пространства процессов. Представляет интерес также проведение экспериментов на различных наборах нагрузок: то, что аномалии в деревьях - статистически редкое событие, было проверено на синтетических тестах [2, 3] и требует дополнительных экспериментов на различных профилях нагрузки в реальных системах.

Работа выполнена при поддержке Егора Горбунова (Acronis), впервые обнаружившего и предоставившего рассмотренный тестовый пример.

Список литературы Исправление аномалий в графах реконструкции деревьев процессов Linux

  • Mirkin A., Kuznetsov A., Kolyshkin K. Containers checkpointing and live migration // Proceedings of the In Ottawa Linux Symposium. 2008. V. 2. P. 85-90.
  • Efanov N.N., Emelyanov P.V. Constructing the formal grammar of system calls // In Proceedings of the 13th Central DOI: 10.1145/3166094.3166106
  • Efanov N.N., Emelyanov P.V. Linux Process Tree Reconstruction Using The Attributed Grammar-Based Tree Transformation Model // In Proceedings of the 14th Central DOI: 10.1145/3290621.3290626
  • Ефанов Н.Н. О некоторых комбинаторных свойствах деревьев процессов Linux // Чебышевский сборник. 2018. Т. 19, вып. 2. C. 151-162.
  • Ефанов Н.Н. О некоторых полурешеточных свойствах состояний процессов Linux // Материалы XVI Международной конференции «Алгебра, теория чисел и дискретная геометрия: современные проблемы, приложения и проблемы истории». 2019. C. 165- 168.
  • Davey B.A., Priestley H.A. Introduction to Lattices and Order, 2nd Edition. Cambridge University Press, 2002.
  • Credentials - Process Identifiers / MANual Pages. Linux Programmer's Manual. 2019. http://man7.org/linux/man-pages/man7/credentials.7.html
  • Appel A.W. SSA is functional programming // SIGPLAN Not. 1998. V. 33, N 4. P. 17-20.
  • Cormen T.H., Leiserson Ch.E., Rivest R.L., Stein C. Introduction to Algorithms, 2nd Edition. MIT Press and McGraw-Hill. 2001.
Еще
Статья научная