Ця стаття є сирим з іншої мови. Можливо, вона створена за допомогою машинного перекладу або перекладачем, який недостатньо володіє обома мовами. (травень 2016) |
Алгоритм пекарні Лампорта - це комп'ютерний алгоритм розроблений вченим Леслі Лампорт, який призначений для підвищення безпеки у використанні загальних ресурсів між декількома потоками за допомогою взаємного виключення.
В інформатиці для одночасного доступу до загальних ресурсів часто використовують потоки. Пошкодження даних може статися, якщо два або більше потоків намагаються записати в одну комірку пам'яті, або якщо один потік читає осередок пам'яті, перш ніж інший закінчив писати в нього. Алгоритм пекарні Лампорта є одним з багатьох взаємно виключених алгоритмів, призначених для запобігання одночасного входження в критичні секції коду, щоб виключити ризик пошкодження даних.
Алгоритм
Аналогія
Лампортом передбачено пекарню з глобальним лічильником біля входу, так що кожен клієнт отримує унікальний номер. Числа збільшуються на одиницю, коли клієнти входять в магазин. Глобальний лічильник показує номер клієнта, який в даний час обслуговується. Всі інші клієнти повинні чекати в черзі, поки пекар не завершить обслуговувати поточного клієнта і поки на таблі не відобразиться наступний номер. Коли клієнт зробив покупки і утилізував свій номер, то службовець збільшує лічильник на одиницю, дозволяючи наступному клієнтові зробити покупки. Попередній клієнт повинен отримати ще один номер з лічильника, щоб мати змогу знову зайти в магазин.
За аналогією, "клієнти" є потоки, які отримали номер i з глобальної змінної.
Через обмеження комп'ютерної архітектури, деякі частини аналогії Лампорта потребують невеликої модифікації. Цілком можливо, що більш ніж один потік отримає таке ж число n, коли вони просять його; це не може бути попереджено. Таким чином, передбачається, що ідентифікатор потоку також є пріоритетом. Менше значення I означає більш високий пріоритет, і потоки з більш високим пріоритетом будуть входити в критичну секцію перші.
Критичний сектор
Критична секція являє собою ту частину коду, яка вимагає виняткового доступу до ресурсів і може виконуватися тільки одним потоком одночасно. У хлібопекарської аналогії, це коли клієнт торгує з пекарем і інші повинні чекати.
Коли потік хоче увійти в критичну секцію, він повинен перевірити, чи є в даний час його черга зробити це. Він повинен перевірити число п будь-якого іншого потоку, щоб переконатися, що він має найменше. У разі, якщо інший потік має таке ж число, потік з найменшим увійде в критичну секцію в першу чергу.
У псевдокоді ці порівняння між потоками А і В можуть бути записані у вигляді:
(na, ia) < (nb, ib)
що еквівалентно:
(na < nb) or ((na == nb) and (ia < ib))
Коли потік закінчує свою критичну роботу, він позбавляється номера і входить в некритичний сектор.
Некритичний сектор
Некритичний сектор коду - це код, який не потребує виняткового доступу. Він являє собою якийсь потік конкретних обчислень, що не забраковує ресурсів і виконання інших потоків.
Ця частина аналогічна діям, які відбуваються після покупок, наприклад, покласти решту назад в гаманець.
Реалізація алгоритму
Визначення
В оригінальній статті Лампорта, змінна виступає як вибір, і виконуються наступні умови:
- Слова, які вибирають [I] і число [I] знаходяться в пам'яті процесу I, і ініціалізуються з нуля.
- Діапазон значень числа [i] необмежена.
- Процес може потерпіти невдачу в будь-який час. Ми припускаємо, що, коли він виходить з ладу, він відразу переходить до некретичної секції і зупиняється. Може бути період, коли читання з пам'яті дає довільні значення. Зрештою, будь-що, що зчитує дані з пам'яті повинно дати значення, рівне нулю.
Приклади коду
Псевдокод
У цьому прикладі всі потоки виконуються ту ж "main" функцію,. У реальних додатках, різні потоки часто мають різні "main" функції.
Зверніть увагу, що, як і в оригінальній статті, сама нитка перевіряється перед входом в критичну секцію. Оскільки умова циклу буде оцінювати як помилкова, це не викликає особливих затримок.
// declaration and initial values of global variables Entering: array [1..NUM_THREADS] of bool = {false}; Number: array [1..NUM_THREADS] of integer = {0}; lock(integer i) { Entering[i] = true; Number[i] = 1 + max(Number[1], ..., Number[NUM_THREADS]); Entering[i] = false; for (integer j = 1; j <= NUM_THREADS; j++) { // Wait until thread j receives its number: while (Entering[j]) { /* nothing */ } // Wait until all threads with smaller numbers or with the same // number, but with higher priority, finish their work: while ((Number[j] != 0) && ((Number[j], j) < (Number[i], i))) { /* nothing */ } } } unlock(integer i) { Number[i] = 0; } Thread(integer i) { while (true) { lock(i); // The critical section goes here... unlock(i); // non-critical section... } }
PlusCal код
Ми визначаємо N числом процесів, і ми припускаємо, що N представляє собою натуральне число.
CONSTANT N ASSUME N \in Nat
Визначимо Р як безліч {1, 2, ..., N} процесів.
P == 1..N
Змінні num і прапор оголошені як глобальні.
--algorithm AtomicBakery { variable num = [i \in P |-> 0], flag = [i \in P |-> FALSE];
Нижче йде опис LL (J, I), щоб бути вірним, якщо << Num [J], J >> менше або дорівнює << Num [I], I >> в звичайне лексикографічне впорядкування.
define { LL(j, i) == \/ num[j] < num[i] \/ /\ num[i] = num[j] /\ j =< i }
Для кожного елемента в Р існує процес з локальними непрочитаними зміними, макс.і наст. Кроки між послідовними мітками p1, ..., Р7, CS вважаються автономні. Оператор (х \ in S) {} тіла встановлює ідентифікатор до недетермінірованного вибраного елемента S, а потім виконує тіло. Крок, який містить пріоритет чекає умови, крок може бути виконаний лише тоді, коли значення умови TRUE.
process (p \in P) variables unread \in SUBSET P, max \in Nat, nxt \in P; { p1: while (TRUE) { unread := P \ {self} ; max := 0; flag[self] := TRUE; p2: while (unread # {}) { with (i \in unread) { unread := unread \ {i}; if (num[i] > max) { max := num[i]; } } }; p3: num[self] := max + 1; p4: flag[self] := FALSE; unread := P \ {self} ; p5: while (unread # {}) { with (i \in unread) { nxt := i ; }; await ~ flag[nxt]; p6: await \/ num[nxt] = 0 \/ LL(self, nxt) ; unread := unread \ {nxt}; } ; cs: skip ; \* the critical section; p7: num[self] := 0; }} }
Java код
ArrayList<Integer> ticket = new ArrayList<>(threads); // ticket for threads in line, n - number of threads // Java initializes each element of 'ticket' to 0 ArrayList<Boolean> entering = new ArrayList<>(threads); // 1 when thread entering in line // Java initializes each element of 'entering' to 0 public void lock(int pid) // thread ID { entering.set(pid, true); int max = 0; for (int i = 0; i < threads; i++) { int current = ticket.get(i); if (current > max) { max = current; } } ticket.set(pid, 1 + max); entering.set(pid, false); for (int i = 0; i < ticket.length(); ++i) { if (i != pid) { while (entering.get(i) == 1) { Thread.yield(); } // wait while other thread picks a ticket while (ticket.get(i) != 0 && ( ticket.get(pid) > ticket.get(i) || (ticket.get(pid) == ticket.get(i) && pid > i))) { Thread.yield(); } } } // The critical section goes here... } public void unlock(int pid) { ticket.set(pid, 0); }
Обговорення
Кожен потік тільки пише власне сховище, тільки читає загальні. Примітно, що цей алгоритм не побудований на вершині якоїсь більш низького рівня "атомна" операція області, наприклад порівняння з обміном. Оригінал показує, що для дублювання операцій читання і запису в теж сховище зберігання тільки записи повинні бути правильними. Операція читання може повернути довільне число. Тому цей алгоритм може бути використаний для реалізації взаємного виключення на пам'ять, яка відчуває нестачу примітиви синхронізації, наприклад, простий диск SCSI розділені між двома комп'ютерами.
Необхідність змінної, яка входить може бути не очевидна, так як немає "закриття" навколо лінії 7 до 13. Проте, припустимо, що змінна була видалена, і два процеси обчислюється так само Number[i]
. Якщо процес з більш високим пріоритетом був витіснений перед встановленнямNumber[i]
, процес з низьким пріоритетом буде бачити, що інший процес має значення нуля, і увійде в критичний сектор; пізніше, процес з високим пріоритетом буде ігнорувати рівній Number[i]
для більш низького пріоритету процесів, а також увійде в критичний сектор. В результаті, два процеси можуть увійти в критичний сектор одночасно. Алгоритм пекарня використовує змінну введення, щоб робить призначення на лінії 6 як неподільними; В процесі I ніколи не побачити число, рівне нулю для процесу J, який збирається вибрати таку ж кількість, як і I.
При реалізації псевдокода в одній технологічній системі або під кооперативну багатозадачність, то краще замінити "нічого не робити" розділи з кодом, якы повідомляють операційну систему, щоб негайно перейти до наступної нитки. Це також часто називають yield
.
Алгоритм пекарні Лампорта передбачає послідовну модель узгодженості пам'яті. Мало хто, якщо такі є, мови або багатоядерні процесори можуть реалізувати таку модель пам'яті. Тому правильна реалізація алгоритму зазвичай вимагає вставки модифікацій для скасування перепризначення.
Див. також
- Алгоритм Декера
- Алгоритм Айсберга & Мк'Гуіра
- Алгоритм Пітерсона
- Алгоритм Жуманскі
- Семафор
Посилання
- Chinmay Narayan, Shibashis Guha, S.Arun-Kumar Inferring Fences in a Concurrent Program Using SC proof of Correctness [ 4 листопада 2016 у Wayback Machine.]
- Оригінальний папір [ 18 квітня 2007 у Wayback Machine.]
- На своїй сторінці [ 5 серпня 2011 у Wayback Machine.], Лампорт додав кілька зауважень щодо алгоритму.
Зовнішні посилання
- Заміна Воллеса алгоритму пекарні [ 6 травня 2018 у Wayback Machine.] який долає обмеження мови Javascript
- Алгоритм пекарні Лампорта [ 16 серпня 2007 у Wayback Machine.]
- Another JavaScript implementation [ 11 червня 2018 у Wayback Machine.] by a.in.the.k
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ye sirim perekladom z inshoyi movi Mozhlivo vona stvorena za dopomogoyu mashinnogo perekladu abo perekladachem yakij nedostatno volodiye oboma movami Bud laska dopomozhit polipshiti pereklad traven 2016 Algoritm pekarni Lamporta ce komp yuternij algoritm rozroblenij vchenim Lesli Lamport yakij priznachenij dlya pidvishennya bezpeki u vikoristanni zagalnih resursiv mizh dekilkoma potokami za dopomogoyu vzayemnogo viklyuchennya V informatici dlya odnochasnogo dostupu do zagalnih resursiv chasto vikoristovuyut potoki Poshkodzhennya danih mozhe statisya yaksho dva abo bilshe potokiv namagayutsya zapisati v odnu komirku pam yati abo yaksho odin potik chitaye oseredok pam yati persh nizh inshij zakinchiv pisati v nogo Algoritm pekarni Lamporta ye odnim z bagatoh vzayemno viklyuchenih algoritmiv priznachenih dlya zapobigannya odnochasnogo vhodzhennya v kritichni sekciyi kodu shob viklyuchiti rizik poshkodzhennya danih AlgoritmAnalogiya Lamportom peredbacheno pekarnyu z globalnim lichilnikom bilya vhodu tak sho kozhen kliyent otrimuye unikalnij nomer Chisla zbilshuyutsya na odinicyu koli kliyenti vhodyat v magazin Globalnij lichilnik pokazuye nomer kliyenta yakij v danij chas obslugovuyetsya Vsi inshi kliyenti povinni chekati v cherzi poki pekar ne zavershit obslugovuvati potochnogo kliyenta i poki na tabli ne vidobrazitsya nastupnij nomer Koli kliyent zrobiv pokupki i utilizuvav svij nomer to sluzhbovec zbilshuye lichilnik na odinicyu dozvolyayuchi nastupnomu kliyentovi zrobiti pokupki Poperednij kliyent povinen otrimati she odin nomer z lichilnika shob mati zmogu znovu zajti v magazin Za analogiyeyu kliyenti ye potoki yaki otrimali nomer i z globalnoyi zminnoyi Cherez obmezhennya komp yuternoyi arhitekturi deyaki chastini analogiyi Lamporta potrebuyut nevelikoyi modifikaciyi Cilkom mozhlivo sho bilsh nizh odin potik otrimaye take zh chislo n koli voni prosyat jogo ce ne mozhe buti poperedzheno Takim chinom peredbachayetsya sho identifikator potoku takozh ye prioritetom Menshe znachennya I oznachaye bilsh visokij prioritet i potoki z bilsh visokim prioritetom budut vhoditi v kritichnu sekciyu pershi Kritichnij sektor Kritichna sekciya yavlyaye soboyu tu chastinu kodu yaka vimagaye vinyatkovogo dostupu do resursiv i mozhe vikonuvatisya tilki odnim potokom odnochasno U hlibopekarskoyi analogiyi ce koli kliyent torguye z pekarem i inshi povinni chekati Koli potik hoche uvijti v kritichnu sekciyu vin povinen pereviriti chi ye v danij chas jogo cherga zrobiti ce Vin povinen pereviriti chislo p bud yakogo inshogo potoku shob perekonatisya sho vin maye najmenshe U razi yaksho inshij potik maye take zh chislo potik z najmenshim uvijde v kritichnu sekciyu v pershu chergu U psevdokodi ci porivnyannya mizh potokami A i V mozhut buti zapisani u viglyadi na ia lt nb ib sho ekvivalentno na lt nb or na nb and ia lt ib Koli potik zakinchuye svoyu kritichnu robotu vin pozbavlyayetsya nomera i vhodit v nekritichnij sektor Nekritichnij sektor Nekritichnij sektor kodu ce kod yakij ne potrebuye vinyatkovogo dostupu Vin yavlyaye soboyu yakijs potik konkretnih obchislen sho ne zabrakovuye resursiv i vikonannya inshih potokiv Cya chastina analogichna diyam yaki vidbuvayutsya pislya pokupok napriklad poklasti reshtu nazad v gamanec Realizaciya algoritmuViznachennya V originalnij statti Lamporta zminna vistupaye yak vibir i vikonuyutsya nastupni umovi Slova yaki vibirayut I i chislo I znahodyatsya v pam yati procesu I i inicializuyutsya z nulya Diapazon znachen chisla i neobmezhena Proces mozhe poterpiti nevdachu v bud yakij chas Mi pripuskayemo sho koli vin vihodit z ladu vin vidrazu perehodit do nekretichnoyi sekciyi i zupinyayetsya Mozhe buti period koli chitannya z pam yati daye dovilni znachennya Zreshtoyu bud sho sho zchituye dani z pam yati povinno dati znachennya rivne nulyu Prikladi kodu Psevdokod U comu prikladi vsi potoki vikonuyutsya tu zh main funkciyu U realnih dodatkah rizni potoki chasto mayut rizni main funkciyi Zvernit uvagu sho yak i v originalnij statti sama nitka pereviryayetsya pered vhodom v kritichnu sekciyu Oskilki umova ciklu bude ocinyuvati yak pomilkova ce ne viklikaye osoblivih zatrimok declaration and initial values of global variables Entering array 1 NUM THREADS of bool false Number array 1 NUM THREADS of integer 0 lock integer i Entering i true Number i 1 max Number 1 Number NUM THREADS Entering i false for integer j 1 j lt NUM THREADS j Wait until thread j receives its number while Entering j nothing Wait until all threads with smaller numbers or with the same number but with higher priority finish their work while Number j 0 amp amp Number j j lt Number i i nothing unlock integer i Number i 0 Thread integer i while true lock i The critical section goes here unlock i non critical section PlusCal kod Mi viznachayemo N chislom procesiv i mi pripuskayemo sho N predstavlyaye soboyu naturalne chislo CONSTANT N ASSUME N in Nat Viznachimo R yak bezlich 1 2 N procesiv P 1 N Zminni num i prapor ogolosheni yak globalni algorithm AtomicBakery variable num i in P gt 0 flag i in P gt FALSE Nizhche jde opis LL J I shob buti virnim yaksho lt lt Num J J gt gt menshe abo dorivnyuye lt lt Num I I gt gt v zvichajne leksikografichne vporyadkuvannya define LL j i num j lt num i num i num j j lt i Dlya kozhnogo elementa v R isnuye proces z lokalnimi neprochitanimi zminimi maks i nast Kroki mizh poslidovnimi mitkami p1 R7 CS vvazhayutsya avtonomni Operator h in S tila vstanovlyuye identifikator do nedeterminirovannogo vibranogo elementa S a potim vikonuye tilo Krok yakij mistit prioritet chekaye umovi krok mozhe buti vikonanij lishe todi koli znachennya umovi TRUE process p in P variables unread in SUBSET P max in Nat nxt in P p1 while TRUE unread P self max 0 flag self TRUE p2 while unread with i in unread unread unread i if num i gt max max num i p3 num self max 1 p4 flag self FALSE unread P self p5 while unread with i in unread nxt i await flag nxt p6 await num nxt 0 LL self nxt unread unread nxt cs skip the critical section p7 num self 0 Java kod ArrayList lt Integer gt ticket new ArrayList lt gt threads ticket for threads in line n number of threads Java initializes each element of ticket to 0 ArrayList lt Boolean gt entering new ArrayList lt gt threads 1 when thread entering in line Java initializes each element of entering to 0 public void lock int pid thread ID entering set pid true int max 0 for int i 0 i lt threads i int current ticket get i if current gt max max current ticket set pid 1 max entering set pid false for int i 0 i lt ticket length i if i pid while entering get i 1 Thread yield wait while other thread picks a ticket while ticket get i 0 amp amp ticket get pid gt ticket get i ticket get pid ticket get i amp amp pid gt i Thread yield The critical section goes here public void unlock int pid ticket set pid 0 Obgovorennya Kozhen potik tilki pishe vlasne shovishe tilki chitaye zagalni Primitno sho cej algoritm ne pobudovanij na vershini yakoyis bilsh nizkogo rivnya atomna operaciya oblasti napriklad porivnyannya z obminom Original pokazuye sho dlya dublyuvannya operacij chitannya i zapisu v tezh shovishe zberigannya tilki zapisi povinni buti pravilnimi Operaciya chitannya mozhe povernuti dovilne chislo Tomu cej algoritm mozhe buti vikoristanij dlya realizaciyi vzayemnogo viklyuchennya na pam yat yaka vidchuvaye nestachu primitivi sinhronizaciyi napriklad prostij disk SCSI rozdileni mizh dvoma komp yuterami Neobhidnist zminnoyi yaka vhodit mozhe buti ne ochevidna tak yak nemaye zakrittya navkolo liniyi 7 do 13 Prote pripustimo sho zminna bula vidalena i dva procesi obchislyuyetsya tak samo Number i Yaksho proces z bilsh visokim prioritetom buv vitisnenij pered vstanovlennyamNumber i proces z nizkim prioritetom bude bachiti sho inshij proces maye znachennya nulya i uvijde v kritichnij sektor piznishe proces z visokim prioritetom bude ignoruvati rivnij Number i dlya bilsh nizkogo prioritetu procesiv a takozh uvijde v kritichnij sektor V rezultati dva procesi mozhut uvijti v kritichnij sektor odnochasno Algoritm pekarnya vikoristovuye zminnu vvedennya shob robit priznachennya na liniyi 6 yak nepodilnimi V procesi I nikoli ne pobachiti chislo rivne nulyu dlya procesu J yakij zbirayetsya vibrati taku zh kilkist yak i I Pri realizaciyi psevdokoda v odnij tehnologichnij sistemi abo pid kooperativnu bagatozadachnist to krashe zaminiti nichogo ne robiti rozdili z kodom yaky povidomlyayut operacijnu sistemu shob negajno perejti do nastupnoyi nitki Ce takozh chasto nazivayut yield Algoritm pekarni Lamporta peredbachaye poslidovnu model uzgodzhenosti pam yati Malo hto yaksho taki ye movi abo bagatoyaderni procesori mozhut realizuvati taku model pam yati Tomu pravilna realizaciya algoritmu zazvichaj vimagaye vstavki modifikacij dlya skasuvannya perepriznachennya Div takozhAlgoritm Dekera Algoritm Ajsberga amp Mk Guira Algoritm Pitersona Algoritm Zhumanski SemaforPosilannyaChinmay Narayan Shibashis Guha S Arun Kumar Inferring Fences in a Concurrent Program Using SC proof of Correctness 4 listopada 2016 u Wayback Machine Originalnij papir 18 kvitnya 2007 u Wayback Machine Na svoyij storinci 5 serpnya 2011 u Wayback Machine Lamport dodav kilka zauvazhen shodo algoritmu Zovnishni posilannyaZamina Vollesa algoritmu pekarni 6 travnya 2018 u Wayback Machine yakij dolaye obmezhennya movi Javascript Algoritm pekarni Lamporta 16 serpnya 2007 u Wayback Machine Another JavaScript implementation 11 chervnya 2018 u Wayback Machine by a in the k