Кому потрібна лінійність?


13

Я читав про відмінності між серіалізабельністю та лінійністю , які є одночасно критеріями узгодженості для реплікуваних систем, таких як реплікувані бази даних. Однак я не знаю, у яких випадках потрібна лінеаризабельність, хоча вона сильніша за серіалізаційність.

Не могли б ви придумати сценарії, де насправді така сильна властивість буде потрібна?


Ви можете перевірити на wikipedia: en.wikipedia.org/wiki/… , або на папері Герліхія та Крила: "Лінійність, умова правильності для одночасних об'єктів".
Едуардо Безерра

Відповіді:


5

Розглянемо дизайн сумісних структур даних, що не потребують очікування (або без замків, які слабкіші). У цьому сценарії зазвичай потрібна лінійність, хоча в деяких випадках продуктивність та масштабованість можна покращити, задовольнивши більш слабкі умови коректності. Чи корисна реалізація, що задовольняє такий слабкий стан, зазвичай залежить від додатків. На відміну від цього, лінійна реалізація завжди корисна, оскільки дизайнери можуть розглядати її як атомну.

Більше того, лінійність є властивістю, що не блокує: загальну операцію (визначену для всіх станів об'єкта) ніколи не потрібно блокувати. Натомість, Serializability - не властивість, що не блокує. Тому, щоб підвищити ступінь одночасності, дизайнери паралельних структур даних завжди покладаються на лінійність.


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

Схоже, ви не прочитали оригінальне запитання щодо ОП. ОП не запитували, що таке лінійність, він запитував "Кому потрібна лінійність"? Моя відповідь доречна, оскільки вона дає ОП прикладовий сценарій (принаймні, ОП вважав за потрібне та обрано). Те, що ви не знаєте, що є одночасно структурами даних без очікування, є зовсім іншим фактом. До речі, ОП знала, про що я говорю. Якби нам довелося пояснити кожну концепцію, яку ми використовуємо у відповіді, відповідь ніколи не закінчиться ;-)
Массімо Кафаро

10

Я багато разів перечитував Герліхія і Крила за останні 15 років. Це дуже важко читати. І це прикро, адже, хоча навколо країв є деякі тонкощі, основна ідея насправді цілком розумна.

Коротше кажучи: лінійність можна подібно до серіалізаційності, але з додатковою вимогою, щоб серіалізація дотримувалась додаткових обмежень впорядкування між транзакціями. Мета полягає в тому, щоб дозволити вам суворо міркувати про окрему структуру даних атомів, а не обґрунтовувати всю систему відразу.

Лінеаризованість також легко досягти: просто асоціюйте мютекс із об'єктом, який ви хочете лінеаризувати. Кожна транзакція на цьому об'єкті починається із блокування мютексу та закінчується розблокуванням мютексу.

Ось визначення, які я буду використовувати:

Система є серіалізабільною, якщо надається набір транзакцій над набором даних, будь-який результат виконання транзакцій такий же, як якщо б транзакції були виконані в якомусь послідовному порядку, а операції в межах кожної транзакції містяться в межах їх транзакції в порядку вказаний кодом транзакції.

Серіалізалізація вимикає появу перемежування операцій між різними транзакціями і вимагає, щоб обраний порядок операцій відповідав причинності (якщо транзакція A записує значення x, а транзакція B зчитує значення x, яке написав A, тоді транзакція A повинна передувати транзакції B у обраний послідовний порядок.) Але він нічого не говорить про будь-які інші обмеження впорядкування операцій (зокрема, він нічого не говорить про процеси та порядок, в якому процеси сприймають події.)

Існує ще одна пов'язана ідея, яка додає обмеження щодо порядку, в якому виконуються операції (але не говорить про транзакції лише окремих операцій читання / запису):

Система послідовно послідовна, якщо результат будь-якого виконання такий же, як якщо б операції всіх процесів були виконані в якомусь послідовному порядку, а операції кожного окремого процесу відображаються в цій послідовності в порядку, визначеному його програмою. ( Лампорт, "Як зробити багатопроцесорний комп'ютер, який правильно виконує багатопроцесорні програми", IEEE T Comp 28: 9 (690-691), 1979 ).

При визначенні послідовної послідовності чітким є те, що ми приймаємо послідовні порядки лише тоді, коли для кожного місця пам'яті (об'єкта) індукований послідовний порядок операцій підкоряється правилу, що значення, повернене кожною операцією зчитування в розташування, xповинно бути тим самим значенням, яке було написано безпосередньо перед операцією запису до місця розташування xв послідовному порядку.

Лінеаризабельність має добрі наміри (a) поєднувати разом поняття транзакцій (від серіалізації) з уявленням, що процеси очікують завершення операцій, які вони видають, у порядку (від послідовної послідовності) та (b) звуження критеріїв правильності, щоб говорити про кожну об'єкта в ізоляції, а не змушувати вас міркувати про систему в цілому. (Мені хотілося б сказати, що реалізація мого об'єкта є правильною навіть у системі, де є інші об'єкти, які не піддаються лінійному відриву.) Я вважаю, що Герліхій і Вінг могли намагатися чітко визначити монітор .

Частина (а) є "простою": Послідовна вимога, що нагадує послідовність, полягає в тому, щоб транзакції на об'єкт, виданий кожним процесом, відображалися в отриманій послідовності в порядку, визначеному програмою. Вимогою, що нагадує серіалізацію, було б те, щоб транзакції на об'єкт були взаємовиключними (можуть бути серіалізовані).

Складність походить від об'єкта (б) (вміння говорити про кожен об'єкт незалежно від усіх інших).

У системі з декількома об'єктами можливо, що операції над об'єктом B встановлюють обмеження в порядку, в якому, на нашу думку, операції були викликані на об'єкті А. Якщо ми дивимось всю історію системи, то ми будемо обмежені певними послідовними порядками, і потрібно буде відхилити інших. Але ми хотіли критерії коректності, які ми могли б використовувати ізольовано (міркування про те, що відбувається з об'єктом A, не звертаючись до глобальної історії системи).

Наприклад: припустимо, я намагаюся сперечатися про правильність об'єкта A, який є чергою, припустимо, що об'єкт B є місцем пам'яті, і припустимо, що у мене є такі історії виконання: Нитка 1: A.enqueue (x), A. dequeue () (повертає y). Тема 2: A.enqueue (y), A.dequeue () (повертає x). Чи є переплетення подій, які дозволяли б виконати цю чергу правильним? Так:

Thread 1                           Thread 2
A.enqueue(x)                       ...
...                                A.enqueue(y)
...                                A.dequeue() (returns x)
A.dequeue(y) (returns y)           ...

Але що робити, якщо історія ( включаючи об’єкт B ): B починається зі значення 0. Нитка 1: A.enqueue (x), A.dequeue () (повертає y), B.write (1). Нитка 2: B.read () (повертає 1) A.enqueue (y), A.dequeue () (повертає x).

Thread 1                           Thread 2
A.enqueue(x)                       ...
A.dequeue() (returns y)            ...                       (uh oh!)
B.write(1)                         ...
...                                B.read() (returns 1)
...                                A.enqueue(y)
...                                A.dequeue() (returns x)

Тепер ми хотіли б, щоб наше визначення "правильності" сказало, що ця історія вказує на те, що або наша реалізація A є помилковою, або наша реалізація B є помилковою, тому що немає серіалізації, яка "має сенс" (або Thread 2 потрібно прочитати значення від B, яке ще не було написано, або Thread 1 потрібно зняти значення з A, яке ще не було зафіксовано.) Тож наша оригінальна серіалізація транзакцій на A здавалася розумною, якщо наша реалізація дозволяє історію, як другу, то явно невірна.

Отже, обмеження, які додає лінеаризація, є цілком розумними (і необхідними навіть для простих структур даних, таких як черги FIFO.) Вони є такими, як: "Ваша реалізація повинна заборонити dequeue () значення, яке не буде вдаватися () до деякого часу в майбутнє ». Домогтися лінійності можна досить просто (і природно): просто асоціюйте мютекс із вашим об'єктом, і кожна транзакція починається блокуванням і закінчується розблокуванням. Розум про лінійність можна починати хитрувати, коли ви намагаєтесь реалізувати свою атомність за допомогою методів, що не блокують, не замикають чи не чекають замість простих мютексів.

Якщо вас цікавлять деякі вказівки до літератури, я виявив наступне (хоча я думаю, що дискусія про "реальний час" є однією з червоно-оселедців, які роблять лінеаризабільність складнішою, ніж це потрібно.) Https: // stackoverflow.com/questions/4179587/difference-bet between-linearizability-and-serializability


Що ви маєте на увазі, стверджуючи, що `` Я вважаю, що Герліхій і Крило, можливо, намагалися чітко визначити монітор. ''? Не могли б ви додати деякі деталі. (Я читаю стаття Герліхія і Крила.)
hengxin

1
Я не думаю, що я мав на увазі щось глибоке. Перш ніж я прочитав Герліхія і Крило, те, що я читав про монітори, все діяло. Щось на кшталт "монітор - це абстрактний тип даних, який неявно має мутекс, і кожен метод типу набуває мутекс на початку та випускає мютекс в кінці", після чого йде складна дискусія про те, коли це добре wait()і до notify(). Лінеаризабельність дає змогу говорити про правильність виконання набагато складніших / оптимізованих моніторів.
Блукаюча логіка

Для мене це має сенс. Дякую. Сьогодні я прочитав Related Workчастину статті Ерліхія і Крила. Вони згадували monitorяк ілюстрацію свого твердження, що Our notion of linearizability generalizes and unifies similar notions found in specific examples in the literature. Однак загальне питання: чи широко застосовано поняття лінійності для багатопроцесорних систем (наприклад, апаратне забезпечення, компілятор, мова програмування та супутні структури даних)? (Будучи короткозорим, я знаю лише такі речі, як монітор.) Якщо ні, то які перешкоди? Який сучасний стан?
hengxin

Я думаю, що це вважається бажаною властивістю, яку іноді занадто дорого застосовувати. Дивіться, наприклад, курси.csail.mit.edu/6.852/01/papers/p91-attiya.pdf . Також на практиці я думаю, що більшість паралельних хеш-мапів мають блокування на відро, але немає глобального блокування, і, таким чином, може мати дивну поведінку будь-коли, коли вставка / видалення призводить до зміни розміру хеш-таблиці.
Мандрівна логіка

Дякую за довгий відповідь, але я боюся , що ти не сказав мені , коли лінеарізуемость було цікаво, а визначається тільки його і, якщо на те пішло, що ви визначили це неправильно: це НЕ досить того, що кожен процес бачить в операції порядок їх видачі. Порядок у всіх процесах також повинен бути послідовним. Але виправте мене, якщо я помиляюся ...
Едуардо Безерра

2

По-перше, лінійність та серіалізаційність не можна порівняти безпосередньо. Як показано в таблиці нижче, основна відмінність полягає в тому, що в лівій частині всі окремі операції є атомними (як, наприклад, наявність яви synchronizedнавколо кожної оп. З правого боку одиниця атомності - це транзакція; окрема операція не є атомною Тому серіалізація завжди була частиною літератури баз даних, тоді як ліва частина була предметом літератури процесорної пам'яті (опція "читання / запис" - атомна). Оригінальні сховища ключових значень (наприклад, dbm та започаткований) почався з лівого боку (get / put є атомним), але новіші все частіше підтримують транзакції (наприклад, гайковий ключ Google).

obj. операції атомні | Угоди є атомними
-------------------------------- + ----------------- ----------------
Лінійність |
Послідовна послідовність | Серіалізація
Причинно-наслідкова послідовність |
Консистенція кешу |

Лінійність можливостей вимагає, щоб система об'єктів у паралельній установці повинна поводитися ідентично послідовній системі, яка обробляє одну операцію (пара запитів / відповідей) одночасно - у паралельній всесвіті - таким чином, що (a) клієнти в обох Всесвітах бачити точно однакові відповіді (b) тимчасовий порядок збережений (докладніше про це нижче).

Визначення серіалізабельності, як послідовної послідовності, вимагає лише першого критерію.

Збереження тимчасового порядку означає це: якщо A: x.op1 () (A - клієнт, x - об'єкт, а op1 - операція), завершена до початку іншої операції B: y.op2 (), то у послідовній всесвіті запити обробляються в тому ж порядку. Це не потрібно в послідовній послідовності (SC); об’єкту дозволяється складати чергу на запит клієнта, відповідати на нього, а потім оцінювати його пізніше. Крім того, об’єкт може обробляти поданий запит від якогось іншого клієнта поза чергою, оцінюючи його перед тим, як дійти до першого.

Незбереження тимчасового порядку є проблемою. Після A: x.op1 (), припустимо, A взяв телефон і повідомив B про це, потім B подзвонив x.op2 (). Система не може дізнатися про цей причинний ланцюжок подій, оскільки другий крок включав повідомлення, яке не відстежується системою. У багатьох реальних випадках A нерозумно вважати, що як тільки x відповів на нього, виклик B може покладатися на оновлений стан. Якщо тимчасовий порядок не зберігся, A і B чекають несподіванки. Цього не відбудеться в системі, що обмежується лінійністю.

Друга приємна властивість збереження тимчасового порядку - це локальність і композиційність, що система, побудована з лінійних об'єктів, сама по собі лінійна. Отже, замість того, щоб мати одне монолітне сховище ключів-значень, ви можете розподілити його на безліч окремих розділів, кожен з яких керується власним сервером KV-магазину; якщо кожен з них є лінійним, вся база даних функціонує як один лінійний монолітний сховище КВ, без зайвих зусиль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.