2011-08-15 17 views
6

Ben Linux mutekslerkarşılaştırma ve takas mekanizması kullanır futexes aşağı aşağıda ve FUTEX olarak uygulanır biliyoruz. Ve genellikle kilitleri elde etmek için, kullanıcı alanı alanında kilit çözüldüğü için bir kullanıcı alanı iş parçacığının sistem çağrısı yapmasına gerek yoktur.dışlama erişimi ve sistem çağrısı

Şimdi benim sorum şu ki, yüksek çekişme olduğunda ve birçok iş parçacığı aynı anda bir muteks kilitlemeye çalışırken ne oluyor. Çekirdek için hangi iş parçacığının muteks vermesi gerektiğine karar vermesi için sistem çağrısı gerçekleşir mi? Özellikle iplik öncelikleri farklı olduğunda? Ben de öyle düşünüyorum.

cevap

7

Herhangi bir çekişme olmadığı sürece, sistem çağrısı yapılmaz. Çekişme varsa, daha sonra iş parçacığı, muteks serbest hale geldiğinde uyanacak ilk iş parçacığını bulmak için kullanılacak olan bir uyku sırasına yerleştirmek için bir sistem çağrısı yapılır. Ek olarak, sistemde, şu anda sahip olan iş parçacığı kullanıcı-arazi "hızlı-yolu" açma rutininden geçmeyecek şekilde futex'in değerine bir ayarlama yapılır (bu sadece futex'i bir sıfıra geri döndürür veya "kilitlenmemiş" olur değer), ancak bekleme iş parçacığının kilit sahipliğini geçmek için bekleme sırasını denetlemek üzere başka bir sistem çağrısı yapar. Bir kilit için yarışan daha fazla iş parçacığı ile, bir çekişmenin bulunma şansı daha yüksek olacak, ama yine de, eğer bir çekişme yoksa, o zaman herhangi bir sistem çağrısı yapılmaz.

3

Futex'ler yalnızca bir syscall'a geri dönmeden önce az sayıda döngü yaparlar, bu nedenle yüksek kilitlenme durumunda, iş parçacığının bir syscall'a geri dönme olasılığı yüksektir.

İlgili konular