Базовые определения и формализм — различия между версиями
Anverk (обсуждение | вклад) (Ещё определения) |
м (rollbackEdits.php mass rollback) |
||
(не показано 17 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
− | == Определения == | + | ==Определения== |
+ | === Базовые определения === | ||
{{Определение | {{Определение | ||
|id = system_execution | |id = system_execution | ||
− | |definition = '''Исполнение системы''' <tex>-</tex> это пара <tex> (H, \rightarrow_H)</tex>, где: | + | |definition = |
+ | [[Файл: Happens before.png|400px|справа|thumb|Отношения между операциями <tex> e, f, g </tex> процессов <tex> P, Q, R </tex>]] | ||
+ | '''Исполнение системы''' <tex>-</tex> это пара <tex> (H, \rightarrow_H)</tex>, где: | ||
* <tex> H - </tex> множество '''операций''' <tex> e, f, g\ldots </tex> (чтение, запись ячеек памяти и т.п.), произошедших во время исполнения | * <tex> H - </tex> множество '''операций''' <tex> e, f, g\ldots </tex> (чтение, запись ячеек памяти и т.п.), произошедших во время исполнения | ||
* <tex> \rightarrow_H - </tex> это отношение частичного строгого порядка на множестве операций (транзитивное, антирефлексивное, асимметричное) | * <tex> \rightarrow_H - </tex> это отношение частичного строгого порядка на множестве операций (транзитивное, антирефлексивное, асимметричное) | ||
* <tex> e \rightarrow_H f </tex> означает, что операция <tex> e </tex> '''произошла до''' операции <tex> f </tex> в исполнении <tex> H </tex> | * <tex> e \rightarrow_H f </tex> означает, что операция <tex> e </tex> '''произошла до''' операции <tex> f </tex> в исполнении <tex> H </tex> | ||
− | '''Замечание''': чаще всего исполнение <tex> H </tex> понятно из контекста и опускается | + | '''Замечание''': чаще всего исполнение <tex> H </tex> понятно из контекста и опускается <br /> |
− | + | Пусть <tex> e, f \in H. </tex> Тогда говорят, что <tex> e </tex> '''параллельна''' <tex> f </tex>, если <tex> e \not \rightarrow f \land f \not \rightarrow e. </tex> <br /> Обозначение: <tex> e || f </tex> | |
− | |||
− | |||
− | |||
− | |||
}} | }} | ||
Строка 20: | Строка 19: | ||
{{Определение | {{Определение | ||
− | |id = global_time_model | + | |id = global_time_model |
− | |definition = '''Модель глобального времени''' определим так, что это модель, в которой в качестве '''операции''' используется временной интервал: <tex> e = [t_{inv}(e), t_{res}(e)], </tex> причём <tex> t_{inv}(e), t_{res}(e) \in \mathbb{R} </tex>. Зададим в этой модели отношение <tex> \rightarrow </tex> следующим образом: <tex> e \rightarrow f = t_{inv}(f) > t_{res}(e) </tex>. Неформально это означает, что вход в функцию, выполняющую операцию <tex> f </tex>, был осуществлён строго позже, чем был получен результат работы функции, выполняющей операцию <tex> e </tex>. <br />'''Замечание''': глобального времени не существует из-за физических ограничений, поэтому в доказательствах такая модель не используется, но помогает при визуализации различных исполнений | + | |definition = [[Файл: Global time modeling.png|справа|400px|Отношения между операциями <tex> e, f, g </tex> процессов <tex> P, Q, R </tex> в модели глобального времени]] |
+ | '''Модель глобального времени''' определим так, что это модель, в которой в качестве '''операции''' используется временной интервал: <tex> e = [t_{inv}(e), t_{res}(e)], </tex> причём <tex> t_{inv}(e), t_{res}(e) \in \mathbb{R} </tex>. Зададим в этой модели отношение <tex> \rightarrow </tex> следующим образом: <tex> e \rightarrow f = t_{inv}(f) > t_{res}(e) </tex>. Неформально это означает, что вход в функцию, выполняющую операцию <tex> f </tex>, был осуществлён строго позже, чем был получен результат работы функции, выполняющей операцию <tex> e </tex>. <br />'''Замечание''': глобального времени не существует из-за физических ограничений, поэтому в доказательствах такая модель не используется, но помогает при визуализации различных исполнений | ||
}} | }} | ||
{{Определение | {{Определение | ||
|id = sequenced_control_flow | |id = sequenced_control_flow | ||
− | |definition = Исполнение системы <tex> H </tex> называется '''последовательным''', если <tex> \forall e, f \in H: (e = f) \lor (e \rightarrow f) \lor (f \rightarrow e) </tex>. То есть, если все операции линейно-упорядочены отношением "произошло до". | + | |definition = Исполнение системы <tex> (H, \rightarrow) </tex> называется '''последовательным''', если <tex> \forall e, f \in H: (e = f) \lor (e \rightarrow f) \lor (f \rightarrow e) </tex>. То есть, если все операции линейно-упорядочены отношением "произошло до". |
}} | }} | ||
− | + | === Конфликты и гонки данных === | |
− | + | {{Определение | |
|id = conflict | |id = conflict | ||
− | |definition = Две операции над одной переменной, одна из которых это запись, называются '''конфликтующими'''. Соответственно, бывают '''read-write''' и ''write-write''' конфликты. | + | |definition = Две операции над одной переменной, одна из которых это запись, называются '''конфликтующими'''. Соответственно, бывают '''read-write''' и '''write-write''' конфликты. |
}} | }} | ||
− | + | {{Определение | |
|id = data_race | |id = data_race | ||
− | |definition = Если две конфликтующие операции произошли параллельно, то такая ситуация называется '''гонка данных (data race | + | |definition = Если две конфликтующие операции произошли параллельно, то такая ситуация называется '''гонка данных''' (англ. ''data race'') <br /> '''Замечание''': наличие гонки данных является свойством конкретного '''исполнения'''. |
}} | }} | ||
− | + | {{Определение | |
− | |id = | + | |id = correctly_syncronized |
|definition = Программа называется '''корректно синхронизированной''', если в '''любом допустимом''' исполнении нет гонок данных. | |definition = Программа называется '''корректно синхронизированной''', если в '''любом допустимом''' исполнении нет гонок данных. | ||
}} | }} | ||
+ | |||
+ | === Правильное исполнение === | ||
+ | {{Определение | ||
+ | |id = restriction_on_thread | ||
+ | |definition = [[Файл: Well formed.png|справа|400px|Пример правильного и неправильного исполнения]] | ||
+ | '''Сужение''' исполнения <tex> (H, \rightarrow) </tex> на поток <tex> P - </tex> исполнение, в котором остались только операции, происходящие в потоке <tex> P </tex>. <br /> Обозначение: <tex> \left.H\right|_P </tex>. Формально <tex> \left.H\right|_P = \{e \in H|\ proc(e) = P\}</tex> <br /> | ||
+ | Исполнение называется '''правильным''' (англ. ''well-formed''), если его сужение на каждый поток <tex> P </tex> является последовательным. | ||
+ | }} | ||
+ | {{Определение | ||
+ | |id = program_order | ||
+ | |definition = Объединение всех сужений на потоки называется '''программным порядком''' (англ. ''program order'' или ''po''). | ||
+ | }} | ||
+ | {{Определение | ||
+ | |id = restriction_on_object | ||
+ | |definition = '''Сужение''' исполнения <tex> (H, \rightarrow) </tex> на объект <tex> x - </tex> исполнение, в котором остались только операции, взаимодействующие с объектом <tex> x </tex>. <br /> Обозначение: <tex> \left.H\right|_x </tex>. Формально <tex> \left.H\right|_x = \{e \in H|\ obj(e) = x\}</tex> <br /> '''Замечание''': в правильном исполнении сужение на объекты не всегда является последовательным | ||
+ | }} | ||
+ | |||
+ | === Условия согласованности === | ||
+ | {{Определение | ||
+ | |id = agreement | ||
+ | |definition = '''Согласованность''' является аналогом ''корректности'' в многопоточном программировании. <br /> | ||
+ | '''Базовое требование согласованности:''' корректные последовательные программы должны cчитаться согласованными при любом их исполнении в одном потоке | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |id = legacy_control_flow | ||
+ | |definition = | ||
+ | Последовательное исполнение является '''допустимым''' (англ. ''legal''), если выполнены последовательные спецификации всех объектов. | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |id = legacy_control_flow | ||
+ | |definition = | ||
+ | Исполнение '''последовательно согласовано''', если можно сопоставить '''эквивалентное''' ему (состоящее из тех же событий и операций) допустимое последовательное исполнение, которое сохраняет программный порядок, то есть порядок операций на каждом потоке. <br / > | ||
+ | '''Замечание: ''' Последовательная согласованность на каждом объекте не влечёт последовательную согласованность исполнения | ||
+ | }} | ||
+ | |||
+ | [[Файл: Legal execution.png|400px|Допустимое и недопустимое исполнения]] [[Файл: Seq agreed.png|400px|Последовательно согласованное исполнение]] [[Файл: Contrexample seq agr on object.png|thumb|400px|справа|Пример отсутствия последовательной согласованности исполнения при последовательной согласованности на каждом объекте (<tex> s, t - </tex> две FIFO очереди)]] | ||
+ | {{Определение | ||
+ | |id = linearizabilty | ||
+ | |definition = Исполнение <tex> (H, \rightarrow_H) </tex> '''линеаризуемо''', если существует эквивалентное ему допустимое последовательное исполнение <tex> (L(H), \rightarrow_{L(H)}) </tex>, называемое '''линеаризацией''', и верно что <tex> \forall e, f \in H: e \rightarrow_H f \Rightarrow e \rightarrow_{L(H)} f </tex>, то есть сохраняется отношение "произошло до". | ||
+ | }} | ||
+ | [[Файл: Linearizability.png|400px|Пример линеаризуемого исполнения]] | ||
+ | |||
+ | === Декомпозиция исполнения === | ||
+ | {{Определение | ||
+ | |id = decomosition | ||
+ | |definition = Определим '''декомпозицию исполнения''' как пятёрку <tex> (H, G, \rightarrow_G, inv, res) </tex>, где | ||
+ | * <tex> H -</tex> множество '''операций''' <tex> (\forall e \in H: e \subset G) </tex> | ||
+ | * <tex> G -</tex> множество '''событий''' | ||
+ | * <tex> \rightarrow_G - </tex> отношение строгого порядка '''произошло до''' на '''событиях''' из <tex> G </tex> | ||
+ | * <tex> inv, res: H \rightarrow G - </tex> такие функции, что | ||
+ | ** <tex> \forall e \in H: inv(e) \rightarrow_G res(e) </tex> | ||
+ | ** <tex> \forall e \in H, g \in e, g \neq inv(e), g \neq res(e): inv(e) \rightarrow_G g \rightarrow_G res(e) </tex> | ||
+ | }} | ||
+ | {{Определение | ||
+ | |id = was_before_event | ||
+ | |definition = Определим '''произошло до''' на '''операциях''': <tex> \forall e, f \in H: e \rightarrow_H f = res(e) \rightarrow_G inv(f) </tex> | ||
+ | }} | ||
+ | |||
+ | == Свойства линеаризуемости == | ||
+ | |||
+ | {{Определение | ||
+ | |id = linearization_points | ||
+ | |definition = Пусть дана декомпозиция <tex> (H, G, \rightarrow_G, inv, res) </tex>. Тогда определим '''точки линеаризации''' как функцию <tex> p: H \rightarrow G </tex> такую, что: | ||
+ | * <tex> \forall e \in H: p \neq inv(e) \land p \neq res(e) </tex> | ||
+ | * <tex> P = p(H) \subset G -</tex> множество всех точек линеаризации | ||
+ | * <tex> (L(P), \rightarrow_{L(P)}) -</tex> линеаризация <tex> (G, \rightarrow_G) </tex>, то есть <tex> \forall e, f \in H: p(e) \rightarrow_G p(f) \Rightarrow p(e) \rightarrow_{L(P)} p(f) </tex> | ||
+ | }} | ||
+ | |||
+ | {{Утверждение | ||
+ | |about=эквивалентное определение линеаризуемости | ||
+ | |statement=Пусть дана декомпозиция <tex> (H, G, \rightarrow_G, inv, res) </tex>. | ||
+ | |||
+ | Исполнение <tex> (H, \rightarrow_H) </tex> является линеаризуемым <tex> (L(H), \rightarrow_{L(H)}) </tex> тогда и только тогда, когда<tex>^*</tex> верны два условия: | ||
+ | # Можно выбрать '''точки линеаризации''' <tex> p: H \rightarrow G </tex> | ||
+ | # <tex> \forall e, f \in H: e \rightarrow_{L(H)} f \Leftrightarrow p(e) \rightarrow_{L(P)} p(f) </tex> | ||
+ | <tex>*</tex> Для существования точек линеаризации из линеаризации необходимо, чтобы бы выполнялось: <tex> \forall e, f \in H: e \rightarrow_{L(H)} f \Rightarrow \exists a \in e, b \in f: a \rightarrow_G b. </tex> | ||
+ | |proof= | ||
+ | <tex> \Leftarrow </tex> | ||
+ | Пусть есть точки линеаризации <tex> \forall e \in H: p(e) \in G </tex>, полный порядок <tex> \rightarrow_{L(P)} </tex> над ними. Требуется найти линеаризацию <tex> (L(H), \rightarrow_{L(H)}) </tex>. Определим <tex> L(H) </tex> как <tex> H </tex>, так как они по определению линеаризации должны быть эквивалентны, а <tex> \rightarrow_{L(H)} </tex> определим, воспользовавшись вторым условием предпосылки. Докажем корректность такой линеаризации, то есть что <tex> \forall e, f \in H: e \rightarrow_H f \Rightarrow e \rightarrow_{L(H)} </tex>: | ||
+ | # <tex> e \rightarrow_H f </tex> (дано) | ||
+ | # <tex> res(e) \rightarrow_G inv(f) </tex> (по определению <tex> \rightarrow_H </tex>) | ||
+ | # <tex> p(e) \rightarrow_G res(e) </tex> (по определению декомпозиции и точек линеаризации) | ||
+ | # <tex> inv(f) \rightarrow_G p(f) </tex> (по определению декомпозиции и точек линеаризации) | ||
+ | # <tex> p(e) \rightarrow_G p(f) </tex> (по транзитивности) | ||
+ | # <tex> p(e) \rightarrow_{L(P)} p(f) </tex> (по определению линеаризации) | ||
+ | # <tex> p(e) \rightarrow_{L(H)} p(f) </tex> (по определению <tex> \rightarrow_{L(H)} </tex>) | ||
+ | |||
+ | <tex> \Rightarrow </tex> | ||
+ | Добавим '''события''' <tex> \forall e \in H: p(e) </tex> в <tex> G </tex> такие, что <tex> inv(e) \rightarrow_G p(e) \rightarrow_G res(e) </tex> и для которых выполнено требование из <tex>*</tex>. Эти точки и будут точками линеаризации. Итак, построены точки линеаризации, которые, очевидно, сохраняют линеаризацию по их построению. | ||
+ | }} | ||
+ | |||
+ | '''Следствие 1.''' Для модели глобального времени эта теорема верна в обе стороны: действительно дополнительное требование выполняется, так как каждая операция в нём является непрерывным множеством. | ||
+ | |||
+ | '''Следствие 2.''' Чтобы среди точек линеаризации был порядок, согласованный с семантикой низкоуровневых операций, достаточно чтобы операции низкого уровня были атомарны (линеаризуемы) | ||
+ | |||
+ | == Источники информации == | ||
+ | |||
+ | * [https://en.wikipedia.org/wiki/Linearizability Linearizability] | ||
+ | * [https://cs.brown.edu/~mph/HerlihyW90/p463-herlihy.pdf Maurice P. Herlihy and Jeannette M. Wing {{---}} Linearizability: A Correctness Condition for Concurrent Objects] | ||
+ | |||
+ | [[Категория: Параллельное программирование]] |
Текущая версия на 19:34, 4 сентября 2022
Содержание
Определения
Базовые определения
Определение: |
Исполнение системы это пара , где:
Замечание: чаще всего исполнение Обозначение: |
Определение: |
Система Говорим, что система имеет свойство , если каждое исполнение системы имеет свойство | это множество всех возможных исполнений.
Определение: |
Модель глобального времени определим так, что это модель, в которой в качестве операции используется временной интервал: причём . Зададим в этой модели отношение следующим образом: . Неформально это означает, что вход в функцию, выполняющую операцию , был осуществлён строго позже, чем был получен результат работы функции, выполняющей операцию . Замечание: глобального времени не существует из-за физических ограничений, поэтому в доказательствах такая модель не используется, но помогает при визуализации различных исполнений |
Определение: |
Исполнение системы | называется последовательным, если . То есть, если все операции линейно-упорядочены отношением "произошло до".
Конфликты и гонки данных
Определение: |
Две операции над одной переменной, одна из которых это запись, называются конфликтующими. Соответственно, бывают read-write и write-write конфликты. |
Определение: |
Если две конфликтующие операции произошли параллельно, то такая ситуация называется гонка данных (англ. data race) Замечание: наличие гонки данных является свойством конкретного исполнения. |
Определение: |
Программа называется корректно синхронизированной, если в любом допустимом исполнении нет гонок данных. |
Правильное исполнение
Определение: |
Сужение исполнения |
Определение: |
Объединение всех сужений на потоки называется программным порядком (англ. program order или po). |
Определение: |
Сужение исполнения Обозначение: . Формально Замечание: в правильном исполнении сужение на объекты не всегда является последовательным | на объект исполнение, в котором остались только операции, взаимодействующие с объектом .
Условия согласованности
Определение: |
Согласованность является аналогом корректности в многопоточном программировании. Базовое требование согласованности: корректные последовательные программы должны cчитаться согласованными при любом их исполнении в одном потоке |
Определение: |
Последовательное исполнение является допустимым (англ. legal), если выполнены последовательные спецификации всех объектов. |
Определение: |
Исполнение последовательно согласовано, если можно сопоставить эквивалентное ему (состоящее из тех же событий и операций) допустимое последовательное исполнение, которое сохраняет программный порядок, то есть порядок операций на каждом потоке. Замечание: Последовательная согласованность на каждом объекте не влечёт последовательную согласованность исполнения |
Определение: |
Исполнение | линеаризуемо, если существует эквивалентное ему допустимое последовательное исполнение , называемое линеаризацией, и верно что , то есть сохраняется отношение "произошло до".
Декомпозиция исполнения
Определение: |
Определим декомпозицию исполнения как пятёрку
| , где
Определение: |
Определим произошло до на операциях: |
Свойства линеаризуемости
Определение: |
Пусть дана декомпозиция
| . Тогда определим точки линеаризации как функцию такую, что:
Утверждение (эквивалентное определение линеаризуемости): |
Пусть дана декомпозиция .
Исполнение является линеаризуемым тогда и только тогда, когда верны два условия:
|
Пусть есть точки линеаризации , полный порядок над ними. Требуется найти линеаризацию . Определим как , так как они по определению линеаризации должны быть эквивалентны, а определим, воспользовавшись вторым условием предпосылки. Докажем корректность такой линеаризации, то есть что :
Добавим события в такие, что и для которых выполнено требование из . Эти точки и будут точками линеаризации. Итак, построены точки линеаризации, которые, очевидно, сохраняют линеаризацию по их построению. |
Следствие 1. Для модели глобального времени эта теорема верна в обе стороны: действительно дополнительное требование выполняется, так как каждая операция в нём является непрерывным множеством.
Следствие 2. Чтобы среди точек линеаризации был порядок, согласованный с семантикой низкоуровневых операций, достаточно чтобы операции низкого уровня были атомарны (линеаризуемы)