Por que a priorização de processos não produz uma melhoria de velocidade?

18

Eu tenho 2 aplicativos que estão usando muitos recursos do sistema. Quando diminuo a prioridade de um no Gerenciador de Tarefas, enquanto aumenta o outro, não percebo nenhuma melhora significativa na velocidade do aplicativo com a prioridade mais alta.

Por que é isso? Há mais coisas acontecendo ou mais que precisam ser feitas?

Moisés
fonte
6
É como a vida real. Se você tem uma prioridade mais alta para entrar em um avião do que outro passageiro, isso não significa que o voo levará menos tempo para você!
Mehrdad 13/05

Respostas:

28

A prioridade não ajuda quando o gargalo é a própria CPU. A prioridade realmente afeta o algoritmo de agendamento que o sistema operacional usa para determinar qual processo será executado a seguir, pois não há processadores suficientes na maioria dos sistemas para executar todos os processos continuamente.

Uma tarefa de prioridade mais alta chegará ao topo da fila mais rapidamente, portanto, isso ajudará na latência geral, mas se o processo estiver esgotando o intervalo de tempo inteiro, ele será alocado no cálculo real, o planejamento não mudará nada lá. Alterar a prioridade é mais útil quando você tem um processo aguardando E / S e deseja que ele seja mais responsivo.

Andon M. Coleman
fonte
5
A prioridade ajuda quando o gargalo é muitos threads que podem ser executados. Os threads de prioridade mais alta no Windows que permanecem executáveis ​​no final do intervalo de tempo terão outra chance de executar, de preferência em um thread de prioridade mais baixa (o Windows tenta não passar fome por threads de baixa prioridade e ocasionalmente os aumenta). A prioridade tem pouco efeito nos encadeamentos que aguardam E / S - o Windows aumenta temporariamente a prioridade de um encadeamento após a conclusão de uma E / S, dependendo do tipo de E / S em que estava aguardando.
Mike Dimmick
4

Prioridade é o tempo da CPU. Todos os núcleos são 100% utilizados o tempo todo? Caso contrário, a prioridade não teria efeito. Muitas vezes, a CPU não é o gargalo e são recursos de memória, disco ou GPU.

Jason
fonte
3

A prioridade importa apenas quando há mais threads executáveis ​​do que os núcleos de CPU disponíveis. Quando isso acontece, a prioridade controla quais threads são executados. Na maioria dos sistemas, não há computação suficiente acontecendo para qualquer contenção na CPU: os threads estão todos bloqueados , esperando que algo aconteça. Isso pode estar esperando você digitar alguma coisa, mover o mouse, tocar na tela ou chegar dados a partir do disco, da rede, de algum outro dispositivo conectado ou de outro segmento concluir o trabalho em dados críticos estrutura. Pode estar aguardando que parte do programa seja lida no disco ou em alguma memória que foi trocada para ser lida novamente, em vez de ler explicitamente um arquivo.

No Windows, o planejador mantém uma fila de threads executáveis em cada nível de prioridade. Quando toma uma decisão de agendamento - que um encadeamento tenha esgotado seu quantum (tempo permitido antes que outra coisa precise ser executada), o que significa que outro encadeamento deve ter uma curva, ou o encadeamento foi bloqueado e não pode mais ser executável ou uma prioridade mais alta o encadeamento foi desbloqueado - o próximo encadeamento na fila no nível de prioridade máxima com qualquer encadeamento executável será agendado. Se o encadeamento em execução esgotou seu quantum, ele será colocado no final da fila. Se for o único encadeamento em seu nível de prioridade que pode ser executado e não houver outros encadeamentos de alta prioridade, mas não em execução, ele terá outra chance.

Nos sistemas multicore / multiprocessador, pode haver restrições sobre os núcleos nos quais um thread pode executar. Além disso, o sistema tenta manter os encadeamentos no núcleo ideal e dentro do nó NUMA, para que os dados do encadeamento provavelmente ainda estejam no cache desse núcleo e tenham acesso rápido aos dados criados. Os threads ainda serão executados em núcleos não ideais, se não houver escolha do que executar em seguida.

O sistema utiliza vários reforços de prioridade dinâmica e tamanhos quânticos dinâmicos para que o aplicativo em primeiro plano obtenha mais tempo (se necessário) do que os processos em segundo plano e para que os processos possam reagir rapidamente quando as operações de E / S forem concluídas (incluindo mouse, teclado e entrada na tela de toque). Além disso, o aumento de prioridade é usado para contornar inversões de prioridade, onde um encadeamento de alta prioridade aguarda um recurso que um encadeamento de baixa prioridade está mantendo no momento. Se também houver um encadeamento de prioridade média em execução, ele deixará de lado o encadeamento de baixa prioridade do tempo do processador, mantendo o encadeamento de alta prioridade. Portanto, o encadeamento de baixa prioridade é temporariamente aumentado para o de maior prioridade, assim obtém tempo e, esperançosamente, libera o recurso necessário ao encadeamento de alta prioridade.

Antes do Windows Vista, a prioridade do encadeamento não tinha efeito na rapidez com que as operações de E / S eram concluídas. Desde o Windows Vista, as E / Ss também podem ter uma prioridade, que por padrão vem da prioridade do encadeamento.

Resumo: você não verá nenhum efeito de alterar as prioridades de encadeamento, a menos que sua CPU esteja muito carregada, e mesmo assim o efeito será mínimo. Se o processo tiver que esperar por E / S ou não estiver disputando outros processos pelo tempo da CPU, ele já estará executando o mais rápido possível e a alteração da prioridade não o tornará mais rápido.

Mike Dimmick
fonte
0

Em geral, é necessário um esforço extra para fazer um programa usar mais de uma CPU (adicionando multi-threading). Portanto, mesmo que o programa tenha a maior prioridade disponível, ele pode estar usando apenas um núcleo.

Outros possíveis problemas:

  • O programa pode ser ineficiente / mal escrito
  • Pode ser mais lento devido ao acesso "lento" ao disco ou a uma rede lenta
Jon Onstott
fonte
0

Mesmo aumentar a prioridade de E / S de um processo vinculado a E / S não necessariamente fará com que ele seja executado mais rapidamente. Por exemplo, se é um consumidor de dados produzidos por um processo separado, possivelmente remoto, e está acompanhando a taxa pela qual essa fonte produz os dados, não pode ir mais rápido ou ter uma taxa de transferência mais alta.

Ao contrário do que é categoricamente declarado na primeira frase da resposta atualmente aceita ( /superuser//a/752587/322588 ), as alterações de prioridade são mais eficazes quando a CPU é o gargalo, conforme explicado na resposta de Mike Dimmick ( /superuser//a/752864/322588 ). Além disso, a afirmação no segundo parágrafo da resposta aceita, "se o seu processo está esgotando toda a fatia de tempo, é alocado no cálculo real, então o agendamento não vai mudar nada lá" está completamente errado, a menos que o processo já tenha geralmente a maior prioridade de todas threads executáveis ​​sempre que estiver aguardando a execução. Isso ocorre porque, em todas as outras circunstâncias, é provável que aumentar a prioridade obtenha mais timeslices por intervalo de relógio de parede.

Mike Dimmick apontou os problemas com esta resposta há alguns dias e forneceu uma resposta muito melhor, mas a primeira inexplicavelmente continua a ganhar votos. A alegação de seu autor de que ele está apenas emburrecendo sua resposta para nós, manequins, não é plausível, porque não é apenas simples, ou mesmo simplista, é completamente errada, pelo menos no que diz respeito aos processos ligados à CPU.

Disclaimer: Eu não conheço o Sr. Dimmick, embora eu possa dizer que ele sabe sobre o que está escrevendo.

Sdenham
fonte
Talvez você tenha entendido mal; a pergunta era sobre processos rodando mais rápido. Os processos ligados à CPU esgotam toda a sua unidade de agendamento (quantum) e depois entram em uma fila de processos prontos no final. Em um sistema operacional de desktop como o Windows, isso significa que o processo tem chances de 1 / quantum-Hz para executar a cada segundo. Alterar a prioridade (geralmente) não altera a duração de seus horários. Sempre será necessário o mesmo número de quanta de agendamento para ser concluído. Fundamentalmente , é assim que o Windows realmente mede o tempo de execução do processo: número de quanta agendados.
Andon M. Coleman
O processo pode terminar mais cedo, mas ainda foi executado para o mesmo número de unidades de agendamento. Quando um processo vinculado à E / S se coloca na lista de espera, ele pode ter uma segunda chance de executar e antecipar um processo em execução com uma prioridade mais baixa antes que seu quantum expire se sua operação de E / S for concluída. Os processos ligados à CPU não têm essa liberdade, esgotam todo o tempo e depois entram em uma fila pronta. Ele é possível para eles a correr logo depois se eles têm uma prioridade bastante alta, mas que não tem nada a ver com a forma como o Windows mede o tempo de execução.
Andon M. Coleman
A prioridade em um processo vinculado de E / S em espera é fundamentalmente diferente e pode ter um impacto mensurável no tempo de execução relatado no Windows. Novamente, o Windows mede o tempo de execução como o número de quanta que expirou (mesmo que um processo gaste 1 ms de um quantum de 10 ms realmente em execução e, em seguida, espere voluntariamente os 9 ms restantes por E / S, o kernel do Windows conta como 10 ms no valor de do tempo de execução no modo de usuário). A preempção pode ajudar os aplicativos vinculados de E / S a levar menos quanta para concluir. Outros kernels (por exemplo, Linux) podem medir corretamente quanta parcial no tempo de execução do processo, mas o Windows não.
Andon M. Coleman
@ AndonM.Coleman A partir do Vista e posterior, sim, ele pode e funciona.
Jamie Hanrahan
@JamieHanrahan: Bem, você sempre pode ligar timeBeginPeriod (...), o que qualquer coisa interativa já faz. Um jogo normalmente define isso como 1 quando é iniciado, e isso aplica um intervalo de agendamento de 1 ms em todo o tabuleiro para tudo que estiver sendo executado no sistema. Não está isolado apenas do processo que o fez. É parte do motivo pelo qual é difícil levar o Windows a sério para realizar várias tarefas.
Andon M. Coleman