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?
fonte
interrupt
INT
instrução. Algo ainda é um mistério para mimRespostas:
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.
fonte
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.
fonte
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.
fonte