Я багато разів перечитував Герліхія і Крила за останні 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