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


30

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

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

更新:

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

2
なぜこれをしたいのですか?どのCPU /コアをどのプロセスで実行するかをOSに決定させると、はるかに効率的になります。
ChrisF

1
さまざまなプログラミング言語の側面をベンチマークするために
ジョナサン

1
それは正当な理由です-あなたはあなたの質問にその情報を含めるべきでした。それは重要です。
ChrisF

動機は必須ではありませんが、あなたのアドバイスに従って追加しました
ジョナサン

1
しかし、誰かが答えを提供するために必要な情報かもしれません。
ChrisF

回答:


27

Windows Vista / 7(おそらくXPかもしれませんが、確かではありません)を実行している場合、それは本当に簡単です。

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

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

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

プロセスを右クリック

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

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

がんばろう!

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


13
アフィニティは保証ではありません。プロセスはこのプロセッサを優先しますが、複数のスレッドがある場合、すべてがそこにとどまるわけではありません。
ジョエルCoehoorn

1
これは良いことですが、最初から決定論的に正しいものが必要です。
ジョナサン

2
@JoelCoehoorn:いいえ、それ保証です。あなたが話しているのは、親和性ベクトルとは異なる優先プロセッサベクトルです。
Mehrdad

1
@Mehrdad:プログラム自体が変更しない限り。
ユージンリャブツェフ

1
@JoelCoehoorn >スレッドアフィニティは、プロセッサの特定のサブセットでスレッドを強制的に実行します。-あなたはその記事がスレッド理想プロセッサであると言っているものを参照しているようです。
ボブ

19

コマンドラインから、使用

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
Revolter:サービスの初期化で同じことができるかどうか知っていますか?
ディオゴ

4つ以上のコアがある場合はどうなりますか?
posfan12

7

あなたがやろうとしていることに依存します:

方法1:オンデマンド

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

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

  1. 入力bcdedit /set onecpu onコマンドプロンプトで
  2. システムを再起動します。
  3. 再生が完了したら、2-Type: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に関係するものは何でも良い選択肢ではない、と私は恐れている。プロセッサアフィニティは、プロセッサの手がかりです。プロセッサはそれを尊重する義務はなく、しばしばそうしません。


方法2は、Win7では機能しないようです。D:\>bcdedit /set onecpu結果はThe set command specified is not valid.....The parameter is incorrect.
最大

2
technet.microsoft.com/en-us/library/cc938636.aspxは、「...ハードアフィニティ、つまり、プロセッサアフィニティマスクは、アフィニティマスクの影響を受けるスレッドをマスクで指定されたプロセッサに制限することを意味します。ハードによって制限されるスレッドアフィニティマスクは、アフィニティマスクに含まれていないプロセッサでは実行されません」。尊敬されないという情報源はありますか?
ユージンリャブツェフ

4

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

OPは、コードを求めていないことを確認場合...
bytebuster

この関数をコマンドラインまたはバッチファイルからどのように実行しますか?プロセスIDを事前に知るまたは設定する方法はありますか?
posfan12


4

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


あなたの説明からはわかりません:これは既存のプロセスにのみ適用されますか?OPはプロセスを開始してからアフィニティを設定することを望みません。彼は、答えのように、既にアフィニティーが設定されたプロセスを開始したいと考えていstart /affinityます。あなたの技術はそれを行うことができますか?その場合、その方法を説明してください。
スコット

2
@Scott既存のプロセスのみ。あなたが提供する文脈では、私の答えは役に立たない。「プロセスの非常に開始」は、プロセスを開始し、すぐにその親和性を設定することの問題だと感じました。IEは:Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 しかし、あなたのコメントを読んで、そして発見した後、Start-Process行方不明の親和性フラグ自体を持って、私は私がテストし、以下、思い付いた: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

回答を編集して、その選択肢を追加することをお勧めします。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.