Multitarefa de computador - Computer multitasking

Os sistemas operacionais de desktop modernos são capazes de lidar com um grande número de processos diferentes ao mesmo tempo. Esta captura de tela mostra Linux Mint rodando simultaneamente no ambiente de desktop Xfce , Firefox , um programa de calculadora, o calendário embutido, Vim , GIMP e VLC media player .
Capacidades de multitarefa do Microsoft Windows 1.0 1 lançado em 1985, mostrado aqui executando os programas MS-DOS Executive e Calculator

Na computação , multitarefa é a execução simultânea de várias tarefas (também conhecidas como processos ) durante um determinado período de tempo. Novas tarefas podem interromper as já iniciadas antes de serem concluídas, em vez de esperar que terminem. Como resultado, um computador executa segmentos de várias tarefas de maneira intercalada, enquanto as tarefas compartilham recursos de processamento comuns, como unidades de processamento central (CPUs) e memória principal . A multitarefa interrompe automaticamente o programa em execução, salvando seu estado (resultados parciais, conteúdo de memória e conteúdo de registro do computador) e carregando o estado salvo de outro programa e transferindo o controle para ele. Essa " troca de contexto " pode ser iniciada em intervalos de tempo fixos ( multitarefa preventiva ) ou o programa em execução pode ser codificado para sinalizar ao software de supervisão quando pode ser interrompido ( multitarefa cooperativa ).

A multitarefa não requer a execução paralela de várias tarefas exatamente ao mesmo tempo; em vez disso, permite que mais de uma tarefa avance em um determinado período de tempo. Mesmo em computadores com multiprocessadores , a multitarefa permite que muito mais tarefas sejam executadas do que CPUs.

A multitarefa é um recurso comum dos sistemas operacionais de computador. Permite um uso mais eficiente do hardware do computador; quando um programa está esperando por algum evento externo, como uma entrada do usuário ou uma transferência de entrada / saída com um periférico para ser concluído, o processador central ainda pode ser usado com outro programa. Em um sistema de compartilhamento de tempo , vários operadores humanos usam o mesmo processador como se fosse dedicado ao seu uso, enquanto nos bastidores o computador está servindo a muitos usuários multitarefa de seus programas individuais. Em sistemas de multiprogramação , uma tarefa é executada até que precise esperar por um evento externo ou até que o agendador do sistema operacional troque a tarefa em execução para fora da CPU. Sistemas em tempo real, como aqueles projetados para controlar robôs industriais, requerem processamento oportuno; um único processador pode ser compartilhado entre cálculos de movimento da máquina, comunicações e interface de usuário.

Freqüentemente, os sistemas operacionais multitarefa incluem medidas para alterar a prioridade de tarefas individuais, de modo que trabalhos importantes recebam mais tempo do processador do que aqueles considerados menos significativos. Dependendo do sistema operacional, uma tarefa pode ser tão grande quanto um programa de aplicativo inteiro ou pode ser composta de threads menores que executam partes do programa geral.

Um processador destinado ao uso com sistemas operacionais multitarefa pode incluir hardware especial para suportar com segurança várias tarefas, como proteção de memória e anéis de proteção que garantem que o software de supervisão não seja danificado ou subvertido por erros de programa do modo de usuário.

O termo "multitarefa" se tornou um termo internacional, já que a mesma palavra é usada em muitas outras línguas, como alemão, italiano, holandês, dinamarquês e norueguês.

Multiprogramação

Nos primeiros dias da computação, o tempo de CPU era caro e os periféricos muito lentos. Quando o computador executava um programa que precisava de acesso a um periférico, a unidade central de processamento (CPU) precisava parar de executar as instruções do programa enquanto o periférico processava os dados. Isso geralmente era muito ineficiente.

O primeiro computador a usar um sistema de multiprogramação foi o britânico Leo III, de propriedade da J. Lyons and Co. Durante o processamento em lote , vários programas diferentes foram carregados na memória do computador e o primeiro começou a rodar. Quando o primeiro programa alcançou uma instrução esperando por um periférico, o contexto desse programa foi armazenado e o segundo programa na memória teve a chance de ser executado. O processo continuou até que todos os programas terminassem de ser executados.

O uso da multiprogramação foi aprimorado com o advento da memória virtual e da tecnologia de máquina virtual , que permitiu que programas individuais utilizassem recursos de memória e do sistema operacional como se outros programas em execução simultânea fossem, para todos os fins práticos, inexistentes.

A multiprogramação não oferece nenhuma garantia de que um programa será executado em tempo hábil. Na verdade, o primeiro programa pode muito bem funcionar por horas sem a necessidade de acesso a um periférico. Como não havia usuários esperando em um terminal interativo, não havia problema: os usuários entregavam um baralho de cartas perfuradas a um operador e voltavam algumas horas depois para obter os resultados impressos. A multiprogramação reduziu muito os tempos de espera quando vários lotes estavam sendo processados.

Multitarefa cooperativa

Os primeiros sistemas multitarefa usavam aplicativos que voluntariamente cediam tempo uns aos outros. Essa abordagem, que acabou sendo suportada por muitos sistemas operacionais de computador , é conhecida hoje como multitarefa cooperativa. Embora agora seja raramente usado em sistemas maiores, exceto para aplicativos específicos como o CICS ou o subsistema JES2 , a multitarefa cooperativa já foi o único esquema de agendamento empregado pelo Microsoft Windows e pelo Mac OS clássico para permitir que vários aplicativos fossem executados simultaneamente. A multitarefa cooperativa ainda é usada hoje em sistemas RISC OS .

Como um sistema multitarefa cooperativamente depende de cada processo regularmente cedendo tempo para outros processos no sistema, um programa mal projetado pode consumir todo o tempo da CPU para si mesmo, seja executando cálculos extensos ou aguardando muito ; ambos fariam com que todo o sistema travasse . Em um ambiente de servidor, esse é um risco que torna todo o ambiente inaceitavelmente frágil.

Multitarefa preventiva

A multitarefa preventiva permite que o sistema de computador garanta de forma mais confiável para cada processo uma "fatia" regular do tempo de operação. Também permite que o sistema lide rapidamente com eventos externos importantes, como dados de entrada, que podem exigir a atenção imediata de um ou outro processo. Os sistemas operacionais foram desenvolvidos para aproveitar essas capacidades de hardware e executar vários processos preventivamente. A multitarefa preemptiva foi implementada no Monitor PDP-6 e MULTICS em 1964, no OS / 360 MFT em 1967 e no Unix em 1969, e estava disponível em alguns sistemas operacionais para computadores tão pequenos quanto o PDP-8 da DEC; é um recurso central de todos os sistemas operacionais do tipo Unix, como Linux , Solaris e BSD com seus derivados , bem como versões modernas do Windows.

Em qualquer momento específico, os processos podem ser agrupados em duas categorias: aqueles que estão aguardando entrada ou saída (chamados de " limite de E / S ") e aqueles que estão utilizando totalmente a CPU (" limite da CPU "). Em sistemas primitivos, o software costumava " pesquisar " ou " ficar ocupado " enquanto aguardava a entrada solicitada (como disco, teclado ou entrada de rede). Durante esse tempo, o sistema não estava realizando um trabalho útil. Com o advento de interrupções e multitarefa preemptiva, os processos vinculados a I / O poderiam ser "bloqueados" ou colocados em espera, enquanto se aguardam a chegada dos dados necessários, permitindo que outros processos utilizem a CPU. Como a chegada dos dados solicitados geraria uma interrupção, os processos bloqueados poderiam ter garantido um retorno oportuno à execução.

O primeiro sistema operacional multitarefa preventivo disponível para usuários domésticos foi o Sinclair QDOS no Sinclair QL , lançado em 1984, mas muito poucas pessoas compraram a máquina. O Amiga da Commodore , lançado no ano seguinte, foi o primeiro computador doméstico de sucesso comercial a usar a tecnologia, e suas habilidades multimídia o tornam um ancestral claro dos computadores pessoais multitarefa contemporâneos. A Microsoft tornou a multitarefa preemptiva um recurso central de seu principal sistema operacional no início dos anos 1990, ao desenvolver o Windows NT 3.1 e depois o Windows 95 . Posteriormente, foi adotado no Apple Macintosh pelo Mac OS X que, como um sistema operacional semelhante ao Unix , usa multitarefa preemptiva para todos os aplicativos nativos.

Um modelo semelhante é usado no Windows 9x e na família Windows NT , onde aplicativos nativos de 32 bits são multitarefa preventivamente. As edições de 64 bits do Windows, tanto para as arquiteturas x86-64 quanto para Itanium , não oferecem mais suporte a aplicativos legados de 16 bits e, portanto, fornecem multitarefa preemptiva para todos os aplicativos suportados.

Tempo real

Outro motivo para multitarefa era o projeto de sistemas de computação em tempo real , onde há uma série de atividades externas possivelmente não relacionadas que precisam ser controladas por um único sistema de processador. Nesses sistemas, um sistema de interrupção hierárquica é acoplado à priorização de processos para garantir que as atividades-chave recebam uma parcela maior do tempo de processo disponível .

Multithreading

Como a multitarefa melhorou muito o rendimento dos computadores, os programadores começaram a implementar aplicativos como conjuntos de processos cooperativos (por exemplo, um processo coletando dados de entrada, um processo processando dados de entrada, um processo gravando os resultados no disco). Isso, no entanto, exigia algumas ferramentas para permitir que os processos troquem dados com eficiência.

Os threads nasceram da ideia de que a maneira mais eficiente de processos cooperativos para a troca de dados seria compartilhar todo o seu espaço de memória. Assim, os threads são efetivamente processos que são executados no mesmo contexto de memória e compartilham outros recursos com seus processos pais , como arquivos abertos. Threads são descritos como processos leves porque alternar entre threads não envolve alterar o contexto da memória.

Embora os encadeamentos sejam agendados preventivamente, alguns sistemas operacionais fornecem uma variante para os encadeamentos, denominados fibras , que são agendados cooperativamente. Em sistemas operacionais que não fornecem fibras, um aplicativo pode implementar suas próprias fibras usando chamadas repetidas para funções de trabalho. As fibras são ainda mais leves do que os threads e um pouco mais fáceis de programar, embora tendam a perder alguns ou todos os benefícios dos threads em máquinas com vários processadores .

Alguns sistemas suportam diretamente multithreading no hardware .

Proteção de memória

Essencial para qualquer sistema multitarefa é compartilhar com segurança e eficácia o acesso aos recursos do sistema. O acesso à memória deve ser estritamente gerenciado para garantir que nenhum processo possa, inadvertida ou deliberadamente, ler ou gravar em locais de memória fora do espaço de endereço do processo. Isso é feito para fins de estabilidade geral do sistema e integridade de dados, bem como para segurança de dados.

Em geral, o gerenciamento de acesso à memória é responsabilidade do kernel do sistema operacional, em combinação com mecanismos de hardware que fornecem funcionalidades de suporte, como uma unidade de gerenciamento de memória (MMU). Se um processo tentar acessar um local de memória fora de seu espaço de memória, a MMU nega a solicitação e sinaliza ao kernel para executar as ações apropriadas; isso geralmente resulta no encerramento forçado do processo ofensivo. Dependendo do design do software e do kernel e do erro específico em questão, o usuário pode receber uma mensagem de erro de violação de acesso, como "falha de segmentação".

Em um sistema multitarefa bem projetado e corretamente implementado, um determinado processo nunca pode acessar diretamente a memória que pertence a outro processo. Uma exceção a esta regra é no caso de memória compartilhada; por exemplo, no mecanismo de comunicação entre processos do System V , o kernel aloca memória para ser compartilhada mutuamente por vários processos. Esses recursos são frequentemente usados ​​por softwares de gerenciamento de banco de dados, como PostgreSQL.

Mecanismos de proteção de memória inadequados, devido a falhas em seu design ou implementações inadequadas, permitem vulnerabilidades de segurança que podem ser potencialmente exploradas por software malicioso.

Troca de memória

O uso de um arquivo ou partição de troca é uma maneira do sistema operacional fornecer mais memória do que a fisicamente disponível, mantendo partes da memória primária no armazenamento secundário . Embora a multitarefa e a troca de memória sejam duas técnicas completamente não relacionadas, muitas vezes são usadas juntas, pois a troca de memória permite que mais tarefas sejam carregadas ao mesmo tempo. Normalmente, um sistema multitarefa permite que outro processo seja executado quando o processo em execução atinge um ponto em que é necessário aguardar que alguma parte da memória seja recarregada do armazenamento secundário.

Programação

Processos que são totalmente independentes não são muito problemáticos para programar em um ambiente multitarefa. A maior parte da complexidade em sistemas multitarefa vem da necessidade de compartilhar recursos de computador entre tarefas e sincronizar a operação de tarefas cooperativas.

Várias técnicas de computação simultânea são usadas para evitar problemas potenciais causados ​​por várias tarefas que tentam acessar o mesmo recurso.

Sistemas maiores às vezes eram construídos com um (s) processador (es) central (is) e algum número de processadores de E / S , uma espécie de multiprocessamento assimétrico .

Com o passar dos anos, os sistemas multitarefa foram aprimorados. Os sistemas operacionais modernos geralmente incluem mecanismos detalhados para priorizar processos, enquanto o multiprocessamento simétrico introduziu novas complexidades e recursos.

Veja também

Referências