Como limitar um processo a um único núcleo da CPU?

30

Como você limita um programa de processo único executado em um ambiente Windows para ser executado apenas em uma única CPU em uma máquina com vários núcleos?

É o mesmo entre um programa em janelas e um programa de linha de comando?

ATUALIZAÇÃO:

  • Razão para fazer isso: comparando vários aspectos das linguagens de programação
  • Eu preciso de algo que funcione desde o início do processo, portanto a resposta do @akseli, embora ótima para outros casos, não resolve meu caso
por Jonathan 12.07.2011 / 15:20

6 respostas

27

Se você estiver executando o Windows Vista / 7 (possivelmente XP, mas não seguro), é realmente muito simples.

Digite: Control+Shift+Esc para ativar seu gerenciador de tarefas.

Clique na guia Processos

Encontre o processo que precisa da afinidade do processador alterado

Clique com o botão direito do mouse no processo

Clique em "Definir afinidade"

Aqui você pode selecionar qual processador (s) seu processo usará.

Boa sorte!

EDIT: Você tem que ser administrador para fazer isso funcionar.

    
por 12.07.2011 / 15:24
19

da linha de comando, use

start /affinity 1 program.exe

isso executará o program.exe na primeira CPU, pois "1" é o valor hexadecimal da máscara de afinidade

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 
    
por 12.07.2011 / 16:45
7

Depende do que você está disposto a fazer:

Método 1: sob demanda

Use ImageCFG . Este utilitário permite configurar um executável para ser executado em qualquer número de núcleos. Certifique-se de fazer backup de seu executável de destino antes de fazer as alterações e restaurá-lo quando terminar de jogar com ele.

Método 2: forçar uma sessão inteira do Windows (Vista / 7)

  1. Digite bcdedit /set onecpu on em um prompt de comando
  2. Reinicialize o sistema.
  3. Quando terminar de tocar, digite 2 - Digite: bcdedit /set onecpu off e reinicie novamente.

Método 2: forçar uma sessão inteira do Windows (XP)

  1. Abra o arquivo boot.ini (clique com o botão direito em Meu computador - > Propriedades - > guia Avançado - > botão Configurações em "Inicialização e recuperação" - > botão Editar em "Inicialização do sistema").
  2. Você encontrará a seguinte seção (ou semelhante) no arquivo:

    [sistemas operacionais]

    multi (0) disco (0) partição rdisk (0) (2) \ WINDOWS="Microsoft Windows XP Professional" / fastdetect

  3. Altere-o adicionando o sinalizador / onecpu:

    [sistemas operacionais]

    multi (0) disco (0) partição rdisk (0) (2) \ WINDOWS="Microsoft Windows XP Professional" / detecção rápida / onecpu

  4. Reinicie. Quando terminar de jogar, remova a bandeira e reinicie novamente.

Método 0: Não é um bom método (Afinidade do processador)

Qualquer coisa que de outra forma envolva afinidade de processador não é uma boa opção, receio. A afinidade do processador é uma pista para o processador. O processador não é obrigado a respeitá-lo e muitas vezes não o fará.

    
por 12.07.2011 / 16:56
4

Eu coloquei a seguinte função no meu programa em python 2.6 e ele chama as funções do windows. Minha máquina tem apenas dois núcleos, então você pode precisar alterar essa parte. Os comentários informam como ver qual é a afinidade atual. Ele funciona "como está" para uma máquina de núcleo único, se você definir ou usar como padrão uma máscara de 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
    
por 15.12.2012 / 23:26
4

No Windows 8, você precisa ir até a guia Detalhes do gerenciador de tarefas para definir Afinidade de conjunto. Não lhe dá a opção no separador Processos.

EDIT: Além disso, se o programa que você deseja iniciar tem parâmetros, este thread pode ser útil: Como iniciar um programa com argumentos de linha de comando no Windows 'cmd com o comando' start '?

    
por 18.02.2013 / 06:11
4

Enquanto procurava informações muito semelhantes usando o PowerShell, encontrei as informações de que precisava aqui: link

Você não mencionou qual sistema operacional Windows estava usando (os mais antigos não vieram com o PowerShell, embora você possa instalá-lo se não estiver lá).

O mais rápido, é que no PowerShell, a afinidade do processo é simplesmente uma propriedade que você pode alterar facilmente.

Para ver as propriedades (e outras informações) do seu processo (usando foo como um processo de exemplo), o comando do PowerShell seria:

Get-Process foo | Get-Member

Você verá ProcessorAffinity é uma dessas propriedades. Mudá-lo é trivial e você pode selecionar em qual núcleo você quer rodar, usando os valores da tabela / link do Revolter acima.

Para ver qual é o valor da propriedade ProcessorAffinity para foo, aqui está o comando:

(Get-Process foo).ProcessorAffinity

Então, se você quisesse executar o foo somente na cpu 4, você definiria o valor como tal:

(Get-Process foo).ProcessorAffinity=8

    
por 24.07.2013 / 00:45