Como funciona a multitarefa


15

Sou completamente ignorante sobre o funcionamento interno de um sistema operacional, mas posso mais ou menos adivinhar o comportamento aproximado de muitas funções. Uma coisa que não consigo descobrir é a multitarefa.

Em teoria, o sistema operacional gerencia o tempo, de acordo com a CPU por pequenos intervalos, de acordo com os vários programas em execução. Mas não está claro como isso realmente funciona.

Digamos que o sistema operacional queira iniciar meu programa. O código da máquina é carregado em algum lugar da RAM, iniciando em um determinado endereço. Acho que um salto deve ser realizado nesse endereço, permitindo que meu código seja executado. Mas dessa maneira, o sistema operacional não pode recuperar o controle até eu voltar.

Basicamente, posso imaginar apenas duas maneiras de fazer isso funcionar, mas nenhuma delas parece realmente adequada:

  • O sistema operacional pode ler as instruções da máquina que eu quero executar e emulá-las, em vez de executá-las diretamente. Sou intencionalmente vago, pois não sei como isso funcionaria, mas parece que isso atrasaria consideravelmente o programa.

  • Como alternativa, o sistema operacional pode esperar até eu fazer uma chamada do sistema. Nesse momento, ele recupera o controle e pode verificar há quanto tempo estou correndo e fazer suas coisas de compartilhamento de tempo. Isso pode funcionar, mas parece não confiável, pois eu poderia fazer um cálculo longo que não envolve chamadas do sistema e travar tudo por um tempo.

Portanto, parece que nenhum dos mecanismos funcionaria muito bem. Como a multitarefa é realmente executada?


Embora seu palpite não esteja exatamente correto, o problema que você aponta é: bem, sim: "Eu poderia fazer um cálculo longo que não envolva chamadas de sistema e travar tudo por um tempo".
Jhocking

Uma palavra-chave para procurar:interrupt
SK-logic

Sim, mas quem está iniciando a interrupção? Se meu código estiver em execução, o sistema operacional não terá como executar uma INTinstrução. Algo ainda é um mistério para mim
Andrea

@ Andrea, o relógio harware está provocando uma interrupção. Tão simples quanto isso. pt.wikipedia.org/wiki/Scheduling_%28computing%29
SK-logic

Ok, agora eu vejo. Portanto, se eu entendi direito, é um recurso baseado em hardware, e não algo que se possa implementar no sistema operacional.
Andrea

Respostas:


21

O sistema operacional programa um cronômetro para acionar a cada poucos microssegundos (ou milissegundos, dependendo da velocidade do sistema). Esse timer aumenta a interrupção do hardware, o que faz com que a CPU pare o que está fazendo no momento, despeje todo o seu conteúdo na pilha e processe a rotina de interrupção indicada pelo endereço fornecido pelo controlador de interrupção. Essa rotina pode inspecionar a pilha e várias outras variáveis ​​para tomar uma decisão sobre qual processo em execução deve ser novamente colocado em ação. Se for o mesmo processo, a rotina de interrupção simplesmente retorna. Se for diferente, as partes relevantes da pilha são salvas e substituídas pelo conteúdo de um processo interrompido anteriormente; portanto, quando a rotina de interrupção retornar, esse processo continuará. Além do fato de que já passou algum tempo,

Esta é (para CPUs modernas) uma versão MUITO MUITO simplificada do que acontece, mas explica o princípio. Além dessas interrupções controladas pelo sistema operacional, também existem interrupções causadas por eventos externos (mouse, teclado, portas seriais, portas de rede etc.) que são processados ​​com rotinas de interrupção separadas, geralmente conectadas aos manipuladores de eventos.

Muitas vezes, a alternância de processos / tarefas / contextos também se baseia na disponibilidade de recursos externos. Normalmente, um processo que requer dados do armazenamento (ou seja, não na RAM) coloca a solicitação em uma fila, define um manipulador de eventos para a interrupção do hardware, indicando que a solicitação foi atendida e renuncia ao controle do agendador de tarefas (já que não há ponto de espera). Novamente, uma descrição muito simplificada do que realmente acontece, mas deve servir aos propósitos desta resposta.


5

Varia de sistema para sistema.

Nos sistemas multitarefa não-preventivos (como o Oberon original ou o Apple Macintosh original), o sistema operacional "pesquisa" periodicamente todas as tarefas, dando-lhes a oportunidade de trabalhar. Espera-se que as tarefas joguem bem juntas. Se eles tiverem um pouco de trabalho a fazer, eles o fazem e retornam ao sistema operacional. Se uma tarefa tem um pedaço GRANDE para executar, espera-se que ele seja dividido em pequenos pedaços e trabalhe um pequeno pedaço cada vez que for pesquisado.

Interrupções de hardware (conclusões de DMA da unidade de disco, interrupções de porta serial, o que você tem) fazem com que rotinas de interrupção sejam executadas. Essas rotinas de interrupção podem, por sua vez, notificar as tarefas do trabalho a serem executadas quando a próxima tarefa for executada.

Nos sistemas multitarefa não preventivos, a ocorrência ou não ocorrência de uma interrupção não afeta a tarefa em execução após a conclusão da rotina de interrupção.

Em sistemas multitarefas preemptivos, é possível que uma rotina de interrupção force uma alteração no agendamento. Em um sistema multitarefa preventivo round-robin tradicional, uma interrupção periódica do timer faz exatamente isso. A interrupção do timer é acionada, a rotina de interrupção do timer faz alguma magia negra para fazer com que a instrução return-from-interrupt retorne ao agendamento preventivo do sistema operacional, em vez de à tarefa em execução, afastando o processador da tarefa atual e (POSSÍVEL) ) entregando-o a outra tarefa. Se nenhuma outra tarefa estiver pronta para ser executada nesse ponto, a tarefa atual receberá o processador novamente, perdendo apenas algum tempo.

A multitarefa preemptiva pode causar muitos problemas. Todas essas coisas irritantes sobre mutexes e seções críticas e abraços mortais e inversões de prioridade e ... aparecem quando o processador é tirado de você sem aviso prévio. Você precisa usar todas essas coisas para informar ao sistema operacional que está no meio da mistura de nitroglicerina e que tirar o processador de você agora provavelmente resultará em um grande buraco virtual de fumaça no meio da sala da servidor.


Que mal pode acontecer se o processador for retirado de você sem aviso? Eu acho que você terá novamente o controle do processador com os mesmos valores nos registros. Como isso é diferente de apenas manter seu cálculo?
Andrea

@ Andrea: Exclusão mútua e seções críticas são sobre não perder o processador em um momento crítico. Se seu processo tiver algo bloqueado e você perder o processador, ele permanecerá bloqueado até você obter o processador novamente. Isso pode causar problemas.
John R. Strohm

@ Andrea Você terá o controle do processador novamente e algum outro processo pode ter mexido na memória que você estava prestes a usar.
user253751

4

Interrupções de timer podem ser geradas pelo hardware do computador para interromper a CPU. Dessa maneira, com base no algoritmo de agendamento usado pelo sistema operacional, o sistema operacional pode decidir se continua executando o programa atual ou a alternância de contexto para outro que esteja pronto para execução.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.