Atomic operation — boshqa bajaruvchilar nuqtayi nazaridan bo‘linmas bitta amal sifatida sodir bo‘ladigan operatsiyadir: u to‘liq bajarilgan yoki umuman bajarilmagan holatda ko‘rinadi. “Atomic” amal fizik jihatdan bir takt davom etadi degani emas; apparat, operatsion tizim yoki ma’lumotlar bazasi oraliq holatni tashqariga ko‘rsatmaslik kafolatini beradi. Kafolat qaysi obyekt, hajm va nosozlik turiga tegishli ekani alohida aniqlanadi.
Protsessor darajasi
Ko‘p oqimli dasturda oddiy counter = counter + 1 odatda o‘qish, qo‘shish va yozish bosqichlaridan iborat. Ikki oqim bir qiymatni o‘qib, bittadan oshirib yozsa, yangilanishlardan biri yo‘qoladi. Atomic increment protsessorning maxsus ko‘rsatmasi va kesh muvofiqligi protokoli orqali amalni raqobatchilarga bo‘linmas qiladi.
Atomiklik xotira tartibini avtomatik hal qilmaydi. Bir o‘zgaruvchi atomic bo‘lsa ham, boshqa ma’lumotlar qachon ko‘rinishi memory ordering qoidalariga bog‘liq. Acquire, release va sequential consistency kabi rejimlar kompilyator hamda protsessor qayta tartiblashiga cheklov beradi. Eng kuchli rejimni doim tanlash to‘g‘ri bo‘lsa-da, parallel ishlash narxini oshirishi mumkin.
Compare-and-set
Compare-and-set xotiradagi qiymat kutilgan qiymatga teng bo‘lsa, uni yangisiga atomar almashtiradi. Teng bo‘lmasa, hech narsa o‘zgarmaydi va chaqiruvchi qayta urinishi mumkin. Lock-free stack, navbat va hisoblagichlar shu primitive ustida quriladi. Kuchli raqobatda ko‘p retry protsessor vaqtini sarflashi, ABA muammosi esa qiymat o‘zgarmagandek ko‘rinishiga sabab bo‘lishi mumkin.
Ma’lumotlar bazasi va fayl tizimi
Database tranzaksiyasidagi atomicity bir nechta yozuvning hammasi commit bo‘lishi yoki rollback qilinishini anglatadi. Bu yakka apparat atomik operatsiyasidan kengroq kafolat bo‘lib, WAL, lock, MVCC va recovery bilan ta’minlanadi. Atomic transaction isolation yoki durability bilan bir xil emas; ACID har birini alohida xususiyat sifatida ko‘radi.
Faylni qayta nomlash ayrim fayl tizimlarida bir katalog va bir qurilma doirasida atomic bo‘lishi mumkin. Biroq tarmoq fayl tizimi, boshqa mountga ko‘chirish yoki elektr uzilishi shartlari kafolatni o‘zgartiradi. “Atomic rename” yangi nom ko‘rinishini bo‘linmas qilishi mumkin, lekin fayl mazmuni diskka bardoshli yozilganini kafolatlamaydi; buning uchun fsync va katalog metadata qoidalari kerak bo‘lishi mumkin.
Qo‘llash chegaralari
Atomic primitive faqat bitta o‘zgaruvchini himoya qilsa, ikki o‘zgaruvchi orasidagi invariant saqlanmasligi mumkin. Masalan, balans va audit hisoblagichini alohida atomar yangilash ularni birgalikda izchil qilmaydi. Bunday holatda lock, tranzaksiya yoki yuqoriroq darajadagi algoritm talab etiladi.
API hujjati amalning linearizable ekanini, faqat crashsiz bajarishda atomarligini yoki faqat ma’lum alignment va hajmda ishlashini ko‘rsatishi kerak. Testlar raqobat, jarayon to‘xtashi va energiya uzilishi kabi tegishli nosozlik modelini qamrab oladi.
Alignment va hajm
Apparat atomikligi ko‘pincha tabiiy tekislangan ma’lum o‘lchamli yuklash va yozishga tegishli. Qiymat ikki cache line yoki sahifa chegarasini kesib o‘tsa, ayni kafolat saqlanmasligi mumkin. Dasturlash tili atomic tur orqali alignmentni ta’minlaydi va qo‘llab-quvvatlanmaydigan hajm uchun ichki lock ishlatishi mumkin. Oddiy pointer cast bilan atomic obyekt yaratish undefined behavior va data race keltirib chiqaradi.
Kompozitsiya
Ikki atomic amal ketma-ket bajarilgani ularning juftligini atomar qilmaydi. Reader birinchining yangi, ikkinchisining eski qiymatini ko‘rishi mumkin. Version counter, immutable snapshot yoki lock bir nechta fieldni yagona izchil holat sifatida nashr etishga yordam beradi. Algoritm linearization pointni — amal mantiqan qachon sodir bo‘lganini — aniq belgilashi kerak.
Bog‘liq tushunchalar
Compare-and-set, Mutex, Lock-free algorithm, Linearizability, Transaction, ACID, Memory ordering