2011-09-22 24 views
5

adında bir ve b adı verilen iki C++ kodum var. Boost threading kütüphanesini kullanarak 64 bit Linux'ta çalışıyorum.Farklı işlemler arasındaki verim

a kodu, bir işlem yapılmayan bitmeyen bir döngüde kalan 5 iş parçacığı oluşturur. b kodu, sonu olmayan bir döngüde() döndürme döngüsünde kalan 5 iş parçacığı oluşturur.

Dört çekirdekli bir makinede çalışıyorum ... kodunu yalnızca kodunu çağırdığında, CPU kullanımının neredeyse% 400'ünü alır. Tek başına b kodunu çağırdığınızda, CPU kullanımının neredeyse% 400'ünü alır. Bunu zaten bekledim.

But when running both together, I was expecting that the b code used almost nothing of CPU ve bir use the 400%. Ama aslında her ikisi de neredeyse% 200 CPU'nun eşit dilimini kullanıyor.

Sorum şu ki,() farklı işlem arasında çalışıyor mu? Beklediğim şekilde çalışmasını sağlamanın bir yolu var mı?

+1

Cevabım yok ve sanırım sorgunuz ilginç geliyor, çünkü sched_yield işlemi sıranın arka tarafına koyduğunu iddia ediyor, ancak bu durumun gerçek kullanışlılığını sorgulamak açısından sizin için ilginç olabilir. sched_yield kullanarak: http://kerneltrap.org/Linux/Using_sched_yield_Improperly – Kevin

+1

Bu kitap parçacığı, linux çekirdeğinizin sürümünün önemli olduğunu ima eder: http://books.google.com/books?id=k_ocKY0iegsC&pg=PA168&lpg=PA168&dq=sched_yield+ başka + işlemi ve kaynak = bl & oTS = VgCNK6kGIu & sig = gyduzTS_2EY8v8wwwAE8MScSLsg ve hl = tr & ei = 68N7TqfOCcXPiAK6qrDVBw & sa = X oi = book_result ve ct = neden & resnum = 3 ved = 0CCgQ6AEwAg # v = onepage ve q = sched_yield% 20to% 20another% 20process & f = yanlış ile + – Kevin

cevap

2

Linux, dinamik iplik önceliğini kullanır. Hoş ile ayarladığınız statik öncelik yalnızca dinamik önceliği sınırlamaktır.

Bir iş parçacığı tüm zaman dilimini kullanırken, çekirdek önceliğini düşürür ve bir iş parçacığı tüm zaman dilimini kullanmadığında (IO yaparak, bekle/sonuç ver, vb.), Çekirdek önceliğini artırır.

Tahmin ettiğim, bu işlemin b iş parçacığının daha yüksek önceliğe sahip olmasıdır, bu nedenle daha sık yürütülürler.

3

Yani A'ya ait 4 iş parçacığını çalıştıran 4 çekirdek vardır. Kuyrukta 6 iş parçacığı vardır - 1 A ve 5 B Çalışıyor Bir iş parçacığı zaman çizelgesini tüketir ve sıraya döner. Zamanlayıcı, sıradaki sonraki iş parçacığını sıradan seçer. Bu sırtın B'ye ait olma olasılığı nedir? 5/6. Tamam, bu iş parçacığı başlatıldı, sched_yield() işlevini çağırır ve sıraya geri döner. Bir sonraki iş parçacığının tekrar bir B iş parçacığı olması olasılığı nedir? Yine 5/6!

Proses B, CPU zamanını tekrar tekrar alır ve ayrıca çekirdeği pahalı içerik geçişleri yapmaya zorlar.

sched_yield belirli bir durum için tasarlanmıştır - bir iş parçacığı başka bir iş parçacığı çalıştırılabilir olduğunda (örneğin, bir muteks kilidini açar). Eğer A, A'nın önemli bir şey üzerinde çalışırken beklemesini istiyorsanız - A, U uyanana kadar B'yi uyuyabilen bazı senkronizasyon mekanizmalarını kullanın.