Çok çekirdekli bir işlemcide birden fazla iş parçacığı başlattığınızda, farklı çekirdekler tarafından işlenmeleri garanti edilir mi?


24

4 çekirdekli bir Pentium core i5 işlemciye sahibim. Bunu bir C # konsol programında yaparsam

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

t1 ve t2 dişlerinin ayrı çekirdeklerde çalışması garanti edilir mi?


1
C # çalışma zamanının başka bir iş parçacığı oluşturmak için eşdeğer yerel sistem çağrıları kullandığını varsayarsak (ve dolayısıyla gerçekten paraleldir; bu, CPython'un rezil Global Tercüman Kilidi gibi her şey için geçerli değildir ), bu yalnızca işletim sisteminin işlem / görev zamanlayıcısına bağlı olacaktır . Genel olarak, eğer varsayıyorsanız t1ve t2keyfi bir sırada farklı zamanlarda yürütülürseniz , kod gerçekten güvenlidir (örneğin , bazı modellerde daha öncet2 başlar ). t1
Atılım

2
Pentium i5 işlemcileri olduğunu bilmiyordum. Belki Core i5'i kastettin? Seçici. Biliyorum: D
JosephGarrone

Yanıtlar:


18

Net'te, iki Threads iki ayrı çekirdeğin üzerinde çalışacağını garanti edemezsiniz . Aslında, birinin Threadyalnızca bir çekirdeğin (!) Üzerinde çalışacağını da garanti edemezsiniz .

Bunun nedeni, yönetilen iş parçacıklarının işletim sistemi iş parçacıkları ile aynı olmamasıdır - tek bir yönetilen iş parçacığı bunu desteklemek için birden fazla işletim sistemi iş parçacığı kullanabilir. C #, sadece şimdiye kadar yönetilen doğrudan ilgisi Threads (yapmanız asla WinAPI diş arama fonksiyonlarıyla en azından p / çağırmak için başvurmadan) .

Ancak, .NET ve Windows iş parçacığı zamanlayıcılar ne yaptıklarında çok iyi - ikinci bir çekirdek tamamen boşta dururken, tek bir çekirdekte iki iş parçacığı çalıştırmazlar. Yani, genel olarak, endişelenmenize gerek yok.


Uygulamada, Net Threadler vardır OS ipler. Ancak, tek bir dişlinin her zaman aynı çekirdeğin üzerinde çalışacağı garantisi yoktur.
svick

2
@svick: Uygulamada, x86 , doğrudur. Ancak, standart açıkça bu davranışa güvenemeyeceğinizi, dolayısıyla gelecekte değişebileceğini belirtir. Aslında, XBox 360'larda olduğu gibi .Net CLR'nin diğer sürümlerinde doğru değil .
BlueRaja - Danny Pflughoeft

@BlueRaja - Soru, CLR'nin hangi sürümünden bahsettiğimize dair spesifik. İki ayrı çekirdekte, eşzamansız iplikler kullanarak bir şeyin bulunacağını garanti edebilirsiniz, çünkü birbirlerinden eşzamanlı olmadıkları anlamına gelir. Mevcut örnek kod, teknik olarak bir senkronizasyon çağrısıdır. Elbette işletim sistemi hangi çekirdeklerin kullanılacağına karar verir.
Ramhound

@Ramhound "Async iş parçacıklarını kullanarak iki ayrı çekirdekte bir şeyin olacağını garanti edebilirsiniz" - bu yanlıştır. asyncAnahtar kelime (sana "zaman uyumsuz iş parçacığı" olarak bahsediyoruz varsayalım ne gereksiz) bir kullanma sadece sözdizimsel şeker BackgroundWorkerbaşka Net iplik gibi olan iplik, - Eğer garanti bir çalışacağını olamaz mı ayrı bir çekirdek olsun ya da olmasın.
BlueRaja - Danny Pflughoeft

@BlueRaja - İki zaman uyumsuz iş parçacığı başlatıldıysa, iki CPU çekirdeği olması koşuluyla her ikisi de aynı anda çalışırlardı. Yalnızca bir tane olsaydı, işletim sistemi her bir iş parçacığının ne zaman öncelik kazanacağını ve çalışacağını ve tipik tek dişli diş açma durumunuzun ortaya çıkacağını zamanlardı. Bu nasıl bir CPU'nun çoklu konuları nasıl kullandığını öğrenmemişti.
Ramhound

15

Hayır, işletim sistemi ve CPU neyin ne zaman çalıştırılacağına karar verecek. göstermiş olduğunuz basit örnekte, diğer görevlerin hariç tutulması durumunda, evet, büyük olasılıkla ayrı çekirdeğe paralel olarak çalışacaklardı, ancak nadiren bunun olacağı garantisi var.

Bir çekirdeğin verilen bir dişe tahsisi üzerinde kontrol sahibi olmak için iplik benzeşimini kullanabilirsiniz .

Ayrıca , hangi yivlerin tamamen paralel olması ve hangilerinin bekleyebileceği konusunda istifleme için programlama önceliklerini göz önünde bulundurun .


1
Ayrıca, sanallaştırma teknolojilerinde programınızla donanım arasında başka bir katman olduğunu da eklemek istiyorum. İşletim sisteminin uygulamaya sunduğu şey fiziksel olarak doğru olmayabilir.
Keltari

1
Bunlar işletim sistemi iş parçacıkları için değil, iş parçacığı için değil .NET iş parçacığı zamanlayıcısı ile ciddi şekilde etkileşime girebileceklerinden, asla C #'dan çağrılmamalıdırlar.
BlueRaja - Danny Pflughoeft
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.