Modern işletim sistemleri epoll ve kqueue ile bekleme maliyetini düşürüyor
Öne çıkanlar
- select ve poll her çağrıda tüm dosya listesini tararken epoll yalnızca durumu değişen aktif olayları döndürüyor.
- kqueue mimarisi ağ soketlerinin yanı sıra dosya değişikliklerini, sinyalleri ve zamanlayıcıları tek arayüzde topluyor.
- Go çalışma zamanı soketleri non-blocking moda alıp goroutine yönetimini epoll ve kqueue bildirimleriyle yürütüyor.
Ağ sunucularında binlerce açık bağlantı bulunmasına rağmen aynı anda yalnızca az sayıda soket veri alışverişi gerçekleştiriyor. Erken dönem Unix sistemlerinde kullanılan select ve poll mekanizmaları, her bekleme çağrısında tüm dosya tanıtıcılarını baştan sona taradığı için doğrusal bir işlemci yükü oluşturuyordu. Bu kontrol döngüsü, bağlantı sayısı arttığında sistem kaynaklarını tüketerek yüksek ölçekli sunucu mimarilerinin önünde temel bir tıkanıklık yarattı.
Linux tabanlı sistemlerde epoll, BSD ve macOS tarafında ise kqueue bu sorunu dosya listesini her seferinde çekirdeğe göndermek yerine tek bir kez kaydetme modeliyle aştı. epoll mekanizması çekirdekte kalıcı bir nesne oluşturarak yalnızca durumu değişen dosya tanıtıcılarını hazır listesine ekliyor ve süreci uyandırıyor. BSD sistemlerindeki kqueue ise dosya tanıtıcılarının yanı sıra sinyalleri, zamanlayıcıları ve süreç yaşam döngülerini tek bir arayüzden takip ederek daha genel bir olay modeli sunuyor.
Kullanıcı alanının sürekli çekirdeği sorguladığı çekme modeli yerine olayların çekirdek tarafından bildirildiği itme modeline geçilmesi, boşta bekleyen bağlantıların maliyetini neredeyse sıfıra indirdi. Go gibi modern dillerin çalışma zamanları, ağ zamanlayıcılarını doğrudan epoll ve kqueue üzerine kurarak eşzamanlılığı işletim sistemi iş parçacıklarından ayırıyor. Böylece tekil iş parçacıklarını kilitlemeden on binlerce eşzamanlı bağlantı yönetilebiliyor.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.