2015-04-13 18 views
5

'da verilen bir işlev bağlamında, belirli bir işlevin bir kesme bağlamında mı yoksa işlem bağlamında mı çağrılacağını belirlemek için düz bir ileriye doğru mekanizma var mı? Bu sorunun ilk kısmı. İkinci bölüm: Biri müdahale bağlamında olan ve süreç bağlamında olan diğer iki işlemi nasıl senkronize edebilirim. Anlayışım doğruysa, uyumaya izin verilmediğinden, ara verme bağlamında süreç için muteksleri kullanamayız. Diğer yandan, eğer spin kilitler kullanırsam, diğer süreç CPU döngülerini kullanacaktır. Bu 2 işlemi senkronize etmenin en iyi yolu nedir? Anlayışım tamamen yanlış olursa beni düzeltin.Linux Kernel

cevap

4

İşlev, in_irq() işlevini kullanarak IRQ işleyicisi olarak çalıştırılıp çalıştırılmadığını söyleyebilirsiniz. Ama bunu kullanmak için iyi bir uygulama olduğunu sanmıyorum. Yalnızca işlevinizin bağlamında hangi koddan çalıştırıldığını görmelisiniz. Aksi halde kodunuzun kötü bir tasarım olduğunu söyleyebilirim. senkronizasyon mekanizması gelince

- Eğer (örneğin kesme) atomik bağlamda senkronizasyonu yapmak gerekir, çünkü sayaç kilidi kullanmak zorunda, doğru - Burada pek fazla seçeneğim değil. Ayrıca, spinlock için beklerken çok fazla CPU döngüsünün boşa harcanması için haklısınız, bu yüzden kodunuzun kilidinin altındaki miktarını azaltmaya çalışmalısınız.

0

Sam'in cevabına ekleme - kesme işleyicinizi alt yarısı ve üst yarım bölümleriyle tasarlamalısınız. Bu, kesme işleyicisinde (sürücüde irq istendiğinde kayıt olduğunuz) ve bir iş kuyruğu kullanarak zamanlama yapabileceğiniz (alt yarısı) minimum bir kod (üst yarı) elde etmenizi sağlar. Bu üst yarıçapı (sadece interrupt ile uğraştığınız ve cihazdan en az kırmızı/yazı yazarak) atomik bağlamda spinlock ile korunabilir, böylece daha az sayıda CPU döngüsü boşa harcanmasını bekler.

İlgili konular