10

Ben aşağıdaki gibi basit bir tek iş parçacıklı süreci çalıştırmak Say:Tek bir iş parçacığı süreci neden birkaç işlemci/çekirdek üzerinde yürütülür?

public class SirCountALot { 
    public static void main(String[] args) { 
     int count = 0; 
     while (true) { 
      count++; 
     } 
    } 
} 

(yani Aşina olduğum ne çünkü Bu Java, ama bu gerçekten önemli değil şüpheli)

Bir i7 işlemcim var (4 çekirdek veya 8 sayım hiper iş parçacığı) ve Windows 7 64-bit çalıştırıyorum, böylece CPU kullanımını izlemek için Sysinternals Process Explorer'ı çalıştırdım ve beklediğim gibi yaklaşık% 20 kullanıyordum. tüm mevcut CPU.

Graph showing 20% CPU usage across all cores

Ama CPU başına 1 grafik göstermek için seçenek geçiş, ben 4 "çekirdek" yerine 1 her göbeklere, CPU kullanımı yayılır kullanılan görüyoruz:

Graph showing erratic CPU usage on each core totaling around 20% usage

Bunun yerine beklediğim 1 çekirdeğin dışarı çıkmasıdır, ancak bu yalnızca işlem için yakınlığı tek bir çekirdeğe ayarladığımda olur.

Graph showing most of recent CPU usage to be confined to first core

Neden iş yükü ayrı çekirdek bölünmüştür? İş yükünü birkaç çekirdeğe ayırıp, önbelleğe almayı veya diğer performans cezalarını ihlal etmeyecek misiniz?

Tek çekirdeğin aşırı ısınmasını önlemek için basit nedenlerden biri mi? Yoksa daha derin bir neden var mı?

Düzenleme: İşletim sisteminin programlamadan sorumlu olduğunu biliyorum, ancak neden "rahatsız edici" olduğunu bilmek istiyorum. Elbette saf bir bakış açısından, (çoğunlukla *) tek iş parçacıklı işlem 1 çekirdeğe yapıştırarak daha basit & gitmek için daha verimli bir yoldur?

* Çoğunlukla tek iş parçacıklı burada birden theads var, çünkü söylemek, ancak bunlardan sadece 2 şey yapıyoruz:

Screenshot showing number of threads from Eclipse Screenshot showing number of threads in Process Explorer process properties

+2

Küçük nitpick (pratikte sık sık uygulamayı zaten kendisi iyileştirilmesi/basitçe ayarlama ile daha iyi iyileştirmeler göreceksiniz özellikle gibi) bu çok zor mücadele etmeye çalışmaktan karşı bir argüman olabilir; Bunun tek bir iş parçacığı süreci olduğunu söylemesi doğru olmaz. JVM, final düzenleyiciler, çöp toplayıcıları, vb. Gibi temizlik amacıyla birden fazla iş parçacığı içeriyor. Her bir iş parçacığı tarafından yapılan gerçek işlerin elde edilmesi için, JVM iş parçacıklarının gerçek h/w iş parçacıklarına eşleştirilmesi oldukça olasıdır. –

+0

Sanırım Caspar, _non-daemon_ iş parçacığı anlamına geliyordu. – Santosh

+0

@ SanjayT.Sharma Evet, biraz basitleştirdim ve muhtemelen yönetilmeyen bir dilde örnek bir program vermeliydim;) Ancak, dediğim gibi, JVM'nin bunu yapıp yapmadığını şüpheliyim (ve eğer haritalanıyorsa) JVM -> HW konuları ve bu sorumludur, neden haritalama sürekli değişiyor?) – Caspar

cevap

17

OS zamanlama sorumludur. Bir iş parçacığını durdurmak ve başka bir CPU'da yeniden başlatmak ücretsizdir. Makinenin yaptığı başka bir şey olmasa bile bunu yapar. OS aynı CPU üzerindeki her seferinde iplik çalıştırmaya devam etmek için bir sebep var olduğunu varsayalım çünkü

süreç CPU'lar etrafında hareket ettirilir. etrafında hareket etmeyecektir ve diğer parçacıkları tarafından kesintiye uğramayacaktır yüzden bir CPU'ya kilit parçacığı için bir kütüphane yazdım Bu nedenle

. Bu, gecikmeyi azaltır ve iş hacmini artırır, ancak bu iş parçacığı için bir CPU'yu hızlandırır. Bu Linux için çalışıyor, belki de Windows için uyarlayabilirsiniz. https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

+0

Bir işlemi saniyede birçok kez durdurur. (100/sn'de Linux) Bir işlemin en son nerede çalıştığını hatırlamak ve bu CPU'yu başkalarına tercih etmeye çalışmak daha çok işe yarar, bunun yerine bir sonraki boş CPU'ya atayacaktır. –

+0

Sanırım yeterince açık değilim; İşletim sisteminin işletim sistemini gerçekleştirdiğinin farkındayım ve 2. grafikte görebiliyorsunuz, bu süreç için afinite belirledim, böylece sadece ilk çekirdeği kullanıyor. Bilmek istediğim şey * neden * işletim sistemi mevcut tüm çekirdekler üzerinde tek "aktif" iş parçacığı zamanlar? – Caspar

+0

Konuşan soru, neden bir sonraki CPU'ya atamak yerine, aynı CPU'ya bir iş parçacığı atamaya devam etmesinin nedenidir (bu ne yapar?) Ne kadar çok CPU meşgul olursa olsun, yuvarlak robin kullanımı iyi çalışır. Aynı CPU'ya her seferinde atama, diğer CPU'lar boştayken bir CPU'yu çok meşgul edebilir (üzerinde çalışan iki iş parçacığı ile). –

1

Ben de

yüzden (benzersiz/tek döndürmek istiyoruz ... denemek ve CPU kalıp üzerindeki ısıl yükü yaymak amacıyla bu iyi CPU ve işletim sistemi tarafından kasıtlı olarak yapılabilir beklenebilir) çekirdekten çekirdeğe.

Ve bu kuşkusuz

+0

İlginç. Windows/Linux'un bunu kesin olarak biliyor mu, yoksa bir hipotez mi? (Ayrıca, stackoverflow'a hoş geldiniz:) – Leeor

+0

Bunu OSX ve Windows'ta açıkça görüyorum. Linux için de aynısını beklerdim, ama kesinlikle bunu doğrulamaya çalışmadım. – Camlin

İlgili konular