Essa é uma pergunta genérica que eu sempre quis saber.
Em geral, é intensivo para uma CPU criar threads que executam loops "embora não sejam verdadeiros ..." ou similares?
Por exemplo, suponha que eu faça:
// pseudo-code
new Thread(function() {
while (!useHasDoneSomething) {
// do nothing...
}
alert("you did something!");
}
Portanto, é apenas um pedaço de código executado em um encadeamento que espera que algo aconteça.
Por alguma razão, imagino que isso pressionaria a CPU. Afinal, mesmo que seja apenas um pequeno loop, ele é executado novamente no instante em que um ciclo é concluído. Isso não significa que ele está passando pelo ciclo muitas vezes por milissegundo? ... Por nanossegundo !?
O sistema operacional "manipula" o programa e os threads, certo? Mas isso ainda dá muita atenção à execução de um loop. Se a CPU não tiver mais nada a fazer, ela não se concentrará apenas nesse loop, consumindo , assim, todo o tempo ocioso ?
E se eu criar 1000 threads que todos façam o mesmo loop? Como isso pode afetar os ciclos de desempenho / CPU?
Além disso, é assim que os eventos funcionam internamente? Quando você está 'ouvindo' um evento em Java, .NET, Javascript etc. (como pressionar um botão ou redimensionar uma janela), foi criado um encadeamento em loop?
fonte
Respostas:
Sim. O uso desse loop é chamado de espera ocupada e é chamado por um motivo. Esses loops ocupados verificam a condição com a maior frequência e rapidez que o processador pode gerenciá-la, com o resultado de que, se você permanecer no loop por tempo suficiente, a carga do processador será confiável para 100%.
Ele só cria mais trabalho para a CPU fazer anotações.
Não. Os loops ocupados são uma forma de pesquisa e também muito ineficiente. Os sistemas operacionais possuem outros mecanismos para detectar a ocorrência de um evento (por exemplo, uma interrupção ou uma chamada específica) e possuem mecanismos para permitir que um encadeamento o aguarde sem consumir tempo da CPU. Esses mecanismos também serão usados para implementar os mecanismos de eventos de linguagens como Java.
fonte
Seu instinto está correto. A espera ocupada assim é descrita como
Em vez disso, considere uma primitiva de controle de simultaneidade que permita que o encadeamento fique realmente ocioso até que ele tenha um trabalho útil a ser feito, por exemplo, um semáforo ou uma variável de condição :
fonte
if (!useHasDoneSomething)
várias vezes, o mais rápido possível). Mesmo que você não se importe com isso em seu programa, perde tempo que outros programas poderiam usar para executar. Mas mesmo dentro do seu programa, um garçom ocupado perde tempo que pode ser atribuído a algum encadeamento de trabalho (caso não haja núcleos suficientes disponíveis para que todos os encadeamentos sejam executados simultaneamente).Os encadeamentos devem aguardar eventos de entrada, não alterações de variáveis.
Eventos de entrada são semáforos disponíveis, filas de mensagens não estão vazias ou tempo decorrido:
Do ponto de vista do encadeamento, essas chamadas de função estão bloqueando: o encadeamento aguarda até o evento chegar, deixando a carga da CPU em outros encadeamentos.
Do ponto de vista do sistema, o encadeamento está marcado como 'Aguardando evento' e não será agendado enquanto o evento não ocorrer.
Sobre os eventos de hardware, eles são tratados através de interrupções, que são sinais elétricos para a CPU e que acionam a execução do ISR (rotinas de serviço de interrupção), cuja função é produzir um evento de software em semáforos, filas de mensagens ou tempo.
fonte
A
//do nothing
parte dentro da condição no cenário normal é WAIT em algum semáforo, ou em outros termos SLEEP. Durma até que alguma interrupção o acorde. E, portanto, o encadeamento entra em "estado de suspensão" ou digamos "estado de não execução". Somente os processos que estão no estado de execução consomem CPU. O processo de estado de suspensão não consumirá CPU. Eles podem estar consumindo memória, mas essa memória será trocada internamente pelo sistema de memória virtual. Portanto, mesmo se você criar 1000 desses threads, eles não apresentarão muita ameaça ao seu sistema.fonte