Multitarefa
Origem: Wikipédia, a enciclopédia livre.
Característica dos sistemas operativos modernos que permite repartir a utilização do processador entre várias tarefas simultaneamente.
Índice |
[editar] História
Pode parecer, actualmente, difícil de imaginar um computador monotarefa, i.e., que apenas permita utilizar uma aplicação mas, de facto, houve um percurso histórico notável até se atingir o nível actual de paralelização de processos. Com efeito, os primeiros computadores apenas permitiam executar uma única tarefa de cada vez. O DOS é um excelente exemplo disso, já que foi dos primeiros sistemas operativos para computadores pessoais.
O primeito passo para a multitarefa no MS-DOS foi a criação dos TSR's (Terminate and Stay Resident), pequenos programas que permaneciam em memória enquanto se executava outro programa, e que podiam instalar rotinas de tratamento de interrupções para serem ativados posteriormente. Ou seja, estando o utilizador a escrever um texto num processador de texto, por exemplo, poderia apertar uma combinação de teclas que dispararia uma interrupção e chamaria a TSR de uma agenda pessoal para tirar notas. Assim, do ponto de vista do processador, o processo do processador de texto era bloqueado e passava-se o controle para a agenda. Quando o utilizador terminasse, voltava-se ao processador. Ambos programas coexistiam, mas não podiam ser executados simultâneamente.
O passo seguinte foi a emulação de multitarefa. Exemplos disto eram as primeiras versões de Windows, que este executava sobre DOS (monotarefa), mas o núcleo do Windows fazia a sua própria gestão dos processos. Curiosamente, se um processo bloqueasse o Windows, todas as aplicações teriam que ser terminadas pois eram todas dependentes.
Posteriormente, surgiu uma das principais componentes dos SO actuais: o escalonador de processos, ou (em inglês) scheduler, que faria a gestão, qualificação e o gerenciamento de prioridade dos processos sem afectar o núcleo do sistema operativo. Ou seja, todas as tarefas kernel são críticas, e todo o tempo que sobrar é legado aos processos. Adivinha-se, portanto, a necessidade de estabilizar o kernel, por forma a minimizar o tempo de execução de tarefas internas.
O escalonador de processos é uma componente muito polémica em termos de inovação e de aplicações. Dependendo das situações, um escalonador de processos deve gerir os seus processos por forma a diminuir a latência entre aplicações interactivas, ou assegurar a coerência em termos de critérios no escalonamento: se uma tarefa não é crítica, então não devia estar a ser executada.
[editar] Tarefas
Os conceitos ligados ao paralelismo de tarefas não são consensuais. A linguagem vulgar no UNIX sugere, no entanto, alguns termos razoavelmente universais.
No UNIX, existe dois níveis de tarefa: o processo e a thread. Os processos têm uma série de threads associadas. Tipicamente, cada processo tem um determinado espaço de endereçamento que as diferentes threads partilham. Cada thread tem o seu próprio estado de processador e a sua própria pilha.
[editar] Alternância de tarefas
Cada processador pode executar apenas um programa de cada vez. Por esta razão, a multitarefa num sistema uniprocessador é apenas uma ilusão conseguida com a alternância rápida entre as várias tarefas.
O kernel do sistema operativo é responsável por isolar os contextos de execução das diversas tarefas. Para conseguir isto, é necessário que uma rotina do kernel seja chamada a dada altura. Essa rotina (que pode ser chamada por uma interrupção provocada por um temporizador interno do computador) geralomente executa as seguintes operações:
- Salva o estado do processador numa estrutura de dados do kernel (a árvore de processos);
- Seleciona, com base num algoritmo, a próxima tarefa a executar;
- Se for necessário, reconfigura o espaço de endereçamento de modo a que a próxima tarefa encontre a memória no estado que espera;
- Carrega o estado do processador referente à tarefa que vai receber tempo de processador;
- A rotina retorna permitindo que o programa execute.
[editar] Tipos de multitarefa
Existem dois tipos de sistemas operativos multitarefa: os de antecipação e os de cooperação.
[editar] Multitarefa de antecipação
Os sistemas operativos com multitarefa de antecipação (ou multitarefa preemptiva) esforçam-se por conseguir uma "democratização" dentro do processador. Os seus kernels mantêm em memória um registo de todos os processos em execução. A esse registo dá-se o nome de árvore de processos, em virtude de a estrutura de dados interna ser geralmente uma árvore.
Entre outros atributos acerca de cada processo, essa "árvore" inclui uma informação de prioridade (chamada "nice" nos sistemas Unix-like e simplesmente "Priority" nos Windows NT), com a qual o kernel calcula o tempo de CPU que deve dar a cada processo; quando esse tempo acaba, o kernel tira o controle da CPU do processo e o fornece ao processo que vem a seguir na fila. Quando a fila acaba, o kernel volta a dar o controle da CPU ao primeiro processo, fechando assim o ciclo.
Exemplos:
[editar] Multitarefa de cooperação
A multitarefa de cooperação pouco difere do outro sistema. A única diferença é que, neste caso, há uma preempção explícita, sendo que o programa intrui o kernel a fazer o task switching em certos pontos do código, e o kernel apenas passa ao processo seguinte quando o programa o permite.
Actualmente, a maioria dos sistemas operativos utiliza a multitarefa de antecipação. Em certos casos, no entanto, o kernel não é antecipável, obrigando à utilização deste método para permitir a multitarefa enquanto o processo executa uma chamada de sistema.
Exemplos: