Атомарна операціяАтомарна операція (англ. atomic operation, англ. atomic action) в програмуванні означає набір інструкцій з властивістю неперервності цілої операції. Окремі кроки операції можуть відбуватись в різний час та у різних частинах системи, однак для зовнішнього спостерігача така операція виглядає єдиною та неподільною[1]. Атомарна операція виконується повністю (або відбувається відмова у виконанні), без переривань. Атомарність має особливе значення в багатопроцесорних комп'ютерах і багатозадачних операційних системах, оскільки доступ до ресурсів, що не розподіляються, повинен бути обов'язково атомарним[джерело?]. Атомарна операція відкрита впливу тільки одного потоку[джерело?]. Атомарність буває апаратною (коли безперервність забезпечується апаратурою) і програмною, коли використовуються спеціальні засоби міжпрограмної взаємодії (м'ютекс, семафор). За своєю суттю програмні засоби забезпечення атомарності складаються з двох етапів — блокування ресурсу і виконання самої операції. Блокування є атомарною операцією, яка або успішна, або повертає повідомлення про зайнятість[джерело?]. ОглядНаприклад, у випадку роботи декількох потоків, коли одна з них виконує атомарну операцію, решта не може бачити проміжні стани до завершення цієї операції. Система може перебувати лише або в стані, в якому вона була до початку операції, або ж після неї, але не в проміжному стані[2]. У випадку ACID, натомість, атомарність стосується набору певних дій зі зміни даних, оскільки умови доступу до спільних даних для читання визначені у властивості «ізольованості» (англ. isolation)[2]. Якщо дії зі зміни спільних даних (запис) згуртовано в єдину атомарну операцію (транзакцію), і ця операція не може бути завершена (через будь-який збій), тоді така операція має бути повністю скасована а спільні дані (наприклад, база даних) повернуті до початкового стану[2]. В системах без атомарності при збої транзакції виникає проблема з визначення які операції вже успішно виконано, а які — ні, а при повторній спробі виконати транзакцію певні операції можуть бути виконані двічі й тим самим спотворити стан системи[2]. Атомарність значно спрощує обробку помилок: якщо транзакцію скасовано, можна бути впевненим у тому, що система перебуває у початковому стані й можна здійснити повторну спробу її виконати[2]. Можливість скасування транзакції з автоматичним відкиданням всіх змін є основною властивістю у випадку ACID[2]. УмовиНабір дій може вважатися атомарним, коли виконуються дві умови:
Навіть без розгляду кількох виконуючих процесорів це може бути не тривіальне для здійснення. Поки є можливість зміни в порядку виконання програми, без атомарності є можливість, що система може увійти у некоректний стан. РеалізаціїМікропроцесори x86 та x86-64Атомарні операції описані в третьому томі керівництва розробника для архітектури IA-32 та x86-64[3]. Мікропроцесори цих архітектур мають три взаємозалежні механізми для виконання атомарних операцій:[3]
Ці операції взаємно залежні оскільки:
Мікропроцесори сімейства Intel486 та новіші гарантують атомарність операцій:[3]
Мікропроцесори сімейства Pentium та новіші додатково гарантують атомарність таких операцій:[3]
Мікропроцесори сімейства P6 та новіші додатково гарантують атомарність таких операцій:[3]
ПрикладОдин процесПрипустимо, що єдиний процес виконується на комп'ютері, і він збільшує значення в заданій комірці пам'яті. Щоб збільшити значення у цій комірці пам'яті, потрібні такі кроки:
Два процесиТепер уявімо два процеси виконують збільшенням одної, розподіленої комірки пам'яті:
але перед тим, як перший процес зможе написати нове значення назад до розташування пам'яті, він зупиняється, і починає виконуватися другий процес:
Нарешті зупиняється і другий процес, і перший процес відновлює виконання:
Це простий приклад. У реальній системі дії можуть бути складнішими і помилки трапляються надзвичайно витончені. Наприклад, читання 64-розрядного значення з пам'яті, можливо, фактично здійснюється як два послідовні читання двох 32-розрядних слів пам'яті. Якщо процес тільки прочитав перші 32 біта, а перед тим, як прочитати другі 32-біти, значення в пам'яті змінилося, тоді результат не матиме ані оригінального значення, ані нового значення, а отримає сміттєве значення. До того ж, конкретний порядок, в який виконуються процеси, можуть раз від разу змінювати результати, роблячи таку помилку важкою для виявлення і відладки. БлокуванняАтомарна операція функціонально еквівалентна «критичній секції» (блокуванню), разом з тим треба докласти зусиль, щоб не понести значні втрати порівняно з прямим використанням атомарних операцій, пряму підтримку якої пропонують багато комп'ютерних архітектур. Щоб покращити продуктивність програми, часто є доброю ідеєю замінити критичні секції на атомарні операції для неблокуючої синхронізації. Проте значне покращення швидкодії не гарантоване, і неблокуючі алгоритми можуть стати просто не вартими зусиль на втілення. Загальні примітивиБільшість сучасних процесорів має інструкції, які можна застосувати для реалізації блокування і неблокуючих алгоритмів. Для однопроцесорних систем також досить мати можливість тимчасово забороняти переривання, щоб бути певним, що виконуваний процес не переключить контекст. Наступні інструкції прямо використовуються компіляторами і операційними системами, але також можуть бути абстраговані і представлені як байт-код або бібліотечні функції в мовах високого рівня.
Багато з цих примітивів можуть бути реалізовані в термінах інших Реалізації
Примітки
Див. також
|
Portal di Ensiklopedia Dunia