Semaphore
- Türkçe karşılığı
- semafor
- Okunuşu
- semıfor
Günlük kullanımda iki ad da yaygın.
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
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
- Mutexİşletim Sistemleri, s. 21Mutex, 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.
- Race Conditionİşletim Sistemleri, s. 24Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
- Deadlockİşletim Sistemleri, s. 7Deadlock, iki ya da daha fazla thread veya process'in kaynakları bırakmaları için birbirini sonsuza dek beklediği ve hiçbirinin ilerleyemediği durumdur.
- Threadİşletim Sistemleri, s. 34Thread, işletim sisteminin zamanlayabileceği en küçük yürütme birimidir; bir process içinde çalışır ve o process'in belleğini diğer thread'lerle paylaşır.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Rate LimitingBackend ve API'ler, s. 37Rate limiting, istemcinin belli bir sürede yapabileceği istek sayısını sınırlayıp sunucuyu ya da API'yi kötüye kullanımdan ve aşırı yükten koruyan tekniktir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin