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

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

CC BY
49
6
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ / АНАЛИЗ ЗАВИСИМОСТЕЙ / ОПЕРАЦИОННЫЕ СИСТЕМЫ / КОНТРОЛЬНЫЕ ТОЧКИ / ДЕРЕВЬЯ ПРОЦЕССОВ / ВОССТАНОВЛЕНИЕ СОСТОЯНИЙ / ПОЛУРЕШЁТКИ / MATHEMATICAL MODELING / DEPENDENCY ANALYSIS / OPERATIONAL SYSTEMS / CHECKPOINT RESTORE / PROCESS TREES / STATES RECONSTRUCTION / SEMILATTICES

Аннотация научной статьи по математике, автор научной работы — Ефанов Н.Н.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

On anomalies correction in reconstruction graphs of Linux process trees

The paper discusses an example of the Linux process tree on which the use of greedy reconstruction algorithms gives anomalous results. Analysis of dependencies between states of processes in the reconstruction graph is performed. Then the violation of semilattice ordering by dependencies in the resulting graphs is concluded. Corrections in to the original methods for constructing a reconstruction graph by copying states with target attributes are proposed, the complexity of the obtained corrections is analyzed. We give estimates of the growth of a set of intermediate states for the process group and session attributes using both the original and corrected methods for constructing a reconstruction graph. The estimation of the computational complexity depending on the vertices number in the input process tree is given as well.

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

УДК 519.172

Н. Н. Ефанов

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

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

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

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

N. N. Efanov Moscow Institute of Physics and Technology

On anomalies correction in reconstruction graphs of Linux

process trees

The paper discusses an example of the Linux process tree on which the use of greedy-reconstruction algorithms gives anomalous results. Analysis of dependencies between states of processes in the reconstruction graph is performed. Then the violation of semilattice ordering by dependencies in the resulting graphs is concluded. Corrections in to the original methods for constructing a reconstruction graph by copying states with target attributes are proposed, the complexity of the obtained corrections is analyzed. We give estimates of the growth of a set of intermediate states for the process group and session attributes using both the original and corrected methods for constructing a reconstruction graph. The estimation of the computational complexity depending on the vertices number in the input process tree is given as well.

Key words: mathematical modeling, dependency analysis, operational systems, checkpoint restore, process trees, states reconstruction, semilattices.

1. Введение

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

© Ефанов H.H., 2019

© Федеральное государственное автономное образовательное учреждение высшего образования

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

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

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

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

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

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

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

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

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

Т = (У,Е),

(1)

С(Т) = (V+,Е+),

(2)

Уу E V + 3v.attr : v.key = val(v.attr[key])l'None', Укеу E К, К список атрибутов процесса - идентификаторов, файловых дескрипторов, других описателей системных ресурсов, и val(v.attr[key]) : К ^ typed_val(key) - отображение таких имён на типизированные значения атрибутов. Вспомогательно вводится понятие множества вершин с равным значением атрибута u.attri:D(attr1,u.attr1) = {v E V + Iv.attri = u.attri}.

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

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

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

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

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

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

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

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

Qdep(T) = (у +, Edep и Е+), (3)

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

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

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

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

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

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

function AGTTM (IR,Т,ехрг); Input : IR,T,expr Output: D

for any Node in dfs(T.root) do

cond = f (expr(Node.attr)) // проверка текущей вершины и предка 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, к (cond)); end

return D;

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

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

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

2) иначе, если атрибут жестко наследованный, как сессия, и не совпал с родительским, добавляются носители атрибута в цепочке от возможно добавленного создателя в процедуре 'upbranch', выполняемой, в худшем случае, за 0(\V%ntermed%ate\) ^ 0(\V +|), •уintermediate _ текущие состояния: входные и уже воссозданные в ходе работы;

3) иначе, производится внутренний обход за 0(\Vmtermed%ate\) ^ 0(|V+1), в котором сопоставляются правила для атрибутов, выставляемых не только наследованием, как группа процессов.

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

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

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

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

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

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

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

а)

б)

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

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

Зависимости, разрешаемые в ходе построения разделяются на 4 типа и определя-

ются соответствующими операторами предзамыкания и замыкания [5]:

1) Зависимость от вершины-предшественника РСЬ(и, аИг)рге

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

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

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

PCL(u,attr)syscaller задают отношения, соответствующие рёбрам, антинаправленным рёбрам системных вызовов в G, кроме того, можно считать, что PCL(u, attr)syscaller совпадают с PCL(u, attr)pred , так как в случае с вызовами fork, setsid и setpgid процесс-предшественник, лежащий в замыкании по минимально доминирующему атрибуту - сессии в случае группы процессов, пространству имён процессов в случае сессии и номера процесса, имеет возможность самостоятельно выполнить действие по созданию потомка или выставлению собственного атрибута [7]. Таким образом, для анализа представленного примера достаточно рассмотреть разрешение зависимостей типа PCL(u,attr)creator и PCL(u,attr)pred.

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

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

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

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

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

W=PCL(u,t

а)

б)

в)

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

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

Предложим вариатны исправления исходного как на этапе пост-обработки, так и непосредственно на этапе построения.

э4[1]=з1[1]

(3 2 т) р^П]

V У д2|2]=д4[1]

— з2[1]

Д)

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

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

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

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

function Gdep2SSA (Gdep, К); Input : Gdep ,K Output: SSA(Gdep)correct for P in getChains(Gdep) do for proc in P do epoch=l

for attr in К \ {pid} do

addNewVar(attr,epoch) // start epoch+=l

if proc.attr = PCL(proc, attr)pred.attr then

addNewVar(attr,epoch) // новая переменная для attr epoch += 1

if isCreator(PCL(proc,attr)creator,attr) then

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

return Gdep;

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

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

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

без нарушения разрешимости, то есть формально полурешёточная упорядоченность V+ соблюдается.

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

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

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

4.2. Принудительная передача атрибута через носитель

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

5. Оценки роста числа состояний

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

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

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

|F+| = N + |CS| + ^д | + + | < 3N + |CS| + | Сд |.

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

|Сs| < £ l(v,root) < ^ Kd(T) — 1).

vevs

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

|Св| < (М — (1(Т) — 1)((1(Т) — 1) = Ый(Т) — (12(Т) + 1. Заметим, что й(Т) < (И — 1), следовательно,

|Св| < (М(Ы — 1) — (Ы — 1)2 + 1) = N2 — N — N2 + 2Ы — 1 + 1 = Ы,

]У+! < 3М + 2(М — 1) + N Р(М)

| < N ~ О(М) ~ )'

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

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

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

Литература

1. Mirkin A., Kuznetsov A., Kolyshkin К. Containers checkpointing and live migration // Proceedings of the In Ottawa Linux Symposium. 2008. V. 2. P. 85-90.

2. Efanov N.N., Emelyanov P. V. Constructing the formal grammar of system calls //In Proceedings of the 13th Central k, Eastern European Software Engineering Conference in Russia (CEE-SECR '17). ACM, New York, NY, USA. 2017. Article 12, 5 pages.

doi: 10.1145/3166094.3166106

3. Efanov N.N., Emelyanov P. V. Linux Process Tree Reconstruction Using The Attributed Grammar-Based Tree Transformation Model //In Proceedings of the 14th Central k, Eastern European Software Engineering Conference in Russia (CEE-SECR '18). ACM, New York, NY, USA. 2018. Article 2, 7 pages.

doi: 10.1145/3290621.3290626

4. Ефанов H.H. О некоторых комбинаторных свойствах деревьев процессов Linux // Чебышевский сборник. 2018. Т. 19, вып. 2. С. 151-162.

5. Ефанов Н.Н. О некоторых полурешеточных свойствах состояний процессов Linux // Материалы XVI Международной конференции «Алгебра, теория чисел и дискретная геометрия: современные проблемы, приложения и проблемы истории». 2019. С. 165— 168.

6. Davey В.A., Priestley Н.А. Introduction to Lattices and Order, 2nd Edition. Cambridge University Press, 2002.

7. Credentials ^Process Identifiers / MANual Pages. Linux Programmer's Manual. 2019. http://man7.Org/linux/man-pages/man7/credentials.7.html

8. Appel A.W. SSA is functional programming // SIGPLAN Not. 1998. V. 33, N 4. P. 17-20.

9. Gormen T.H., Leiserson Ch.E., Rivest R.L., Stein C. Introduction to Algorithms, 2nd Edition. MIT Press and McGraw-Hill. 2001.

References

1. Mirkin A., Kuznetsov A., Kolyshkin K. Containers checkpointing and live migration. Proceedings of the In Ottawa Linux Symposium. 2008. V. 2. P. 85-90.

2. Efanov N.N., Emelyanov P. V. Constructing the formal grammar of system calls. In Proceedings of the 13th Central k, Eastern European Software Engineering Conference in Russia (CEE-SECR '17). 2017. ACM, New York, NY, USA. Article 12, 5 pages.

doi: 10.1145/3166094.3166106

3. Efanov N.N., Emelyanov P. V. Linux Process Tree Reconstruction Using The Attributed Grammar-Based Tree Transformation Model. Proceedings of the 14th Central k, Eastern European Software Engineering Conference in Russia (CEE-SECR '18). 2018. ACM, New York, NY, USA. Article 2, 7 pages.

doi: 10.1145/3290621.3290626

4. Efanov N.N. On some combinatorial properties of Linux process trees. Chebvshevskii Sbornik. 2018. V. 19, N 2. P. 151-162. (in Russian).

5. Efanov N.N. On some semilattice properties of Linux processes' states. Proceedings of the XVI International scientific conference ??Algebra, number theory and discrete geometry: current problems, applications and history problems?? 2019. P. 165-168. (in Russian).

6. Davey B.A., Priestley H.A. Introduction to Lattices and Order, 2nd Edition. Cambridge University Press, 2002.

7. Credentials ^Process Identifiers / MANual Pages. Linux Programmer's Manual. 2019. http://man7.org/linux/man-pages/man7 / credentials.7.html

8. Andrew W. Appel. SSA is functional programming. SIGPLAN Not. 1998. V. 33, N 4. P. 1720.

9. Thom,as H. Gormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms, 2nd Edition. MIT Press and McGraw-Hill. 2001.

Поступим в редакцию 18.07.2019

i Надоели баннеры? Вы всегда можете отключить рекламу.