Windows環境で実行される単一プロセスプログラムをマルチコアマシンの単一CPUでのみ実行するように制限するにはどうすればよいですか?
ウィンドウプログラムとコマンドラインプログラムで同じですか?
更新:
- これを行う理由:さまざまなプログラミング言語の側面のベンチマーク
- プロセスの最初から機能するものが必要です。したがって、@ akseliの答えは、他の場合には優れていますが、私の場合は解決しません。
Windows環境で実行される単一プロセスプログラムをマルチコアマシンの単一CPUでのみ実行するように制限するにはどうすればよいですか?
ウィンドウプログラムとコマンドラインプログラムで同じですか?
更新:
回答:
Windows Vista / 7(おそらくXPかもしれませんが、確かではありません)を実行している場合、それは本当に簡単です。
次を入力してControl+Shift+Esc
、タスクマネージャーを起動します。
[プロセス]タブをクリックします
プロセッサアフィニティの変更が必要なプロセスを見つける
プロセスを右クリック
「アフィニティを設定」をクリックします
ここで、プロセスが使用するプロセッサを選択できます。
がんばろう!
編集:これを機能させるには管理者である必要があります。
コマンドラインから、使用
start / affinity 1 program.exe
「1」はアフィニティマスクの 16進値であるため、これは最初のCPUでprogram.exeを実行します
CPU3 CPU2 CPU1 CPU0 Bin Hex
---- ---- ---- ---- --- ---
OFF OFF OFF ON = 0001 = 1
OFF OFF ON OFF = 0010 = 2
OFF OFF ON ON = 0011 = 3
OFF ON OFF OFF = 0100 = 4
OFF ON OFF ON = 0101 = 5
OFF ON ON OFF = 0110 = 6
OFF ON ON ON = 0111 = 7
ON OFF OFF OFF = 1000 = 8
ON OFF OFF ON = 1001 = 9
ON OFF ON OFF = 1010 = A
ON OFF ON ON = 1011 = B
ON ON OFF OFF = 1100 = C
ON ON OFF ON = 1101 = D
ON ON ON OFF = 1110 = E
ON ON ON ON = 1111 = F
あなたがやろうとしていることに依存します:
方法1:オンデマンド
ImageCFGを使用します。このユーティリティを使用すると、任意の数のコアで実行する実行可能ファイルをセットアップできます。変更を行う前にターゲットの実行可能ファイルをバックアップし、それで遊んでいるときにそれを復元してください。
方法2:Windowsセッション全体を強制する(Vista / 7)
bcdedit /set onecpu on
コマンドプロンプトでbcdedit /set onecpu off
と入力して、再起動します。方法2:Windowsセッション全体を強制する(XP)
ファイルには次の(または同様の)セクションがあります。
[オペレーティングシステム]
multi(0)disk(0)rdisk(0)partition(2)\ WINDOWS = "Microsoft Windows XP Professional" / fastdetect
/ onecpuフラグを追加して変更します。
[オペレーティングシステム]
multi(0)disk(0)rdisk(0)partition(2)\ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu
リブート。再生が完了したら、フラグを削除して再起動します。
方法0:良い方法ではありません(プロセッサアフィニティ)
そうでなければProcessor Affinityに関係するものは何でも良い選択肢ではない、と私は恐れている。プロセッサアフィニティは、プロセッサの手がかりです。プロセッサはそれを尊重する義務はなく、しばしばそうしません。
D:\>bcdedit /set onecpu
結果はThe set command specified is not valid.
....The parameter is incorrect.
python 2.6のプログラムに次の関数を追加すると、windows関数が呼び出されます。私のマシンには2つのコアしかないので、その部分を変更する必要があるかもしれません。コメントは、現在の親和性がどのように見えるかを示します。マスクを1に設定またはデフォルトに設定すると、シングルコアマシンで「そのまま」動作します。
def setaffinitymask(pid = None, mask = 1):
""" Set The Affinity Mask of a Windows Process. Affinity Mask is a value between 1-3 where
1 is for core 0, 2 is for core 1, 3 is for both cores (it is a bitmap)
Default sets the Affinity Mask to core 0 only
python process can take any valid process ID. """
import win32api, win32process, win32con
if pid == None:
pid = win32api.GetCurrentProcessId()
if mask == None:
mask = 1
if mask < 1 or mask > 3:
mask = 1
print 'process affinity mask out of range [1..3] setting it to 1'
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
# see what mask is currently set to
# processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
# print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask
# set affinity for process to mask value
win32process.SetProcessAffinityMask(handle, mask) # 1=core 0, 2=core 1, 3=both
processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
#print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask
Windows 8では、アフィニティの設定を行うには、タスクマネージャーの[詳細]タブに移動する必要があります。[プロセス]タブのオプションは表示されません。
編集:また、起動したいプログラムにパラメータがある場合、このスレッドは便利です: Windowsのコマンドライン引数を使用してプログラムを起動する方法 'cmd''start'コマンド?
PowerShellを使用して非常によく似た情報を探していたときに、必要な情報をここで見つけました:http : //www.energizedtech.com/2010/07/powershell-setting-processor-a.html
使用しているWindows OSについては触れませんでした(古いものにはPowerShellが付属していませんでしたが、ない場合はインストールできます)。
簡単に言えば、PowerShellでは、プロセスアフィニティは単に簡単に変更できるプロパティです。
プロセスのプロパティ(およびその他の情報)を表示するには(プロセスの例としてfooを使用)、PowerShellコマンドは次のようになります。
Get-Process foo | 取得メンバー
ProcessorAffinityがこれらのプロパティの1つであることがわかります。変更は簡単で、上記のRevolterの表/リンクの値を使用して、実行するコアを選択できます。
fooのProcessorAffinityプロパティの値を確認するには、次のコマンドを使用します。
(Get-Process foo).ProcessorAffinity
したがって、CPU 4でのみfooを実行する場合は、値を次のように設定します。
(Get-Process foo).ProcessorAffinity = 8
start /affinity
ます。あなたの技術はそれを行うことができますか?その場合、その方法を説明してください。
Start-Process foo ; (Get-Process foo).ProcessorAffinity=8
しかし、あなたのコメントを読んで、そして発見した後、Start-Process
行方不明の親和性フラグ自体を持って、私は私がテストし、以下、思い付いた: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010