En iyi uygulama anket yapmak değildir… ama bir iş parçacığı çağrıları beklediğinde yoklama zaten dahili olarak gerçekleşmez ()?


13

Başka bir iş parçacığının görevini tamamladığında kontrol etmek isteyen bir iş parçacığımız olduğunu varsayalım. Biz diğer iş parçacığı bitmiş bir bildirim alana kadar bu iş parçacığı beklemek yapacak bir wait () türü işlev çağırmalısınız okumuştum. Bu iyi bir şey çünkü pahalı yoklama yapmadığımız anlamına geliyor.

Ama oylama zaten dahili olarak daha düşük bir seviyede gerçekleşmiyor mu? Yani iş parçacığını wait () yaparsak, diğer iş parçacığının ne zaman tamamlandığını kontrol etmek için çekirdek zaten yoklama yapmaz, böylece ilk iş parçacığını bildirebilir mi?

Sanırım burada bir şeyi kaçırmışım, biri beni aydınlatabilir mi?

Yanıtlar:


28

İşletim sistemi, yoklama gerektirmeyen bu tür süreçler arası iletişim için bazı ilkel öğeler sağlar.

A süreci mutex M'de bekliyorsa, işletim sistemi A'nın çalıştırılamayacağını bilir ve bir şey olmasını bekleyen bir süreç grubuna ayırır. M tutan süreç onu serbest bıraktığında, işletim sistemi onu bekleyen süreçlerin listesine bakar. Listedeki ilk işlem, belki A, boş kovadan kaldırılır ve çalışma kuyruğuna konur . Bir dahaki sefere A zaman dilimi aldığında, çağırdığı wait () geri döner ve program devam eder.


yani bir şekilde yoklama ama OS düzeyinde?
tgkprog

7
@Tgkprog yok, bu yoklama değildir, çünkü işletim sistemi veya başka bir işlem muteksi serbest bırakana kadar bekleyen işlemin çalışması zamanlanmamıştır. Bir yoklama işlemi, beklemeyi bırakıp bırakmayacağını kontrol etmek için cpu zamanlamasında rekabet etmeye devam edecektir. Bu tür bir yoklama işlemi, beklerken CPU süresinin önemli bir bölümünü yakabilir.
Joshp

Ben mutex durumu sorgulama OS süreci demekti. Ama eminim optimize edilmiş ve yapabileceğimiz her şeyden daha iyi. muhtemelen zamanlayıcının bir parçası olarak çalışır.
tgkprog

4
@tgkprog: İşletim sistemi, muteks ile olan biteni serbest bırakana veya sonlandırana kadar neler olduğuna biraz dikkat etmez. Bu olayların her ikisi de işletim sisteminin muteks kilidini bekleme listesindeki ilk işleme el uzatmasına neden olur ve bu işlemi çalıştırılabilir olarak işaretler. Herhangi bir yoklama yok, sadece bir etkinliğe yanıt verin. Joshp'un söylediği her şey referans olarak dahil edilmiştir. :-)
Blrfl

2
@csss: Neredeyse. İşlemler gönüllü olarak (ör _exit(2). POSIX-y sistemlerinde çağrılarak ) veya istemsiz olarak (örn., Sıfıra bölme gibi bir hata bir kesinti oluşturur veya başka bir şey çağırır kill(2)) sonlanabilir . Her iki durumda da, kontrol açıkça hangi sürecin çalıştığını veya öldürüleceğini bilen İşletim Sistemine geri verilir. Bir süreci sonlandırma işi, kaynakların dahil edilmesini, muteksleri içerir. Eğer bir muteks şimdi ölü olan süreç tarafından tutulursa, OS onu serbest bırakır. İşlem muteksin bekleme listesindeyse kaldırılacaktır.
Blrfl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.