Bosh sahifa Wiki Concurrency

Concurrency

Concurrency — bir nechta vazifaning bajarilish davrlari bir-biri bilan ustma-ust kelishi va tizim ularning progressini boshqarishi. Vazifalar bitta CPU yadroda navbatma-navbat interleave qilinishi yoki bir nechta yadroda haqiqatan parallel ishlashi mumkin. Shu sababli concurrency va parallelism yaqin, ammo aynan bir tushuncha emas.

Bajarilish modellari

Threadlar bitta process xotirasini bo‘lishadi; ma’lumot almashish tez, lekin race condition xavfi yuqori. Processlar alohida address space’da bo‘lib, izolyatsiya beradi, aloqa uchun IPC talab qiladi. Async event loop ko‘p I/O vazifani kam thread bilan boshqaradi: vazifa kutish nuqtasida control’ni qaytaradi.

Model Kuchli tomoni Asosiy cheklov
Thread Shared memory va qulay blocking API Race va lock murakkabligi
Process Izolyatsiya, CPU parallelism IPC va xotira xarajati
Async task Ko‘p I/O ulanishi Blocking kod loopni to‘sadi
Actor Xabar orqali state izolyatsiyasi Message ordering va delivery

Model tanlovi workloadga bog‘liq. CPU-bound hisob parallel execution’dan, I/O-bound server esa kutish vaqtini boshqa vazifaga berishdan foyda ko‘radi.

Shared state va race condition

Ikki worker bir xil counter’ni “o‘qish–oshirish–yozish” orqali yangilasa, operatsiyalar interleave bo‘lib bitta increment yo‘qolishi mumkin. Yakuniy natija timing’ga bog‘liq bo‘lsa race condition yuz beradi. Muammo testda kam ko‘rinib, production yukida tez-tez paydo bo‘lishi mumkin.

Mutex critical section’ga bir vaqtda bitta threadni kiritadi. Atomic operation kichik update’ni bo‘linmas bajaradi. Immutable ma’lumot, ownership va message passing shared mutable state’ni kamaytiradi. Database’da transaction va isolation level xuddi shunday konkurent yozuvlarni tartibga soladi.

Lock muammolari

Deadlock uchun vazifalar bir-biridagi resursni cheksiz kutadi. Masalan, A lock1ni olib lock2ni, B esa lock2ni olib lock1ni kutadi. Locklarni doim bir xil tartibda olish, timeout yoki resurs iyerarxiyasi xavfni kamaytiradi.

Livelock’da vazifalar faol holatda bir-biriga yo‘l beraveradi, ammo hech biri ishni tugatmaydi. Starvation’da ayrim vazifa resursga doimiy kira olmaydi. Fair queue va cheklangan retry/backoff bu holatlarni boshqarishga yordam beradi.

Memory visibility

Bir thread yozgan qiymat boshqa threadda darhol ko‘rinadi deb faraz qilib bo‘lmaydi. Compiler va CPU instruktsiyalarni qayta tartiblashi, core cache’i eski qiymatni saqlashi mumkin. Tilning memory modelidagi mutex, volatile yoki atomic primitive zarur happens-before aloqasini yaratadi.

Oddiy “boolean flag”ni lock’siz o‘zgartirish tilga qarab data race bo‘lishi mumkin. Faqat amaliy testda ishlagani correctness isboti emas; platformaning belgilangan memory semantics’iga tayanish lozim.

Server concurrency

Serverda concurrency limit bir vaqtda nechta request qayta ishlanishini belgilaydi. Limitsiz parallelism database connection pool’ni tugatishi, xotirani to‘ldirishi va tail latency’ni oshirishi mumkin. Semaphore, bounded queue va backpressure tizimni saturation’dan himoya qiladi.

Little qonuniga ko‘ra barqaror tizimda bir vaqtdagi ishlar soni taxminan throughput va o‘rtacha kutish vaqtining ko‘paytmasiga teng. Latency oshsa in-flight request ham ortadi; shu sabab overload paytida concurrency keskin ko‘payishi mumkin.

Sinov va diagnostika

Concurrency xatosini oddiy unit test doim topmaydi. Takroriy stress, randomized scheduling, race detector va model checking foydali. Test faqat natijani emas, invariantni tekshiradi: balans manfiy bo‘lmasligi, bir ID ikki marta ajratilmasligi kabi.

Thread dump deadlock va kutayotgan locklarni, profiler contention vaqtini, trace esa queue va worker oralig‘ini ko‘rsatadi. Loggingning o‘zi timing’ni o‘zgartirib Heisenbug’ni yashirishi mumkin, shuning uchun past-overhead telemetry ishlatiladi.

Bog‘liq tushunchalar

Parallelism, Thread, Async programming, Race condition, Mutex, Deadlock, Backpressure