Middle
Czym jest stan blokady?
sobes.tech AI
Odpowiedź od AI
Stan blokady (lock contention) występuje, gdy wiele wątków lub procesów jednocześnie próbuje uzyskać wyłączny dostęp do wspólnego zasobu (np. zmiennej, pliku lub blokady), chronionego mechanizmem blokady. Powoduje to, że niektóre z nich są wstrzymane i czekają na zwolnienie zasobu.
Główne przyczyny:
- Wielowątkowość/multiprocesowość.
- Wspólne zasoby zmienialne.
- Nieoptymalne użycie blokad (zbyt długie lub granulowane blokady).
Skutki:
- Spadek wydajności z powodu oczekiwania.
- Zwiększenie kosztów zarządzania blokadami.
- Możliwe zakleszczenia (deadlocki) przy nieprawidłowym użyciu.
Sposoby minimalizacji:
- Skrócenie czasu, przez który zasób jest zablokowany.
- Użycie mniej granulowanych blokad (blokowanie tylko potrzebnej części zasobu).
- Zastosowanie operacji atomowych, jeśli to możliwe.
- Użycie struktur danych bez blokad.
- Skalowanie poziome, jeśli architektura na to pozwala.
Przykład kodu w Pythonie demonstrujący rywalizację o blokadę:
import threading
import time
lock = threading.Lock()
licznik = 0
def inkrementuj():
global licznik
# Nabycie blokady
lock.acquire()
try:
# Symulacja pracy
time.sleep(0.01)
licznik += 1
finally:
# Zwolnienie blokady
lock.release()
wątki = []
for _ in range(10):
t = threading.Thread(target=inkrementuj) # Tworzenie wątków do inkrementacji
wątki.append(t)
t.start() # Uruchomienie wątków
for t in wątki:
t.join() # Czekanie na zakończenie wszystkich wątków
print(f"Ostateczna wartość licznika: {licznik}")
Tutaj lock.acquire() i lock.release() chronią dostęp do licznik. Bez blokady (lub w rywalizacji) końcowa wartość mogłaby być mniejsza niż 10 z powodu warunków wyścigu.