web-dev-qa-db-ja.com

プロセスを単一のCPUコアに制限する方法は?

Windows環境で実行される単一プロセスプログラムをマルチコアマシンの単一CPUでのみ実行するように制限するにはどうすればよいですか?

ウィンドウ付きプログラムとコマンドラインプログラムで同じですか?

更新:

  • これを行う理由:プログラミング言語のさまざまな側面のベンチマーク
  • プロセスの最初から機能するものが必要なので、@ akseliの回答は、他のケースには最適ですが、私のケースを解決しません
31
Jonathan

Windows Vista/7(おそらくXPですが、よくわからない)を実行している場合、それは本当にかなり簡単です。

入力:Control+Shift+Escタスクマネージャーを起動します。

[プロセス]タブをクリックします

プロセッサのアフィニティを変更する必要があるプロセスを見つける

プロセスを右クリック

「アフィニティの設定」をクリックします

ここで、プロセスが使用するプロセッサを選択できます。

幸運を!

編集:これを機能させるには、管理者である必要があります。

27
akseli

コマンドラインから、

/ 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 
20
user8228

あなたが何をしたいかによります:

方法1:オンデマンド

ImageCFG を使用します。このユーティリティを使用すると、実行可能ファイルをセットアップして、任意の数のコアで実行できます。変更を加える前にターゲットの実行可能ファイルをバックアップし、操作が終わったらそれを復元してください。

方法2:Windowsセッション全体を強制(Vista/7)

  1. タイプbcdedit /set onecpu onコマンドプロンプト
  2. システムを再起動します。
  3. 再生が終わったら、2と入力します-種類:bcdedit /set onecpu offと再起動します。

方法2:Windowsセッション全体を強制する(XP)

  1. Boot.iniファイルを開きます([マイコンピュータ]を右クリック-> [プロパティ]-> [詳細設定]タブ-> [スタートアップとリカバリ]の下の[設定]ボタン-> [システムスタートアップ]の[編集]ボタン)。
  2. ファイルには次の(または同様の)セクションがあります。

    [オペレーティングシステム]

    multi(0)disk(0)rdisk(0)partition(2)\ WINDOWS = "Microsoft Windows XP Professional"/fastdetect

  3. / onecpuフラグを追加して変更します。

    [オペレーティングシステム]

    multi(0)disk(0)rdisk(0)partition(2)\ WINDOWS = "Microsoft Windows XP Professional"/fastdetect/onecpu

  4. リブート。再生が終わったら、フラグを削除して再起動します。

方法0:良い方法ではありません(Processor Affinity)

それ以外の場合にプロセッサー・アフィニティーが関係するものは、良いオプションではありません、私は恐れています。プロセッサー親和性は、プロセッサーへの手がかりです。プロセッサーはそれを尊重する義務はありませんし、多くの場合それをしません。

6
A Dwarf

次の関数をプログラムの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
5
Marichyasana

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

4
Bewc

Windows 8では、Set Affinityを実行するには、タスクマネージャーの[詳細]タブに移動する必要があります。 [プロセス]タブのオプションはありません。

編集:また、起動したいプログラムにパラメータがある場合、このスレッドが役立ちます: Windowsでコマンドライン引数を使用してプログラムを起動する方法 'cmd'を 'start'コマンドで?

4
DLeh