Sobes.tech
Middle

Kas yra blokavimo būsena?

sobes.tech AI

Atsakymas iš AI

Užrakinimo būklė (lock contention) atsiranda, kai keli srautai arba procesai vienu metu bando gauti išskirtinę prieigą prie bendro išteklio (pavyzdžiui, kintamojo, failo ar užrakinimo), kuris yra apsaugotas užrakinimo mechanizmo. Tai sukelia kai kurių jų sustojimą ir laukimą, kol išteklius bus atlaisvintas.

Pagrindinės priežastys:

  • Daugiagijinis/daugiaprocesinis veikimas.
  • Bendrai keičiami ištekliai.
  • Nepasiteisinęs užrakinimų naudojimas (per ilgi arba labai granulės užrakinimai).

Padariniai:

  • Veiklos našumo sumažėjimas dėl laukimo.
  • Papildomi užrakinimų valdymo kaštai.
  • Galimi tarpusavio užrakinimai (deadlocks) netinkamo naudojimo atveju.

Mažinimo būdai:

  • Laiko, per kurį išteklius yra užrakintas, sumažinimas.
  • Naudojimas mažiau granulinių užrakinimų (užrakinant tik būtiną išteklių dalį).
  • Naudojant atomines operacijas, jei įmanoma.
  • Naudojant neblokiruojančias duomenų struktūras.
  • Horizontalus mastelio keitimas, jei architektūra leidžia.

Python kodo pavyzdys, demonstruojantis konkurenciją dėl užrakinimo:

import threading
import time

lock = threading.Lock()
counter = 0

def increment():
    global counter
    # Užrakinimo įsigijimas
    lock.acquire()
    try:
        # Darbo imitacija
        time.sleep(0.01)
        counter += 1
    finally:
        # Užrakinimo atlaisvinimas
        lock.release()

threads = []
for _ in range(10):
    t = threading.Thread(target=increment)  # Srautų kūrimas
    threads.append(t)
    t.start()  # Srautų paleidimas

for t in threads:
    t.join() # Laukiama, kol visi srautai baigsis

print(f"Galutinis skaitiklio reikšmė: {counter}")

Čia lock.acquire() ir lock.release() saugo prieigą prie counter. Be užrakinimo (arba konkurencijos metu) galutinė reikšmė gali būti mažesnė nei 10, nes įvyksta duomenų konfliktas.