Ana içeriğe geç

Yan yana

MutexvsSemaphore

Mutex ile semafor (semaphore) arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

Mutex, paylaşılan kaynağı aynı anda tek bir iş parçacığına açar ve onu yalnızca alan bırakır; semafor ise en fazla N iş parçacığını içeri alan bir sayaçtır.

Mutex

Karşılıklı Dışlama (Mutual Exclusion)

Mutex, kodun kritik bir bölümüne aynı anda yalnızca bir thread'in girmesine izin veren bir kilittir; thread'ler paylaşılan veriyi aynı anda değiştirip bozamaz.

Mutex sayfasını oku

Semaphore

Semaphore, mevcut izinlerin sayacını tutan bir senkronizasyon aracıdır; belirli bir sayıya kadar thread'in bir kaynağı aynı anda kullanmasına izin verir.

Semaphore sayfasını oku

Mutex ve Semaphore karşılaştırması

ÖzellikMutexSemaphore
NedirSahibi olan bir kilitKullanılabilir izinlerin sayacı
Aynı anda tutucularTam olarak birEn fazla N, yani başlangıç sayısı kadar
Kim bırakırYalnızca onu kilitleyen iş parçacığıHerhangi bir iş parçacığı
Ana amaçPaylaşılan veriyi eşzamanlı değişikliklerden korumakN kaynağa erişimi sınırlamak ya da iş parçacıkları arasında sinyal vermek
İşlemlerlock ve unlockacquire (wait, P) ve release (signal, V)
Ek özelliklerÇoğu zaman özyinelemeli kilitleme ve öncelik kalıtımıOlayları sayabilir, üreticileri ve tüketicileri koordine edebilir
Tipik kullanımPaylaşılan bir sayacı, haritayı ya da dosyayı güncellemekBağlantı havuzları, eşzamanlılık sınırları, sınırlı kuyruklar

Fark, açıklamalı

Mutex (karşılıklı dışlama kilidi, mutual exclusion lock) bir kritik bölümü korur: bir iş parçacığı onu kilitler, paylaşılan veriyle çalışır ve kilidi açar; diğer iş parçacıkları sıralarını bekler. Semafor ise kullanılabilir izinlerin bir sayacını tutar: acquire (wait ya da P de denir) sayacı azaltır ve sıfırda bloklar, release (signal ya da V) ise sayacı artırır ve bekleyen bir iş parçacığını uyandırır.

Temel farklar sahiplik ve sayıdır. Mutex'in bir sahibi vardır ve yalnızca onu kilitleyen iş parçacığı kilidi açmalıdır; bu, sistemlerin hataları tespit etmesini ve öncelik terslenmesini (priority inversion) ele almasını sağlar. Semaforun sahibi yoktur ve aynı anda birden çok tutucuya izin verebilir; bu yüzden veritabanı bağlantıları gibi N kaynaklık bir havuza erişimi sınırlamaya ya da bir iş parçacığının bırakıp diğerinin aldığı iş parçacıkları arası sinyalleşmeye uygundur.

Çoğu zaman yan yana kullanılırlar. Üreticiler ve tüketiciler arasındaki sınırlı bir kuyruk, genellikle kuyruğun kendisini korumak için bir mutex'i, boş yuvaları ve dolu öğeleri izlemek için de iki sayan semaforu kullanır. Birçok dil, kanallar ve bağlantı havuzları gibi daha üst düzey araçları da bu iki ilkelin üzerine kurar.

Sık yapılan bir yanlış, sayısı 1 olan ikili bir semaforun mutex ile aynı olduğu düşüncesidir. O da aynı anda tek bir tutucuya izin verir, ama herhangi bir iş parçacığı onu bırakabilir ve sahibi yoktur; bu yüzden bir iş parçacığının başkasının kilidini açmasını yakalayamaz ve özyinelemeli kilitleme ile öncelik kalıtımı gibi özellikleri destekleyemez.

Hangisini kullanmalısınız?

Mutex şu durumlarda doğru seçim:

  • Aynı anda yalnızca bir iş parçacığı paylaşılan bir veri parçasına dokunabilmeli.
  • Kilitleyen iş parçacığı her zaman kilidi açan olmalı.
  • Gerçek zamanlı sistemlerde öncelik terslenmesine karşı korumaya ihtiyacınız var.

Semaphore şu durumlarda doğru seçim:

  • En fazla N iş parçacığı bir kaynak havuzunu aynı anda kullanabilmeli.
  • Bir iş parçacığının diğerine işin hazır olduğunu bildirmesi gerekiyor.
  • Paralel indirmeler ya da API çağrıları gibi eşzamanlılığı sınırlamak istiyorsunuz.

Aynı anda bir tane ile aynı anda en fazla üç tane

Mutexpython
import threading

lock = threading.Lock()
balance = 0

def deposit(amount):
    global balance
    with lock:  # only one thread at a time
        balance += amount
Semaphorepython
import threading

permits = threading.Semaphore(3)  # three permits

def download(url):
    with permits:  # up to three threads at once
        fetch(url)

Sık sorulan sorular

İkili semafor, mutex ile aynı şey mi?

Tam olarak değil. İkisi de aynı anda bir tutucuya izin verir, ama mutex'in kilidi açması gereken bir sahibi vardır; ikili semaforu ise herhangi bir iş parçacığı bırakabilir.

Mutex yerine semaforu ne zaman kullanmalıyım?

Birden fazla iş parçacığının aynı anda ilerleyebildiği durumlarda, örneğin işi beş veritabanı bağlantısıyla sınırlamak gibi, ya da bir iş parçacığının diğerine sinyal vermesi gerektiğinde semafor kullanın. Paylaşılan veriyi korumak için mutex kullanın.

Mutex kilitlenmeye (deadlock) neden olabilir mi?

Evet. İki iş parçacığı birer mutex tutup diğerinin mutex'ini bekliyorsa hiçbiri devam edemez. Kilitleri her zaman aynı sırayla almak, bunu önlemenin yaygın bir yoludur.

Daha fazla

Ayarlar