Ben Linux çekirdeğinde bir istemci/sunucu yazıyorum (Evet. Çekirdeğe içinde. Onun tasarım kararı alınmış ve kesinleşmiş. Onun değişmeyecek)Linux çekirdeğinde çalışan sunucu. Dinlemeyi bir iş parçacığında mı yapmalıyım?
sunucu ham soketinden gelen paketleri okur. Bu paketler için aktarım protokolü (üzerinde ham soketin dinlediği) özel ve UDP gibi. Kısacası, gelen bağlantıları dinlemem ve sonra bu bağlantıyı işlemek için bir iş parçacığı çatalıyorum.
Bu ham soketten gelen tüm IP datagramlarını işlemek zorundayım. Ham soket üzerinde sonsuz bir döngüde paketler için okumaya devam edeceğim. Kullanıcı düzeyinde eşdeğer programda, ayrı bir iş parçacığı oluşturup gelen paketleri dinlemeye devam ederdim.
Şimdi çekirdek düzeyinde bir sunucu, ben ayrı bir konu çalıştırmak gerektiği konusunda şüphelerim var ya, çünkü değil:
I() bir I/O operasyonu okumak düşünüyorum. Bu nedenle, read() 'ın içinde bir yerde, çekirdek işlemcinin denetimini bırakmak için program() işlevini çağırmalıdır. Böylece ham soket üzerindeki read() 'i çağırdıktan sonra, mevcut kernel aktif içerik paketler mevcut olana kadar beklemeye alınabilir (belki de bir uyku kuyruğuna konabilir). Paketler geldiğinde, çekirdek çakışması bağlamı, sırada uyuyan okunan içeriğin bir kez daha çalışmaya hazır olduğunu işaret edecektir. Burada 'thread' yerine 'context' kullanıyorum. Bu yüzden ayrı bir çekirdek iplik gerektirmemeliyim. Diğer yandan, eğer() kontrol() 'i terk etmezse, tüm çekirdek engellenecektir.
Sunucumu nasıl tasarlamalıyım konusunda ipuçları veren herhangi biri var mı? 1 numaralı maddede sunulan argümanın yanlışlığı nedir?
Eğer çekirdekte iseniz bir kesinti yoksa veri olduğunda ne yapacağınızı bildirmek için kullanabilirsiniz. Yoksa bu düşük seviye değil mi? – grieve
Bir düzeyde bir geri arama kaydedebilirsiniz - Yanıtımı gör. – MarkR