Атомарні операції - це

атомарні операції

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

Атомарна операція відкрита впливу тільки одного потоку.

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

Найчастіше атомарна операція являє собою асемблерну інструкцію, проте не обов'язково. Також, що більш істотно, не кожна асемблерна інструкція атомарний.

Асемблерні інструкції і атомарность

Операції виконання яких завжди можна вважати атомарними:

Операції, які не є атомарними:

Атомарні інструкції x86

  • CMPXCHG / CMPXCHG8B / CMPXCHG16B - основна атомарна команда x86 порівняння і обмін. Виконує атомарному порівняння змінної з вказаним значенням і пересилання в залежності від даного порівняння. Є основою реалізації всіх безблокіровочних алгоритмів. Часто використовується в реалізації спінлоков і RWLockов, а також практично всіх високорівневих синхронізуючих елементів таких як Семафори, мутекс, Події та ін в якості внутрішньої реалізації
  • XCHG - Операція обміну між пам'яттю і регістром виконується атомарному на x86 Процесор. Часто використовується в реалізації спінлоков

Крім того, багато команд виду Читання-Модифікація-Запис можуть бути зроблені штучно атомарними за допомогою префікса LOCK (опкод 0xF0):

  • Команди додавання і віднімання ADD / ADC / SUB / SBB де операнд-приймач пам'ять
  • Команди инкремента / декремента INC / DEC
  • Логічні команди AND / OR / XOR
  • Однооперандние команди NEG / NOT
  • Бітові операції BTS / BTR / BTC
  • Операція додавання і обмін XADD

Атомарні інструкції і компілятор

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

  1. Асемблерна вставка відповідної атомарної інструкції
  2. Використання __builtin_ - розширення компілятора
  3. Скористатися «високорівневою» обгорткою якої-небудь бібліотеки

Схожі статті