Como o multithread funciona quando o hardware tem 4 núcleos e o aplicativo de software tem mais de 4 threads

0

Digamos que eu tenha um processador com 4 núcleos e 4 encadeamentos e um aplicativo com 20 encadeamentos que eu precise deles para fazer verificações constantes (digamos que sejam eventos), como o processador executa todos os encadeamentos ao mesmo tempo com seus quantidade limitada de tópicos? Eu sei que o processador muda entre um thread e o outro e, como as mudanças são tão rápidas, não as notamos, mas é tudo o que acontece ou o computador faz outra coisa. Além disso, como o computador salva as informações de cada thread em um determinado momento, apenas na memória RAM?

    
por Angelixus 08.10.2018 / 04:41

2 respostas

2

20 segmentos não podem ser executados precisamente ao mesmo tempo, exceto em um sistema com 20 ou mais núcleos. O que o sistema pode fazer é parecer que eles estão sendo executados muito próximos de serem ao mesmo tempo.

É para isso que o agendador do sistema operacional serve.

Antes do tempo dos processadores multi-core, o sistema operacional tinha que compartilhar o tempo de CPU entre vários processos, cada um deles com o potencial de ter vários threads distintos.

O sistema operacional deve gerenciar cada thread, alocando-o por um período de tempo na CPU, restaurando o estado, executando o thread, suspendendo e salvando o estado. Nada disso é muito diferente entre multi-core, multi-CPU ou single-core.

O que mudou foi o nível de complexidade e o número de coisas que podem ser programadas para serem executadas ao mesmo tempo. Onde só podemos executar um thread de cada vez, podemos agora executar quatro. O mesmo processo de controlar o estado do encadeamento acontece (contador de programa, etc) e não importa quantos encadeamentos um programa tenha.

O sistema operacional tentará agendar todos os threads razoavelmente na CPU, dependendo se eles têm trabalho a fazer (pode estar aguardando uma interrupção de hardware ou alguns dados do disco), qual a prioridade do processo / thread é e uma série de outras coisas. Threads podem notificar o sistema operacional que eles não têm trabalho a fazer até que vários eventos ocorram e que podem ser para baixo para o tempo, eventos de hardware ou software e assim por diante. Nesse caso, o agendador do sistema operacional pode simplesmente pular esse encadeamento até encontrar um encadeamento pronto para fazer algum trabalho.

No momento em que o sistema que estou usando está relatando que existem 2.500 threads em todos os processos em execução, obviamente seria impossível que todos eles estivessem rodando simultaneamente em um processador de 4 núcleos.

    
por 08.10.2018 / 10:14
0

Primeiro: uma CPU não "tem" threads, apesar do que o marketing tenta reivindicar. Uma CPU pode ser executada até o número indicado de threads ao mesmo tempo. Especificamente, uma CPU com núcleos n e hyperthreading não ativados podem executar encadeamentos n . Uma CPU com núcleos n e hyperthreading ativado pode executar 2_n_ threads. Em contextos técnicos, nos referimos a "o que pode executar um thread" como um processador lógico , ou LP. Uma máquina sem HT habilitado tem um LP por núcleo; HT dá dois.

Um sistema Windows típico possui centenas grandes ou mesmo pequenos milhares de segmentos, totais, de uma só vez. Isso depende do código de cada programa individual para decidir. Quando você cria um processo, esse processo sempre começa com um thread. Alguns programas simples, particularmente programas de linha de comando (modo de caractere), podem usar apenas um thread. Mas o código em execução nesse primeiro segmento pode criar outros segmentos, e os esses segmentos podem criar outros segmentos, e assim por diante, quase sem um limite prático. Há boas razões para não simplesmente criar um grande número de threads, mas não há nada que torne impossível criar muito mais threads do que se poderia usar.

(No x86, com os valores padrão para o tamanho da pilha do encadeamento, há um limite de aproximadamente 2000 encadeamentos por processo - imposto pelo limite do espaço de endereço.)

Na guia Detalhes do Gerenciador de Tarefas, você pode ativar a coluna Threads, que informará quantos threads estão em cada processo no momento. Aqui está um comando do PowerShell que contará todos os segmentos em seu sistema:

($threads = get-ciminstance win32_thread).count
3437

Isto está em uma máquina com quatro núcleos hyperthreaded, total de oito LPs.

Isso não é um problema porque apenas alguns desses segmentos realmente querem ser executados a qualquer momento. A maioria dos threads na maioria dos processos passou a maior parte do tempo no que o Windows chama de estado de "espera", o que significa que eles não querem ou não podem usar o tempo de CPU no momento. Eles estão esperando por E / S (talvez rede, talvez disco, etc.) para completar, eles estão esperando por entrada do usuário, eles estão esperando por algum outro segmento para liberar um recurso que eles precisam acessar, etc. * Sistemas derivados de nix chamam isso de "bloqueado".)

Se você quiser o número de segmentos Aguardando, tente isto:

PS C:\Users\jeh> ($threads = get-ciminstance win32_thread | where-object -Property ThreadState -EQ 5).count
3427

Parece que há apenas 10 tópicos tentando usar os LPs no momento. Mas é ainda melhor que isso. Com 8 LPs, 8 desses encadeamentos são os encadeamentos inativos do sistema. Há um thread ocioso dedicado a cada LP. Eles estão sempre prontos para correr, mas eles só funcionam se nada mais quiser no LP. Então, no momento em que fiz os comandos acima, havia apenas dois threads "reais" que queriam fazer o trabalho. As atividades dos encadeamentos inativos não são incluídas nas exibições de gráfico de linha do Gerenciador de Tarefas de utilização da CPU.

n.b .: Esses números não são muito precisos porque essas operações do Powershell e do WMI não são sincronizadas internamente com as funções do sistema operacional. Mas eles são facilmente próximos o suficiente para ilustrar o ponto.

Se houver mais encadeamentos (além dos encadeamentos inativos) "Prontos" do que LPs, o agendador, em geral, selecionará os encadeamentos nLPs de maior prioridade - sujeito a alguns ajustes de acordo com quem correu em que CPUs recentemente. Se houver vários encadeamentos com a mesma prioridade, eles poderão ser "divididos em tempo", sendo executados de forma "round-robin", cada um podendo ser executado por 20 ou 60 ms antes que o agendador faça o switch LP para outro.

Aqui é uma resposta que eu dei, que entra em muito mais detalhes sobre como as prioridades de thread funcionam no Windows.

    
por 24.10.2018 / 17:49

Tags