프로세스를 단일 CPU 코어로 제한하는 방법은 무엇입니까?


30

다중 코어 시스템의 단일 CPU에서만 실행되도록 Windows 환경에서 단일 프로세스 프로그램 실행을 제한하는 방법은 무엇입니까?

윈도우 프로그램과 명령 행 프로그램간에 동일합니까?

최신 정보:

  • 이를 수행하는 이유 : 다양한 프로그래밍 언어 측면 벤치마킹
  • 프로세스의 처음부터 작동 할 수있는 것이 필요하므로 @akseli의 대답은 다른 경우에는 훌륭하지만 내 경우를 해결하지 못합니다.

2
왜 이러고 싶니? OS가 어느 CPU / 코어를 어느 프로세스가 더 효율적으로 실행할지 결정하게합니다.
ChrisF

1
다양한 프로그래밍 언어 측면을 벤치마킹하기 위해
Jonathan

1
그럴만한 이유가 있습니다. 질문에 해당 정보를 포함시켜야합니다. 중요합니다.
ChrisF

동기 부여는 필수는 아니지만 조언에 따라 추가했습니다.
Jonathan

1
그러나 누군가가 답변을 제공 할 수 있어야하는 정보 일 수 있습니다.
ChrisF

답변:


27

Windows Vista / 7 (XP 일 수도 있지만 확실하지는 않음)을 실행하는 경우 실제로 간단합니다.

작업 관리자를 시작하려면 입력 Control+Shift+Esc하십시오.

프로세스 탭을 클릭하십시오

프로세서 선호도를 변경해야하는 프로세스 찾기

프로세스를 마우스 오른쪽 버튼으로 클릭

"친 화성 설정"을 클릭하십시오

여기서 프로세스에서 사용할 프로세서를 선택할 수 있습니다.

행운을 빕니다!

편집 :이 작업을 수행하려면 관리자 여야합니다.


13
선호도는 보장되지 않습니다. 프로세스는이 프로세서를 선호하지만 스레드가 여러 개인 경우 모든 스레드가 유지되지는 않습니다.
Joel Coehoorn

1
이것은 좋지만 처음부터 결정론적일 것이 필요합니다
Jonathan

2
@JoelCoehoorn : 아니, 그것은 이다 보증. 당신이 말하는 것은 선호도 벡터와 다른 선호하는 프로세서 벡터입니다.
Mehrdad

1
@Mehrdad : 프로그램 자체가 원하는대로 변경하지 않는 한.
유진 Ryabtsev

1
@JoelCoehoorn > 스레드 선호도는 스레드가 특정 프로세서 서브 세트에서 실행되도록합니다. -당신은 기사가 스레드 이상적인 프로세서 라고 말하는 것을 말하는 것 같습니다 .
Bob

19

명령 행에서

/ 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
반란군 : 서비스 초기화에서 동일한 작업을 수행 할 수 있는지 알고 있습니까?
Diogo

코어가 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. 파일에서 다음 (또는 유사한) 섹션을 찾을 수 있습니다.

    [운영체제]

    멀티 (0) 디스크 (0) rdisk (0) 파티션 (2) \ WINDOWS = "Microsoft Windows XP Professional"/ fastdetect

  3. / onecpu 플래그를 추가하여 변경하십시오.

    [운영체제]

    멀티 (0) 디스크 (0) rdisk (0) 파티션 (2) \ WINDOWS = "Microsoft Windows XP Professional"/ fastdetect / onecpu

  4. 재부팅하십시오. 재생이 끝나면 플래그를 제거하고 다시 재부팅하십시오.

방법 0 : 좋은 방법이 아님 (프로세서 선호도)

프로세서 선호도와 관련이있는 것은 좋은 선택이 아닙니다. 프로세서 선호도는 프로세서의 실마리입니다. 프로세서는 프로세서를 존중할 의무가 없으며 종종 그렇지 않습니다.


방법 2는 Win7에서 작동하지 않는 것 같습니다. D:\>bcdedit /set onecpu결과는 The set command specified is not valid.....The parameter is incorrect.
최대

2
technet.microsoft.com/ko-kr/library/cc938636.aspx에 "... 하드 선호도 (hard affinity)는 프로세서 선호도 마스크가 선호도 마스크의 영향을받는 스레드를 마스크가 지정한 프로세서로 제한 함을 의미합니다. 선호도 마스크에 포함되지 않은 프로세서에서는 선호도 마스크가 실행되지 않습니다 ". 존중받지 않을 것이라는 소식이 있습니까?
유진 Ryabtsev

4

파이썬 2.6의 프로그램에 다음 함수를 넣고 Windows 함수를 호출합니다. 내 컴퓨터에는 코어가 두 개뿐이므로 해당 부분을 변경해야 할 수도 있습니다. 의견은 현재 선호도가 무엇인지 확인하는 방법을 알려줍니다. 마스크를 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에 대해서는 언급하지 않았습니다 (구형의 Windows OS는 PowerShell과 함께 제공되지 않았지만 설치할 수는 있지만).

가장 빠른 점은 PowerShell에서 프로세스 선호도는 단순히 변경할 수있는 속성이라는 것입니다.

프로세스의 속성 (및 기타 정보)을 보려면 (foo를 예제 프로세스로 사용) PowerShell 명령은 다음과 같습니다.

Get-Process foo | 회원 가입

ProcessorAffinity가 이러한 속성 중 하나임을 알 수 있습니다. 그것을 바꾸는 것은 사소한 것이며, 위의 Revolter의 테이블 / 링크 값을 사용하여 실행할 코어를 선택할 수 있습니다.

ProcessorAffinity 특성의 값이 foo인지 확인하려면 다음 명령을 사용하십시오.

(Get-Process foo) .ProcessorAffinity

따라서 CPU 4에서만 foo를 실행하려면 값을 다음과 같이 설정하십시오.

(Get-Process foo) .ProcessorAffinity = 8


나는 당신의 설명에서 말할 수 없습니다 : 이것은 기존 프로세스에만 적용됩니까? OP는 프로세스를 시작한 다음 선호도를 설정하지 않습니다. 그는 답변 에서와 같이 선호도가 이미 설정된 프로세스를 시작하려고합니다 start /affinity. 당신의 기술이 그렇게 할 수 있습니까? 그렇다면 어떻게 설명하십시오.
Scott

2
@Scott 기존 프로세스 만 해당됩니다. 당신이 제공하는 맥락에서, 내 대답은 도움이되지 않습니다. "프로세스의 모든 시작"은 프로세스를 시작한 다음 즉시 친 화성을 설정하는 문제라고 생각했습니다. IE : Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 그러나, 귀하의 의견을 읽고 Start-Process누락 된 선호도 플래그가있는 것을 발견 한 후 , 나는 다음을 테스트했습니다. [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

대안을 추가하기 위해 답을 편집하는 것이 좋습니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.