2009-06-27 11 views
10

Mam program napisany w języku C#, używam VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 do opracowania aplikacji Windows Forms.jak ustawić powinowactwo CPU programu?

Mój obecny komputer to dwurdzeniowy procesor, chcę ustawić powinowactwo procesora mojego programu do pracy na określonym CPU i zwolnić inny procesor w celu wykonania innej pracy. Wszelkie pomysły, jak to zrobić? Albo przez kodowanie, albo konfigurację jest w porządku.

Nieco więcej tła, mój program intensywnie korzysta z procesora, więc nie chcę pozwolić, aby zajmował on wszystkie dwa zasoby procesora na moim komputerze i chcę zwolnić jeden procesor, aby móc szybko przeglądać sieć . :-)

góry dzięki, George

+1

Widziałem narzędzie do tego, aby serwer bazy danych (ibaffinity Myślę, że został wywołany). Byłbym zainteresowany widząc, jak to zrobić dla każdego z moich własnych programów - prawdopodobnie nie możesz tego zrobić w czasie wykonywania w twoim pliku wykonywalnym, musiałbyś to zrobić poprzez zewnętrzną konfigurację lub podczas procesu instalacji (I zgaduję). – robsoft

+1

@robsoft: Było to konieczne tylko w przypadku starych wersji Interbase/Firebird. Ostatnie wersje wiążą procesy serwera z jednym rdzeniem procesora. Jest open source, więc zawsze można sprawdzić, jak to się robi. – mghie

Odpowiedz

3

Faktycznie, aplikacja nie będzie korzystać więcej niż jeden procesor chyba że wyraźnie coś zrobić, aby wykorzystać więcej procesorów. Jeśli korzystasz z puli wątków i/lub rozpoczynasz dodatkowe wątki, możesz użyć dodatkowych dostępnych rdzeni, ale w przeciwnym razie aplikacja będzie miała tylko jeden wątek na domyślne i dlatego użyje tylko jednego procesora.

+0

Moja aplikacja będzie używać więcej niż jednego procesora, ponieważ nagrywa za pomocą Windows Media Encoder i wykonuje kodowanie w czasie rzeczywistym do formatu wmv - testowałem go i widziałem, jak wszystkie zasoby procesora są zajęte przez menedżera zadań Windows. Jakieś pomysły dotyczące ustawiania koligacji procesora? – George2

+1

@Brian: Wciąż może być sens, aby zmusić wątek do pozostania na jednym rdzeniu, w systemach, w których pamięć podręczna jest na rdzeniu. – mghie

+0

@mghie, zgadzam się z tobą. Jakieś pomysły na mój problem? – George2

12
  1. idź do Menedżera zadań ->Procesy zakładka.
  2. Poszukaj swojego programu. Kliknij go prawym przyciskiem myszy.
  3. Wybierz Ustaw powinowactwo i odznacz jedno z pól wyboru.

To powinno zwolnić jeden procesor.

Dla robi to z kodu można dodać to stwierdzenie:

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

Cheers!

+0

Jakieś sposoby programowania lub konfiguracji? Nie chcę, aby użytkownik końcowy robił to za każdym razem. :-) – George2

+2

Spróbuj tego: System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity = 1; – Gaurav

+0

BTW: Aby użyć drugiej ustawić na 2 i używać obu rdzeni, można ustawić wartość na 3 :) – Gaurav

7

okien funkcje API, aby to zrobić są SetProcessAffinityMask() i SetThreadAffinityMask(). Nie wiem .NET, więc nie mogę powiedzieć, czy wokół tych funkcji są owijki, ale wydaje się sugerować, że jest inaczej.

BTW: Zgadzam się, że są one konieczne tylko w ściśle określonych okolicznościach, najlepiej jest pozwolić, aby programista systemu operacyjnego sobie z tym poradził. To jedno z tych pytań, na które prawdopodobnie nie powinieneś tego robić, jeśli musisz zapytać w jaki sposób.

+1

@mghie, w moim problemie, 1. Myślę, że powinienem wywołać SetProcessAffinityMask inne niż SetThreadAffinityMask, prawda? 2. Czy mogę wywołać funkcję SetProcessAffinityMask z bieżącego procesu, aby ustawić powinowactwo bieżącego procesu? Czy muszę ustawić to z zewnętrznego narzędzia? – George2

+3

Możesz to zrobić z samego procesu. Najprawdopodobniej najlepiej zacząć od tego artykułu MSDN: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, powinien on dostarczyć trochę kodu oraz pomocne informacje dodatkowe. – mghie

+0

Podoba mi się twoja odpowiedź, o użyciu System.Diagnostics.Process.GetCurrentProcess(). Właściwość ProcessorAffinity, dlaczego powinniśmy używać IntPrt, dlaczego nie używać int? – George2

Powiązane problemy