2013-06-14 15 views
5

Bir Görevcinin temel olarak hafif bir iş parçacığı olduğunu söyleyen bir iş arkadaşına kulak misafiri oldum. Bir C++ arka planından (en hafif ağırlık işlem ünitesinin kullanıldığı yerler) gelince, bu bana karşı sezgisel geliyor.Bir iş parçacığına kıyasla bir görev hafifliği var mı?

Görevler, Konular kadar ağır değil mi?

+0

Çoğalt - http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread – EkoostikMartin

cevap

5

Bir iş birimini (Görevler), bunları barındırmak/yürütmek için kullanılan temel işlemden ayırdetmeniz gerekir. Görevlerin diğer iş parçacıklarında çalışması bile gerekli değildir. Örneğin, Görevler düzenli olarak denetim havuzuna denetim sağlayan tek bir iş parçacığı uygulamasında yürütülebilir. Görevler ayrı iş parçacıkları üzerinde yürütüldüğünde bile, Görev ve Konu arasında genellikle 1 ile 1 arasında bir ilişki yoktur. İş parçacıkları bir havuzun parçası olarak önceden ayrıştırılır ve ardından görevlerin bu iş parçacıkları üzerinde kullanılabilir olarak çalışması planlanır. Yeni bir görev oluşturmak, bir iş parçacığı oluşturmanın ek yükünü gerektirmez, yalnızca bir görev sırasındaki enque değerini gerektirir.

Bu, görevleri doğal olarak daha ölçeklendirilebilir yapar. Uygulamamın ömrü boyunca milyonlarca görev yapabilirim, ancak yalnızca sabit sayıda iş parçacığı kullanıyorum.

+1

"Bu, işleri daha fazla ölçeklenebilir hale getirir." Bunun “Görev” e özgü olmadığı belirtilmelidir. Eski 'ThreadPool' sınıfı, IO Kontrol Portları gibi aynı ölçeklenebilirliği sağlar ya da sadece sabit sayıda tüketici' Thread's ile bir Producer/Consumer kuyruğunu uygular. – mbeckish

+2

@mbeckish Doğru, standart uygulamanın tam olarak olduğuna inanıyorum, ThreadPool üzerine bir kullanım kolaylığı katmanı. –

1

Haklısınız - her şey kapakların altındaki bir iş parçacığında çalışır.

kişi Task bir ThreadThread s verimli kullanımı, Microsoft Task s sahip içine düşünce bir sürü koyun yapmak daha hafiftir ve uygulama muhtemelen ne kadar ortalama geliştirici olduğundan daha çok hafif ağırlığı olduğunu söylemek nedeni Thread sınıfını kullanarak kendi başlarına çıkın.

DÜZENLEME

Daha net bir açıklama Task amacı Thread nesne daha hafiftir olmasıdır ve her Task süre sonunda eş zamanlı olarak, N eşzamanlı daha az yol açar olarak N Task nesne oluşturmak üzere, bir Thread çalıştırılır Thread nesneler büyük için kullanılır.

2

Genellikle "iş parçacığı", zorunlu eşzamanlılık anlamına gelir. Bir iş parçacığı başlatmak, bunun için bir yığın ve iç işletim sistemi veri yapıları tahsis etmeyi gerektirir. Buna karşılık, bir "görev" genellikle eşzamanlılığın isteğe bağlı olduğu bir iş parçasına atıfta bulunur, dolayısıyla paralel bir çerçeve (OpenMP, Cilk Plus, TBB, PPL gibi) serileştirerek birçok görevi yürütmek için aynı iş parçacığını kullanabilir Görevleri ve isteğe bağlı paralelizmi, yalnızca makineyi meşgul etmek için gerekli olan gerçek paralellik haline dönüştürmek.

+0

"Zorunlu eşzamanlılık" fikrine asıldım. Çekirdekleriniz olduğundan daha fazla iş parçacığınız varsa, bunları bir düzeyde * düzenleyeceksiniz. Zorunlu eşzamanlılık fikri, çok sayıda iş parçacığına nasıl uygulanır. (Diğer cevapların bağlamından ne söylediğini anlayabiliyorum. Bu terim sadece kafa karıştırıcıdır.) – Richard

+0

@Richard - Bir .NET 'Thread' nesnesinin maliyeti çekirdek sayısından, hatta sayıdan bağımsızdır. yönetilen iş parçacıklarının eşleştirildiği çekirdek iş parçacığı.Maliyet 1) 'Thread' nesnesine ayrılan kabaca 1 MB bellek ve 2) çekirdeklerden daha fazla iş parçacığınız olduğunda bağlam değişiminin CPU maliyeti. 'Görev' veya 'ThreadPool' tarafından sağlanan tasarruf, uygulamanızın 1000 'Görev 'nesnesi oluşturabilmesidir, .NET ise yalnızca 20' Thread' nesnesinde işleyebilir. – mbeckish

+0

Daha doğru bir şekilde, 'çekirdeklerden daha hazır konularınız olduğunda bağlam değişiminin CPU maliyeti'. –

İlgili konular