Ana içeriğe geç

Semaphore

Türkçe karşılığı
semafor
Okunuşu
semıfor

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/semaphore

Kısaca

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.

Programlamada semaphore nedir?

Semaphore, thread'ler veya process'ler arasında paylaşılan ve iki atomik işlemi olan bir sayaçtır. Acquire (wait ya da P da denir) bir izin alır ve sayacı azaltır, izin kalmadıysa bloke olur; release (signal ya da V da denir) bir izni geri verir ve bekleyen bir thread'i uyandırır. Fikir 1960'larda Edsger Dijkstra tarafından ortaya atıldı ve en eski senkronizasyon araçlarından biridir.

Counting semaphore bir N sayısıyla başlar ve aynı anda en fazla N thread'in izin tutmasına izin verir; örneğin yalnızca beş eşzamanlı indirmeye ya da veritabanı bağlantısına izin vermek için. Binary semaphore yalnızca 0 ve 1 değerlerine sahiptir. Mutex'ten farklı olarak semaphore'un sahibi yoktur; bu yüzden bir thread başka birinin aldığı izni serbest bırakabilir, bu da semaphore'ları sinyalleşme için kullanışlı kılar: üretici (producer) her öğe eklediğinde bir izin serbest bırakır, tüketici (consumer) ise öğe almadan önce bir izin alır. İşletim sistemleri ayrıca ayrı process'lerin paylaşabildiği adlandırılmış semaphore'lar da sunar.

Semaphore, boş yer sayısını gösteren bir tabelası olan bir otoparka benzer. İçeri giren her araba bir yer alır ve sayaç sıfıra ulaştığında yeni arabalar biri çıkana kadar kapıda bekler. Semaphore'lar eşzamanlılığı sınırlamak, üreticiler ve tüketiciler arasında sınırlı tamponlar kurmak ve kırılgan bir servise aynı anda kaç isteğin ulaşacağını sınırlamak için kullanılır.

Semaphore'lar en çok mutex'lerle karıştırılır. Binary semaphore bir mutex'e benzer, ancak sahibi olmadığı için yanlış thread'in serbest bıraktığını tespit etme gibi korumalardan yoksundur; paylaşılan veriyi korumak için mutex, kaç tane olacağını sınırlamak ya da thread'ler arasında sinyalleşmek için semaphore kullanın. Mutex'ler gibi semaphore'lar da yarış durumlarını yalnızca her erişim onlardan geçtiğinde önler ve unutulan serbest bırakmalar ya da tutarsız sıralama yine deadlock'lara yol açabilir. Semaphore ayrıca aynı anda kaç şeyin çalıştığını değil, eşzamanlılığı sınırlar; bu da saniyede kaç şeyin gerçekleştiğini sınırlayan hız sınırlamadan (rate limiting) farklıdır.

Önemli noktalar

  • Semaphore, thread'lerin aldığı ve geri verdiği bir izin sayısı tutar.
  • Counting semaphore, aynı anda en fazla N thread'in bir kaynağı kullanmasına izin verir.
  • Semaphore'un sahibi yoktur; bu yüzden herhangi bir thread bir izni serbest bırakabilir.
  • Eşzamanlılığı sınırlamak ve thread'ler arasında sinyalleşmek için çok uygundur.
  • Tek bir paylaşılan veriyi korumak için semaphore değil mutex kullanın.

Örnek

Python'da eşzamanlı indirmeleri sınırlamakpython
import asyncio

limit = asyncio.Semaphore(3)  # at most 3 downloads at once

async def download(n):
    async with limit:           # take a permit, or wait if none are left
        print(f"start {n}")
        await asyncio.sleep(1)  # pretend to download
        print(f"done {n}")      # the permit is returned here

async def main():
    await asyncio.gather(*(download(i) for i in range(10)))

asyncio.run(main())

Sık sorulan sorular

Semaphore ile mutex arasındaki fark nedir?

Mutex aynı anda bir thread'e izin verir ve onu kilitleyen thread'e aittir. Semaphore ise belirli bir sayıya kadar thread'e izin verir ve herhangi bir thread tarafından serbest bırakılabilir; bu da onu sinyalleşme için de kullanışlı kılar.

Binary semaphore nedir?

Binary semaphore, sayacı yalnızca 0 veya 1 olabilen bir semaphore'dur. Bir kilide çok benzer davranır ancak sahibi yoktur; bu yüzden çoğu zaman bir olayın gerçekleştiğini sinyallemek için kullanılır.

Semaphore'lar için P ve V ne anlama gelir?

Bunlar Dijkstra'nın iki işlem için kullandığı, Felemenkçe sözcüklerden alınmış özgün adlardır. P, acquire ya da wait; V ise release ya da signal anlamına gelir.

Sık karşılaştırılanlar

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar