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.