Para compreender o que está acontecendo em ambos os computadores e identificar o problema que está ocorrendo na aplicação, responda as questões a seguir:
a) Com base nas observações do gerenciador de tarefas e nos conhecimentos adquiridos sobre processos e seus estados, este problema pode ser causado por um excesso de chamadas de E/S realizadas pela aplicação? Justifique sua resposta.
b) Por que em um dos computadores o consumo de CPU chega a 100% e inviabiliza o uso da interface gráfica do sistema operacional, e no outro computador a mesma aplicação aparenta usar menos processamento e o sistema continua usável, ainda que a aplicação em si esteja quase travada?
c) Qual tipo de erro, a nível de código, pode estar causando este problema? Justifique sua resposta.
Soluções para a tarefa
Resposta:
a) Já que o gerenciador de tarefas está mostrando que o processo está sendo executado, seu estado não está sendo bloqueado. Isso indica que a aplicação está realizando muitos processamentos, mas não há muita espera por resposta de dispositivos de Entrada e Saída. Com base nessas observações, é possível afirmar que o excesso de chamadas de E/S não é responsável pelo problema da aplicação.
b) O computador que chega a 100% de uso da CPU só tem um núcleo. Como apenas um processo por núcleo pode ser executado de cada vez, e o processo da aplicação está consumindo muitos ciclos de processamento, não está deixando tempo livre para que outros processos que precisam rodar no sistema operacional, inclusive os que gerenciam a própria interface gráfica do sistema operacional, tenham sua vez. O outro computador tem quatro núcleos, então o processo da aplicação está consumindo quase 100% de um único núcleo, mas ainda há três que podem executar outros processos, logo, do total de ciclos disponíveis na máquina, o processo da aplicação está consumindo no máximo 25%.
c) Como o processo executa sem parar, chegando a travar um computador com um único núcleo, e mesmo no outro ele não termina e a possibilidade de ser um problema de E/S foi excluída, os desenvolvedores devem suspeitar de problemas em laços que por algum motivo não estejam sendo terminados, entrando numa situação de loop infinito.
Se a aplicação está sendo desenvolvida em uma linguagem cujo compilador efetue otimização de chamada de cauda, o problema também pode ser em uma recursão efetuada no fim do próprio método, já que este tipo de otimização removeria a possibilidade de ocorrer um erro de estouro de pilha e permitiria que a aplicação, ao executar, tivesse o comportamento observado.