Jak ograniczyć uruchamianie pojedynczego programu procesowego w środowisku Windows do działania tylko na jednym procesorze na komputerze wielordzeniowym?
Czy to samo dotyczy programu okienkowego i programu wiersza poleceń?
AKTUALIZACJA:
- Powód tego: analiza porównawcza różnych aspektów języków programowania
- Potrzebuję czegoś, co działałoby od samego początku procesu, dlatego odpowiedź @ akseli, choć świetna w innych przypadkach, nie rozwiązuje mojej sprawy
windows
process
multi-core
Jonathan
źródło
źródło
Odpowiedzi:
Jeśli korzystasz z systemu Windows Vista / 7 (prawdopodobnie XP, ale nie jesteś pewien), to naprawdę dość proste.
Wpisz:
Control+Shift+Esc
aby uruchomić menedżera zadań.Kliknij kartę Procesy
Znajdź proces, który wymaga zmiany powinowactwa procesora
Kliknij proces prawym przyciskiem myszy
Kliknij „Ustaw koligację”
Tutaj możesz wybrać procesory, których będzie używał Twój proces.
Powodzenia!
EDYCJA: Musisz być administratorem, aby to działało.
źródło
z wiersza poleceń użyj
spowoduje to uruchomienie programu.exe na pierwszym CPU, ponieważ „1” jest wartością szesnastkową maski koligacji
źródło
Zależy od tego, co chcesz zrobić:
Metoda 1: na żądanie
Użyj ImageCFG . To narzędzie pozwoli ci skonfigurować plik wykonywalny do działania na dowolnej liczbie rdzeni. Upewnij się, że wykonałeś kopię zapasową docelowego pliku wykonywalnego przed dokonaniem zmian i przywróć go, gdy skończysz grać z nim.
Metoda 2: Wymuś całą sesję systemu Windows (Vista / 7)
bcdedit /set onecpu on
w wierszu poleceniabcdedit /set onecpu off
i uruchom ponownie.Metoda 2: Wymuś całą sesję systemu Windows (XP)
W pliku znajdziesz następującą (lub podobną) sekcję:
[system operacyjny]
multi (0) dysk (0) partycja rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect
Zmień to, dodając flagę / onecpu:
[system operacyjny]
multi (0) dysk (0) partycja rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu
Restart. Po zakończeniu gry usuń flagę i uruchom ponownie.
Metoda 0: Niezbyt dobra metoda (koligacja procesora)
Obawiam się, że wszystko, co inaczej wiąże się z powinowactwem do procesora, nie jest dobrym rozwiązaniem. Powinowactwo procesora jest wskazówką dla procesora. Procesor nie jest zobowiązany do przestrzegania go i często tego nie zrobi.
źródło
D:\>bcdedit /set onecpu
skutkujeThe set command specified is not valid.
....The parameter is incorrect.
W moim programie umieściłem następującą funkcję w Pythonie 2.6 i wywołuje ona funkcje systemu Windows. Moja maszyna ma tylko dwa rdzenie, więc może być konieczna zmiana tej części. Komentarze mówią, jak zobaczyć, jakie jest obecne powinowactwo. Działa „tak jak jest” dla maszyny z jednym rdzeniem, jeśli ustawisz lub domyślnie ustawisz maskę 1.
źródło
W systemie Windows 8 musisz przejść do karty Szczegóły w menedżerze zadań, aby wykonać Ustaw koligację. Nie daje opcji na karcie Procesy.
EDYCJA: Ponadto, jeśli program, który chcesz uruchomić, ma parametry, ten wątek może się przydać: Jak uruchomić program z argumentami wiersza poleceń w Windows cmd za pomocą polecenia „start”?
źródło
Gdy szukałem bardzo podobnych informacji za pomocą PowerShell, znalazłem informacje, których potrzebowałem tutaj: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html
Nie wspominałeś, z którego systemu operacyjnego Windows korzystasz (starsze nie były dostarczane z programem PowerShell, chociaż możesz go zainstalować, jeśli go nie ma).
Najważniejsze jest to, że w PowerShell powinowactwo do procesu jest po prostu właściwością, którą można łatwo zmienić.
Aby zobaczyć właściwości (i inne ciekawostki informacji) twojego procesu (używając foo jako przykładowego procesu), polecenie PowerShell byłoby:
Zobaczysz ProcessorAffinity jest jedną z tych właściwości. Zmiana jest trywialna i możesz wybrać rdzeń, na którym chcesz uruchomić, używając wartości z tabeli / linku Revoltera powyżej.
Aby zobaczyć, jaka jest wartość właściwości ProcessorAffinity dla foo, oto polecenie:
Więc jeśli chcesz uruchomić foo tylko na procesorze 4, ustaw jako taką wartość:
źródło
start /affinity
odpowiedzi. Czy twoja technika to potrafi? Jeśli tak, proszę wyjaśnić, w jaki sposób.Start-Process foo ; (Get-Process foo).ProcessorAffinity=8
Jednak po przeczytaniu twojego komentarza i stwierdzeniu, żeStart-Process
ma brakującą flagę powinowactwa, wpadłem na następujące, które przetestowałem:[System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010