2009-05-31 17 views
5

en iyi Linux çekirdek kilitleme mekanizması nedir:Bu senaryo için bir kilitleme sorunu çözmek için gereken belirli bir senaryo

  1. Çok işlemci sistemi.
  2. CPU kullanımı yaygın (yazılım) kaynak tümü. kaynağa
  3. Salt okuma erişimi çok yaygındır. (Gelen ağ paketlerinin işlenmesi)
  4. Yaz erişim çok daha az görülür. (Sadece çok fazla konfigürasyon değişikliği).

Şu anda read_lock_bh, write_lock_bh (spinlocks) mekanizma kullanır. Sorun, daha fazla CPU'nun, daha çok bir yazılım bağlamında yumuşak kilitlenmeler almasıdır.

this book, 'daki eşzamanlılık bölümünü okurum. Ancak, okuyucunun veya yazıcının döndürme kilitlerini kullanırken öncelikli olup olmayacağını anlayamadım.

Yani sorular şunlardır:

  1. , öncelik bunlardan okuyucu/yazar/hiçbiri Linux spinlock mekanizması veriyor mu?
  2. Şu anki çözümümün kullanılması durumunda, senaryonumdaki bu yumuşak kilitlenmelerden kaçınmak için kullanabileceğim daha iyi bir mekanizma var mıdır, yoksa kilidi almaya çalışırken yazarına öncelik vermenin bir yolu olabilir mi?

sayesinde Nir

+0

Bu sorunun cevabını bilmiyorum, ancak "Linux Çekirdeğini Anlamak" adlı kitapta bu tür şeyler hakkında çok fazla bilgi var. Bu gerçekten harika bir kitap, çekirdek işi yapan herkes okumalı. – Zifre

+0

Çekirdek eşzamanlılık iç içe geçmiş hakkında çok fazla şey bilmiyorsunuz, ancak yazar/bekçiyi saymak ve yazar beklemede kilitlemekle kendi başınıza rulo yapabilirsiniz. –

+0

@Nir 4 yıl sonra nihayet bir cevabı kabul ettiğine sevindim :-) –

cevap

5

Burada aradığınızı olabilir Essential Linux Device Drivers doğrudan bir alıntı. Bu ilgilendiğiniz neler olabilir sonunda RCU ile uğraşan kısmı görünüyor.

Okuyucu-Yazar Kilitler

başka özel eşzamanlılık regülasyon mekanizması spinlocks bir okuyucu-yazıcı türüdür. Bir kritik bölümünün kullanılması, ayrı ayrı iş parçacıklarının ya okunan veya paylaşılan bir veri yapısına yazdığı, ancak her ikisi de yapmıyorsa, bu kilitler doğal bir uyum sağlar. Aynı anda birden çok okuyucu parçacığı kritik bölgeye girebilir. aşağıdaki gibi Okuyucu spinlocks tanımlanmıştır:

rwlock_t myrwlock = RW_LOCK_UNLOCKED; 

read_lock(&myrwlock);    /* Acquire reader lock */ 
/* ... Critical Region ... */ 
read_unlock(&myrwlock);   /* Release lock */ 

Bununla birlikte, bir yazar iplik önemli bir bölümü girerse, diğer okuyucu ya da yazıcı parçacığı içinde izin verilmez. yazar spinlocks kullanmak için, yazarsınız: Bir okuyucu-yazıcı sayaç kilidi bir gerçek yaşam örneğin net/ipx/ipx_route.c IPX yönlendirme kodu şu anda

rwlock_t myrwlock = RW_LOCK_UNLOCKED; 

write_lock(&myrwlock);   /* Acquire writer lock */ 
/* ... Critical Region ... */ 
write_unlock(&myrwlock); /* Release lock */ 

bak. Bir okuyucu-yazıcı kilit ipx_routes_lock aynı anda erişim IPX yönlendirme tablosu korur adı.Paketler istek okuyucu kilitleri yönlendirmek için yönlendirme tablosunu aramak gerekir konuları. Yönlendirme tablosundan girişler veya silme gerektiren konular yazıcı kilitlerini alır. Bu, daha iyi yönlendirme tablosu güncelleştirmelerinden çok daha fazla yönlendirme tablosu aramaları için daha fazla örnek olduğundan, performansı artırır.

düzenli spinlocks gibi, okuyucu-yazıcı kilitler ayrıca irq tekabül sahip varyantları-yani read_lock_irqsave(), read_lock_irqrestore(), write_lock_irqsave() ve write_lock_irqrestore(). Bu işlevlerinin semantiği, normal döndürme kilitlerine benzer.

2.6 çekirdeğinde tanıtılan sıralama kilitleri veya hızlandırıcıları, yazarların okuyucularda tercih edildiği okuyucu-yazar kilitleridir. Bu, bir değişken üzerinde yazma işlemlerinin, okuma erişimlerinin çok üstünde olması durumunda kullanışlıdır. Bir örnek, bu bölümde daha önce tartışılan jiffies_64 değişkenidir. Yazarın konuları, 'un içinde bulunan okuyucular için kritik bir bölüm beklemez. Bu nedenle, okuyucu ipler kritik bölümü içinde kendi giriş geçemedi ve yeniden denemek gerekebileceğini keşfedebilir:

u64 get_jiffies_64(void) /* Defined in kernel/time.c */ 
{ 
    unsigned long seq; 
    u64 ret; 
    do { 
     seq = read_seqbegin(&xtime_lock); 
     ret = jiffies_64; 
    } while (read_seqretry(&xtime_lock, seq)); 
    return ret; 
} 

Yazarlar write_seqlock() ve write_sequnlock() kullanarak kritik bölgeleri korumak.

2,6 çekirdeği denilen başka bir mekanizma tanıttı Read-Kopya Güncellemesi (RCU), hangi verimleri geliştirilmiş performans okuyucuların uzak yazarlar outnumber. Temel fikir, okuyucu dişlerinin kilitleme olmadan çalıştırılabilmesidir. Yazarlık konuları daha karmaşıktır. Veri yapısının bir kopyasında güncelleme işlemleri yaparlar ve okuyucuların gördükleri işaretçiyi değiştirirler. Orijinal kopya, tüm CPU'larda 'a geçiş yapana kadar devam etmekte olup, devam eden tüm okuma işlemlerinin tamamlanmasını sağlar. Şu ana kadar tartışılan ilkelleri kullanmaktan çok RCU'nun kullanılmasının daha fazla işe yaradığını ve yalnızca bunun iş için doğru araç olduğundan eminseniz kullanılmasının gerektiğini unutmayın. RCU verisi yapıları ve arabirim fonksiyonları include/linux/rcupdate.h'da tanımlanmıştır. Documentation/RCU/*'da geniş bir belge var. Bir RCU kullanım örneği için

, fs/dcache.c bak. Linux'ta her dosya bilgi girişi (dişçilik adı verilen bir yapıda saklanır), meta veri bilgileri (bir inode'da saklanır) ve gerçek veri (veri bloklarında saklanır) ile ilişkilendirilir. Bir dosya üzerinde her çalıştırdığınızda, dosya yolundaki bileşenler ayrıştırılır ve ilgili dişçilik elde edilir. Dişliler, dcache adı verilen bir veri yapısında, ileride yapılacak işlemleri hızlandırır. Herhangi bir zamanda, dcache aramalarının sayısı, dcache güncellemelerinden çok daha fazladır, bu nedenle dcache'ye yapılan referansları RCU ilkelleri kullanılarak korunmaktadır.

0

kilit tutarak yaptığınız iş normal bir muteksi olmayan okuyucu-yazıcı deneyebilirsiniz küçükse. Daha verimli.

+0

Çok CPU makineye sahip olmanın noktasını özlüyor. Bu, tek bir CPU makinesi kadar kullanışlı hale getirecektir. – Nir

3

bu işlemek için tasarlanmış kullanımı vaka Kumandanın tür değil midir? Kullanımında iyi bir kayıt için http://lwn.net/Articles/262464/'a bakın.

+0

Bahsettiğim kitapta RCU'yu okudum. Sorun şu ki, anladığım kadarıyla sadece bir yazar için tasarlandı. Daha fazla alabilirim. Ayrıca, çalışmam için mimarimi değiştirmem gerektiğini düşünüyorum. Yine de teşekkürler. (Her şeyi güncelleyin ve ardından bir işaretçiyi değiştirin.) – Nir