Pergunta

Eu tenho um programa que eu gostaria de executar em apenas uma CPU para que ele não ocupar muito os recursos do sistema. O problema é, ele faz uma chamada para um DLL externo que usa automaticamente todos os núcleos de CPU disponíveis. Eu não tenho o código fonte para a DLL externa. Como posso limitar a DLL para usar apenas uma CPU?

EDIT: Obrigado pela ajuda, aqui é o código que usei para limite a uma CPU (Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

EDIT: Acontece solução de definir a prioridade do processo de Brannon funciona ainda melhor para o que eu quero, que é a de manter o processo de mastigar os recursos. Aqui está o código (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
Foi útil?

Solução

Definir afinidade do processador é a abordagem errada. Deixe o agendamento alça OS.

Se a máquina está ocioso, você quer usar tanto processador que puder. Caso contrário, você está fazendo menos trabalho para nenhuma razão. Se a máquina estiver ocupada, então você quiser fazer uso de ciclos "livres" e não afetar negativamente outros processos.

O Windows tem essa funcionalidade embutida. A solução adequada para isso é para definir a prioridade base do processo.

http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx para obter detalhes sobre SetPriorityClass().

Se você quer testar este sem escrever qualquer código, use Task Manager para alterar a prioridade do seu processo.

Outras dicas

Você pode definir a afinidade da CPU do seu programa. Experimente o SetProcessAffinityMask função no Windows ou sched_setaffinity no Linux.

Normalmente, uma DLL vidas no mesmo espaço fio / memória como o código que o chama. O ato de chamar uma DLL em si não deve criar tópicos. Se chamar a DLL parece criar mais threads, o que significa que a própria DLL está criando os tópicos em algum lugar no seu código. Se você não tem qualquer código-fonte ou documentação para o DLL, não há muito que você possa fazer sobre isso (e se você quiser a DLL para fazer o seu trabalho, não há muito que você deve fazer sobre isso).

Você pode tentar jogar com a prioridade de sua aplicação - definindo-o para baixo pode mudar o uso da CPU, mesmo que isso não muda o que tópicos são criados. Mas parece provável que o que você realmente quer é obter documentação para esta besta. Sem saber como código funciona, em geral, não há muito que você pode fazer para mudar a forma como ele funciona. Não super-gênio pode mudar isso.

Er ...... por quê? Sério, por que você iria limitar uma biblioteca que é capaz de dar-lhe um desempenho adicional na forma de um? Você está tentando acessar um recurso compartilhado ou algo assim? Alguém poderia pensar que uma biblioteca multi-tarefa seria capaz de lidar com isso com segurança.

A menos que haja algo que você não está mencionar, eu não posso ver qualquer razão válida, mesmo para tentando para limitar uma biblioteca multi-tarefa para um único segmento.

Assim, o programa utiliza um fio, mas você não quer que o DLL externo para usar mais de um thread? Você não tem muito controle sobre o que a DLL externa faz, mas algumas abordagens podem ser:

Você não disse que plataforma isto é para. Eu vou assumir janelas aqui.

Criar o processo filho e associá-lo com um Job objeto . Você pode, então, definir a afinidade do processador para que objeto de trabalho para incluir apenas um dos núcleos de CPU disponíveis. O processo de criança não é capaz de mudar a máscara de afinidade para qualquer coisa que não é um subconjunto da afinidade do processador para o objeto de trabalho. Além disso, você deve se lembrar de não definir o JOB_OBJECT_LIMIT_BREAKAWAY_OK limite ou o JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK limite estendida no trabalho ou então o processo filho vai ser capaz de sair do trabalho.

Além disso, você pode definir a prioridade e classe de agendamento para o trabalho. Talvez seja suficiente para criar o processo filho em um nível de prioridade IO CPU inferior e / ou?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top