Ця стаття не містить . (травень 2016) |
Ця стаття містить правописні, лексичні, граматичні, стилістичні або інші мовні помилки, які треба виправити. (травень 2016) |
Алгоритм без блокування (англ. Non-blocking algorithm) — підхід в паралельному програмуванні на симетрично-багатопроцесорних системах, що проповідує відмову від традиційних примітивів блокування, таких, як семафори, м'ютекси і події. Розподіл доступів між потоками відбувається внаслідок атомарних операцій і спеціально розроблених під конкретну задачу механізмів блокування.
Перевага алгоритмів без блокування — ліпша масштабованість за кількістю процесорів. До того ж якщо ОС перерве один з потоків фонового процесу, інші, як мінімум, виконають свою роботу без простою. Як максимум — візьмуть невиконану роботу на себе.
Мотивація
Традиційний підхід до багатониткового програмування є використання блокувань для синхронізації доступу до спільних ресурсів. Примітиви синхронізації, такі як м'ютекси, семафори і критичні секції — це всі механізми, з допомогою яких програміст може гарантувати, що певні фрагменти коду не виконаються одночасно, якщо це призведе до пошкодження структур спільної пам'яті.
Блокування потоку небажане з багатьох причин. Очевидна причина в тому, що в той час, як потік блокується, він не може нічого зробити: якщо блокований потік виконував першочергове або завдання в реальному часі, було б украй небажано зупиняти його прогрес.
Інші проблеми менш очевидні. Наприклад, певні взаємодії між блокуваннями можуть привести до виникнення помилок, наприклад, безвихідь, динамічно глухий кут, і інверсії пріоритетів.
На відміну від алгоритмів блокування, алгоритми без блокування не мають таких недоліків, а крім того безпечні для використання в обробниках переривань.
Три рівні синхронізації без блокування
Від найслабшого до найсильнішого:
- Без перешкод (англ. obstruction-free)
- Найслабша з гарантій. Потік здійснює прогрес, якщо не зустрічає перешкод з боку інших потоків. Алгоритм працює без перешкод, якщо потік, запущений у будь-який момент (за умови, що виконання всіх інших потоків призупинено) завершить свою роботу за визначену кількість кроків. Синхронізація за допомогою м'ютексів не відповідає навіть цій вимозі: якщо потік зупиниться, захопивши м'ютекс, то інші потоки, яким цей м'ютекс потрібен, будуть простоювати.
- Без блокувань (англ. lock-free)
- Для алгоритмів без блокувань гарантується системний прогрес принаймні одного потоку. Наприклад, потік, що виконує операцію «порівняння з обміном» в циклі, теоретично може виконуватися нескінченно, але кожна ітерація означає, що якийсь інший потік здійснив прогрес, тобто система в цілому здійснює прогрес.
- Без очікувань (англ. wait-free)
- Найбільш сувора гарантія прогресу. Алгоритм працює без очікувань, якщо кожна операція виконується за визначену кількість кроків, не залежно від інших потоків.
Причини та переваги
Під час створення багатопотокових додатків часто виникає необхідність організувати спільний доступ до загального ресурсу. Традиційний підхід дозволяє надати послідовний доступ за допомогою такого механізму синхронізації, як блокування. Примітиви синхронізації, такі як м'ютекси, семафори та критичні секції, дозволяють написати ділянку коду, який гарантовано не буде виконуватися одночасно при зверненні з паралельних потоків — одночасний доступ до ділянки загальної пам'яті може призвести до пошкодження вмісту. Спроба одного з потоків отримати блокування, яка вже зайнята іншим потоком, призводить до призупинення виконання першого потоку до моменту звільнення блокування іншим потоком.
Простий м'ютекс здійснюється за допомогою так званого spinlock 'а - порожнього циклу з атомарними операціями. Складніші примітиви, що вибудовують потоки в чергу, влаштовані за допомогою витратної операції, що називається "перемикання контексту", і того ж spinlock 'а в ядрі (KiDispatcherLock в Windows), який захищає чергу з пріоритетами. Коли навантаження на примітиви синхронізації невелике (наприклад, паралельна робота потоку обробки даних і призначеного для користувача інтерфейсу програми), витрати від порожніх циклів і перемикань невеликі.
Але коли потрібно було обробляти великі масиви даних на багатоядерних процесорах, з'явилися специфічні проблеми: на кожен елемент масиву м'ютекс не встановиш. Якщо ж синхронізувати інформацію великими блоками (наприклад, один м'ютекс на 10 000 елементів), потоки проводять надто багато часу в очікуванні свого м'ютекса. До того ж звичайний персональний комп'ютер з ОС загального призначення, зайнятий, окрім розрахунків, закачуванням інформації з інтернету, обробкою подій від миші та промальовуванням вікон інших програм, може призупиняти потоки на невизначений час. Алгоритми без блокувань гарантують, що такі зупинки одного з потоків не приведуть до простою інших. Особливо важлива відсутність простоїв, якщо один з потоків виконує високопріоритетне завдання або завдання реального часу.
Синхронізація без блокувань дозволяє повністю позбутися від взаємних блокувань. Втім, в алгоритмах без блокувань є свої помилки — зациклення (livelock) і «перегони».
Впровадження
Алгоритми без блокувань будуються на атомарних операціях, наприклад, читання-модифікація-запис і найбільш значуща з них — порівняння з обміном (CAS, Compare-and-swap). Впровадження критичної секції зазвичай заснована на використанні одного з примітивів. До певного часу всі впровадження алгоритмів без блокувань доводилося робити на «низькому» рівні апаратних засобів для забезпечення достатньої швидкодії. Згодом, з розвиток механізмів транзакційної пам'яті надають стандартні абстракції для написання ефективного коду без блокувань.
Також розроблено базові структури даних, такі як стек, черга, множина і хеш-таблиця. Такі структури дозволяють спростити асинхронний обмін даними між потоками програми. Деякі структури даних досить прості й можуть використовуватися без спеціальних атомарних блокувань, наприклад:
- послідовний доступ для всіх операцій читання і/або запису, циклічний буфер, черга
- читання-копіювання-відновлення (RCU) з єдиним писарем і будь-якою кількістю читачів. (Читачі отримують доступ до даних без очікування блокування; програми зазвичай працюють без блокувань, до тих пір поки не знадобиться звільнити пам'ять).
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno traven 2016 Cya stattya mistit pravopisni leksichni gramatichni stilistichni abo inshi movni pomilki yaki treba vipraviti Vi mozhete dopomogti vdoskonaliti cyu stattyu pogodivshi yiyi iz chinnimi movnimi standartami traven 2016 Algoritm bez blokuvannya angl Non blocking algorithm pidhid v paralelnomu programuvanni na simetrichno bagatoprocesornih sistemah sho propoviduye vidmovu vid tradicijnih primitiviv blokuvannya takih yak semafori m yuteksi i podiyi Rozpodil dostupiv mizh potokami vidbuvayetsya vnaslidok atomarnih operacij i specialno rozroblenih pid konkretnu zadachu mehanizmiv blokuvannya Perevaga algoritmiv bez blokuvannya lipsha masshtabovanist za kilkistyu procesoriv Do togo zh yaksho OS pererve odin z potokiv fonovogo procesu inshi yak minimum vikonayut svoyu robotu bez prostoyu Yak maksimum vizmut nevikonanu robotu na sebe MotivaciyaDokladnishe Blokuvannya programuvannya Tradicijnij pidhid do bagatonitkovogo programuvannya ye vikoristannya blokuvan dlya sinhronizaciyi dostupu do spilnih resursiv Primitivi sinhronizaciyi taki yak m yuteksi semafori i kritichni sekciyi ce vsi mehanizmi z dopomogoyu yakih programist mozhe garantuvati sho pevni fragmenti kodu ne vikonayutsya odnochasno yaksho ce prizvede do poshkodzhennya struktur spilnoyi pam yati Blokuvannya potoku nebazhane z bagatoh prichin Ochevidna prichina v tomu sho v toj chas yak potik blokuyetsya vin ne mozhe nichogo zrobiti yaksho blokovanij potik vikonuvav pershochergove abo zavdannya v realnomu chasi bulo b ukraj nebazhano zupinyati jogo progres Inshi problemi mensh ochevidni Napriklad pevni vzayemodiyi mizh blokuvannyami mozhut privesti do viniknennya pomilok napriklad bezvihid dinamichno gluhij kut i inversiyi prioritetiv Na vidminu vid algoritmiv blokuvannya algoritmi bez blokuvannya ne mayut takih nedolikiv a krim togo bezpechni dlya vikoristannya v obrobnikah pererivan Tri rivni sinhronizaciyi bez blokuvannyaVid najslabshogo do najsilnishogo Bez pereshkod angl obstruction free Najslabsha z garantij Potik zdijsnyuye progres yaksho ne zustrichaye pereshkod z boku inshih potokiv Algoritm pracyuye bez pereshkod yaksho potik zapushenij u bud yakij moment za umovi sho vikonannya vsih inshih potokiv prizupineno zavershit svoyu robotu za viznachenu kilkist krokiv Sinhronizaciya za dopomogoyu m yuteksiv ne vidpovidaye navit cij vimozi yaksho potik zupinitsya zahopivshi m yuteks to inshi potoki yakim cej m yuteks potriben budut prostoyuvati Bez blokuvan angl lock free Dlya algoritmiv bez blokuvan garantuyetsya sistemnij progres prinajmni odnogo potoku Napriklad potik sho vikonuye operaciyu porivnyannya z obminom v cikli teoretichno mozhe vikonuvatisya neskinchenno ale kozhna iteraciya oznachaye sho yakijs inshij potik zdijsniv progres tobto sistema v cilomu zdijsnyuye progres Bez ochikuvan angl wait free Najbilsh suvora garantiya progresu Algoritm pracyuye bez ochikuvan yaksho kozhna operaciya vikonuyetsya za viznachenu kilkist krokiv ne zalezhno vid inshih potokiv Prichini ta perevagiPid chas stvorennya bagatopotokovih dodatkiv chasto vinikaye neobhidnist organizuvati spilnij dostup do zagalnogo resursu Tradicijnij pidhid dozvolyaye nadati poslidovnij dostup za dopomogoyu takogo mehanizmu sinhronizaciyi yak blokuvannya Primitivi sinhronizaciyi taki yak m yuteksi semafori ta kritichni sekciyi dozvolyayut napisati dilyanku kodu yakij garantovano ne bude vikonuvatisya odnochasno pri zvernenni z paralelnih potokiv odnochasnij dostup do dilyanki zagalnoyi pam yati mozhe prizvesti do poshkodzhennya vmistu Sproba odnogo z potokiv otrimati blokuvannya yaka vzhe zajnyata inshim potokom prizvodit do prizupinennya vikonannya pershogo potoku do momentu zvilnennya blokuvannya inshim potokom Prostij m yuteks zdijsnyuyetsya za dopomogoyu tak zvanogo spinlock a porozhnogo ciklu z atomarnimi operaciyami Skladnishi primitivi sho vibudovuyut potoki v chergu vlashtovani za dopomogoyu vitratnoyi operaciyi sho nazivayetsya peremikannya kontekstu i togo zh spinlock a v yadri KiDispatcherLock v Windows yakij zahishaye chergu z prioritetami Koli navantazhennya na primitivi sinhronizaciyi nevelike napriklad paralelna robota potoku obrobki danih i priznachenogo dlya koristuvacha interfejsu programi vitrati vid porozhnih cikliv i peremikan neveliki Ale koli potribno bulo obroblyati veliki masivi danih na bagatoyadernih procesorah z yavilisya specifichni problemi na kozhen element masivu m yuteks ne vstanovish Yaksho zh sinhronizuvati informaciyu velikimi blokami napriklad odin m yuteks na 10 000 elementiv potoki provodyat nadto bagato chasu v ochikuvanni svogo m yuteksa Do togo zh zvichajnij personalnij komp yuter z OS zagalnogo priznachennya zajnyatij okrim rozrahunkiv zakachuvannyam informaciyi z internetu obrobkoyu podij vid mishi ta promalovuvannyam vikon inshih program mozhe prizupinyati potoki na neviznachenij chas Algoritmi bez blokuvan garantuyut sho taki zupinki odnogo z potokiv ne privedut do prostoyu inshih Osoblivo vazhliva vidsutnist prostoyiv yaksho odin z potokiv vikonuye visokoprioritetne zavdannya abo zavdannya realnogo chasu Sinhronizaciya bez blokuvan dozvolyaye povnistyu pozbutisya vid vzayemnih blokuvan Vtim v algoritmah bez blokuvan ye svoyi pomilki zaciklennya livelock i peregoni VprovadzhennyaAlgoritmi bez blokuvan buduyutsya na atomarnih operaciyah napriklad chitannya modifikaciya zapis i najbilsh znachusha z nih porivnyannya z obminom CAS Compare and swap Vprovadzhennya kritichnoyi sekciyi zazvichaj zasnovana na vikoristanni odnogo z primitiviv Do pevnogo chasu vsi vprovadzhennya algoritmiv bez blokuvan dovodilosya robiti na nizkomu rivni aparatnih zasobiv dlya zabezpechennya dostatnoyi shvidkodiyi Zgodom z rozvitok mehanizmiv tranzakcijnoyi pam yati nadayut standartni abstrakciyi dlya napisannya efektivnogo kodu bez blokuvan Takozh rozrobleno bazovi strukturi danih taki yak stek cherga mnozhina i hesh tablicya Taki strukturi dozvolyayut sprostiti asinhronnij obmin danimi mizh potokami programi Deyaki strukturi danih dosit prosti j mozhut vikoristovuvatisya bez specialnih atomarnih blokuvan napriklad poslidovnij dostup dlya vsih operacij chitannya i abo zapisu ciklichnij bufer chergachitannya kopiyuvannya vidnovlennya RCU z yedinim pisarem i bud yakoyu kilkistyu chitachiv Chitachi otrimuyut dostup do danih bez ochikuvannya blokuvannya programi zazvichaj pracyuyut bez blokuvan do tih pir poki ne znadobitsya zvilniti pam yat Posilannya