2009-06-27 22 views
10

C# ile yazılmış bir programım var, bir Windows Forms uygulaması geliştirmek için VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 kullanıyorum.Bir programın CPU benzeşimi nasıl ayarlanır?

Şu anki bilgisayarım çift çekirdekli CPU'dur, programımın CPU benzeşimini belirli bir CPU üzerinde çalışacak ve başka bir işlem yapmak için başka bir CPU kullanacak şekilde ayarlamak istiyorum. Bunun nasıl yapıldığına dağir fikri olan? Kodlama veya yapılandırma yoluyla tamam.

Biraz daha arka plan, programım yoğun CPU'dur, bu yüzden bilgisayarımda iki CPU kaynağının tümünü kullanmasına izin vermek istemiyorum ve ağda aynı anda hızla göz atmak için bir CPU'yu boşaltmak istiyorum. . peşin :-)

sayesinde George

+1

Arabirim sunucusu için bunu yapmak için bir yardımcı program gördüm (ibaffinity bence çağrıldı). Bunu kendi programımın herhangi biri için de nasıl yapacağımı görmek isterdim - muhtemelen sizin çalıştırıcınızda çalışma zamanında yapamazsınız, bunu harici konfigürasyonla veya kurulum işlemi sırasında yapmanız gerekir (I). 'sanırım). – robsoft

+1

@robsoft: Bu yalnızca eski Interbase/Firebird sürümleri için gerekliydi. Son sürümler, sunucu işlemlerini her biri bir işlemci çekirdeğine bağlar. Açık kaynak, bu yüzden orada nasıl yapıldığını her zaman kontrol edebilirsiniz. – mghie

cevap

3

Aslında özellikle bir şey yapmak sürece birden fazla CPU kullanmaz uygulamanız daha fazla CPU kullanmak için. İş parçacığı havuzunu kullanırsanız ve/veya ek iş parçacıkları başlatırsanız, ek kullanılabilir çekirdekler kullanabilirsiniz, ancak aksi takdirde uygulamanız varsayılan olarak yalnızca bir iş parçacığına sahip olacak ve bu nedenle yalnızca bir CPU kullanacaktır.

+0

Uygulamam, Windows Media Encoder üzerinden kaydedildiği ve wmv formatına gerçek zamanlı kodlama yaptığı için birden fazla CPU kullanacaktır - test ettim ve tüm CPU kaynaklarının Windows görev yöneticisinden olduğunu gördüm. CPU benzeşiminin nasıl ayarlanacağı konusunda herhangi bir fikrin var mı? – George2

+1

@Brian: Önbelleğin çekirdek başına olduğu sistemler için bir iş parçacığının bir çekirdekte kalmasını zorlamak yine de mantıklı olabilir. – mghie

+0

@mghie, Sana katılıyorum. Problemim için herhangi bir fikir var mı? – George2

12
  1. Git Görev Yöneticisi için ->Süreçler sekme.
  2. Programınızı bulun. Üzerine sağ tıkla.
  3. Affinity'u seçin ve onay kutularından birinin işaretini kaldırın.

Bu, sizin için bir işlemci serbest bırakmalıdır.

koddan yapıyor için bu ifadeyi ekleyebilirsiniz:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1; 

Şerefe! Bunu yapmak için

+0

Herhangi bir programlama veya yapılandırma yolu? Son kullanıcının bunu her seferinde yapmasını istemiyorum. :-) – George2

+2

Bu deneyin: System.Diagnostics.Process.GetCurrentProcess() ProcessorAffinity = 1;. – Gaurav

+0

BTW: İkinci olarak ayarlamak için 2 olarak ayarlayın ve her iki çekirdek kullanmak için değeri 3 olarak ayarlayabilirsiniz :) – Gaurav

7

Windows API fonksiyonları SetProcessAffinityMask() ve SetThreadAffinityMask() bulunmaktadır. .NET'i bilmiyorum bu yüzden bu işlevlerin etrafında sarıcı olup olmadığını söyleyemem ama this aksini önerdi.

BTW: Bunların yalnızca çok özel durumlarda gerekli olduğunu kabul ediyorum, normalde OS zamanlayıcısının bununla ilgilenmesine izin vermek en iyisidir. Nasıl olduğunu sorman gerekiyorsa, muhtemelen bunu yapmaman gereken sorulardan biridir.

+1

@mghie, benim sorunumda, 1. SetThreadAffinityMask dışındaki SetProcessAffinityMask'ı çağırmalıyım, doğru mu? 2. Mevcut işlemin yakınlığını ayarlamak için mevcut işlemden SetProcessAffinityMask'ı çağırabilir miyim? Yoksa harici araçtan mı kurmalıyım? – George2

+3

Bunu işlemin kendisinden yapabilirsiniz. Bu MSDN makalesiyle başlamak en iyisidir: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, bazı kodların yanı sıra yararlı arka plan bilgileri de sağlamalıdır. – mghie

+0

Yanıtınızı beğeniyorum, System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity özelliğini kullanma hakkında neden IntPrt kullanıyoruz, neden int kullanmıyoruz? – George2

İlgili konular