Questão Como cada núcleo da CPU pode processar um ou dois threads de uma só vez, como o SO fica estável mesmo se houver vários threads em execução?


Para explicar mais, suponha que tenhamos uma CPU dual core sem hyper-threading, isso significa que ela pode processar 2 threads de uma só vez, bem, suponha que tenhamos um aplicativo de rede executando dois threads de rede em segundo plano, cada um aguardando conexões de entrada para lidar, então esses segmentos devem estar sendo executados o tempo todo, agora, por que os processos e threads do outro SO ainda estão funcionando ?! como parece para mim, eles não podem ser processados ​​porque há dois encadeamentos que drenam completamente a unidade de processamento da CPU porque eles estão esperando por conexões de entrada de rede e, portanto, eles devem estar prontos a cada nanossegundo para conexões ... Como isso acontece e funciona? Como a CPU pode lidar com muitos e muitos threads de uma vez sem qualquer congelamento perceptível ?! (Eu sei, às vezes, o Windows fica lento e enlouquecido se houver muitos programas pesados ​​executados ao mesmo tempo, mas isso não é um problema geral)

Obrigado.


0


origem


Porque o sistema operacional lida com o agendamento - Ramhound


Respostas:


A resposta é relativamente simples: quando um thread está esperando por um evento de E / S, ele produz o restante de sua fatia de tempo para o SO, que pode então agendar outro thread. Quando a E / S de alta latência é concluída, o encadeamento é marcado como pronto para execução.

Isso é amplamente possível porque a maioria das E / S é gerenciada com interrupções em vez de verificar repetidamente para ver se a solicitação de E / S foi concluída (conhecida como polling).


5



Um encadeamento pode estar aguardando ou sendo executado, mas não ambos ao mesmo tempo. - David Schwartz
@DavidSchwartz Com E / S síncrona, em vez de escrever "está aguardando um evento de E / S, ele produz" Eu poderia ter escrito com mais precisão "solicita os próximos dados de E / S e permite que o sistema operacional reprograme o segmento até que mais dados sejam acessível". Mesmo com E / S assíncrona, o encadeamento ainda estaria esperando pela E / S, mas ainda estaria em execução enquanto aguardava (como um usuário aguardando um e-mail durante o uso do computador). (Uma função de retorno de chamada permitiria que um encadeamento processasse os novos dados o mais rápido possível, ou a pesquisa de granulação grosseira poderia ser usada, verificando novos dados após a conclusão de uma unidade de trabalho.) - Paul A. Clayton
Com o polling tradicional, um thread está aguardando (não necessariamente fazendo qualquer trabalho útil (semelhante ao spin lock), embora um loop de polling possa incluir um trabalho útil (não que um loop de espera de bloqueio não seja frio)). Com eventos gerenciados por hardware (como MONITOR / MWAIT do x86), um thread pode estar em execução (perspectiva do SO) e aguardando (perspectiva de hardware). Com o multithreading de hardware de granulação grossa, uma leitura de registro de E / S (que tradicionalmente não pode ser armazenada em cache) pode fazer com que o planejador de hardware troque de threads ainda da perspectiva do SO, ele ainda está em execução. - Paul A. Clayton


Se você usa multitarefa cooperativa e tem um programa ruim: então sim, você está certo.

No entanto, no mundo real, o seguinte deve acontecer:

  1. Multitarefa cooperativa: Eu não uso a CPU para sempre. Em vez disso, dará a chance a outro programa após algum tempo ou quando ele for bloqueado.
    A resposta de Paulo descreve o último.

  2. Multitarefa preemptiva (usada praticamente em qualquer lugar): O sistema operacional (não o programa) fornecerá a CPU por um curto período de tempo a um programa e, em seguida, o removerá. Isso pode ser tão simplista quanto a execução de um cronômetro e uma vez que expira interrompendo o processo e passando para o próximo nível / programa que está aguardando.


No seu caso, pense nisso como um escritório com dois trabalhadores e três (ou mais) tarefas. (Vamos chamá-los de tarefa-A, tarefa-B e tarefa-C).

O primeiro trabalhou verifica as ordens dos supervisores que afirmam:

  • Defina um temporizador 10 minutos. Quando ele parar, pare de trabalhar na sua tarefa atual, coloque-a na parte inferior da lista TODO e continue lendo este documento.
  • Em seguida, remova o primeiro item do topo da lista TODO e comece a trabalhar nele.
  • Repetir.

Trabalhador 1 define o temporizador e obtém a primeira tarefa da lista TODO (neste caso, tarefa-A).

Trabalhador 2 faz a mesma coisa: define um temporizador e obtém o que está agora no topo da lista TODO. Como o trabalhador 1 removeu a tarefa A do trabalhador 2, agora inicia a tarefa B.

Dez minutos depois, o timer se apaga. O trabalhador 1 pára de trabalhar na tarefa A e recebe as instruções dos supervisores. Esses estados colocam a tarefa atual na parte inferior da lista TODO. Continuando as instruções do supervisor, ele agora reinicia o temporizador e começa a trabalhar no que está agora no topo da lista TODO (que é tarefa-C).

Trabalhador 2 faz o mesmo e pára a tarefa B e começa com o topo da lista TODO (que no exemplo é tarefa-A)

Etc etc..

Isso é um pouco simplificado. Mas isso deve lhe dar uma ideia de como dois passos (trabalhadores) podem trabalhar 100% do tempo em três ou mais tarefas.

Em agendadores reais, há muitas outras coisas. Por exemplo. interrupções (compare com um telefone tocando no meio de uma tarefa e como lidar com isso), agendamento inteligente (dar a mesma tarefa para o mesmo trabalhador provavelmente resultará em uma conclusão mais rápida, já que o trabalhador já está familiarizado com ela), E / S (se um trabalhador precisar de um livro de uma biblioteca, ele não esperará até que o temporizador expire, mas continuará imediatamente com a próxima tarefa, etc. etc.


2





O sistema operacional permanece estável praticamente da mesma maneira que se mantém estável quando há vários segmentos sendo executados em diferentes CPUs. Do lado de fora do núcleo da CPU, há muito pouca diferença aparente no comportamento entre dois LPs no mesmo núcleo e um LP em cada um dos dois núcleos diferentes. Todas as mesmas técnicas de programação "multiprocessador-seguro", como semáforos, devem ser usadas em ambos os casos.


0