Windows環境で実行される単一プロセスプログラムをマルチコアマシンの単一CPUでのみ実行するように制限するにはどうすればよいですか?
ウィンドウ付きプログラムとコマンドラインプログラムで同じですか?
更新:
Windows Vista/7(おそらくXPですが、よくわからない)を実行している場合、それは本当にかなり簡単です。
入力:Control+Shift+Esc
タスクマネージャーを起動します。
[プロセス]タブをクリックします
プロセッサのアフィニティを変更する必要があるプロセスを見つける
プロセスを右クリック
「アフィニティの設定」をクリックします
ここで、プロセスが使用するプロセッサを選択できます。
幸運を!
編集:これを機能させるには、管理者である必要があります。
コマンドラインから、
/ 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)
それ以外の場合にプロセッサー・アフィニティーが関係するものは、良いオプションではありません、私は恐れています。プロセッサー親和性は、プロセッサーへの手がかりです。プロセッサーはそれを尊重する義務はありませんし、多くの場合それをしません。
次の関数をプログラムの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
PowerShellを使用して非常に類似した情報を探していたところ、ここに必要な情報が見つかりました: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html
使用しているWindows OSについては言及していませんでした(古いバージョンにはPowerShellが付属していませんでしたが、そこになければインストールできます)。
簡単に言うと、PowerShellでは、プロセスアフィニティは簡単に変更できるプロパティにすぎません。
プロセスのプロパティ(およびその他の情報)を表示するには(プロセスの例としてfooを使用)、PowerShellコマンドは次のようになります。
Get-Process foo | Get-Member
ProcessorAffinityがそれらのプロパティの1つであることがわかります。これを変更するのは簡単で、上記のRevolterの表/リンクの値を使用して、実行するコアを選択できます。
FooのProcessorAffinityプロパティの値を確認するには、次のコマンドを使用します。
(Get-Process foo).ProcessorAffinity
したがって、cpu 4でのみfooを実行する場合は、次のように値を設定します。
(Get-Process foo).ProcessorAffinity = 8
Windows 8では、Set Affinityを実行するには、タスクマネージャーの[詳細]タブに移動する必要があります。 [プロセス]タブのオプションはありません。
編集:また、起動したいプログラムにパラメータがある場合、このスレッドが役立ちます: Windowsでコマンドライン引数を使用してプログラムを起動する方法 'cmd'を 'start'コマンドで?