# Tempo compartilhado
## 1. Introdução

O computador é composto por hardware e software. O hardware é o conjunto de peças elétricas, mecânicas e magnéticas, ou seja, a parte física do computador. O software é a parte abstrata, a qual deixa mais fácil a utilização do computador para nossas atividades cotidianas.
Sistema Operacional (SO ou OS – Operational System) é um software que auxilia no gerenciamento dos recursos de hardware de um computador. Sem um OS, seria extremamente demorado e trabalhoso realizar tarefas em um computador, assim como era na década de 70.
Sendo assim, o Sistemas Operacionais servem como uma interface entre a máquina e os seus usuários, deixando as tarefas mais simples e intuitivas, e evitando de conhecimento técnico em Computação para realizar algum tipo de trabalho.

## 2. Contexto histórico

Terceira-Geração (1965-1980): Em princípio se buscava um software de possível utilização tanto para usos científicos, que exigem cálculos pesados e lentos, quanto para usos comerciais. O que resultou em um computador muito grande e cheio de bugs. Porém, mesmo com seus defeitos, satisfez a maioria de seus clientes razoavelmente bem. Produziram, também, várias técnicas, dentre elas a mais importante foi a multiprogramação. Quando precisava-se de uma operação de E/S a CPU comumente ficava ociosa, tempo esse que poderia estar processando outra coisa.A correção veio com a separação da memória, enquanto um processo era executado por uma parte da memória a outra executava outro processo.
Embora os sistemas operacionais da terceira geração satisfizessem os cálculos científicos e os processamentos comerciais, eles ainda eram sistemas de lote. Muitos programadores sentiam falta dos computadores da primeira geração, onde tinham a máquina só para eles, depurando seus programas mais rápidos. Os sistemas desta geração eram mais suscetíveis a erros, o tempo para submeter um processo e resultar numa saída era muito alto, assim uma única vírgula mal colocada poderia deixar o sistema ocioso por um bom tempo (tempo esse desperdiçado devido ao erro). Essa necessidade de tempo de resposta rápido preparou caminho para os sistemas de compartilhamento de tempo, variante da multiprogramação onde cada usuário teria um terminal online. No entanto essa técnica só se popularizou quando a necessária proteção de hardware se tornou comum.
Depois do êxito do sistema, as empresas da época se dedicaram ao desenvolvimento de uma máquina que suportaria centenas de usuários de tempo compartilhado simultaneamente. Seu modelo era de distribuição de energia, assim quando um computador precisa se de uma maior quantidade de energia era só conectar um plug na tomada que, dentro do possível, iria receber uma carga maior de energia. Os projetistas desse sistema, conhecidos como MULTICS(Multiplexed Information and Computing Service), vislumbraram uma máquina de grande poder de cálculo para todos.
Esse conceito, acabou por fim, virando um fiasco a medida que os preços dos computadores despencaram, ainda assim contribuíram muito para sistemas subsequentes. Outro importante desenvolvimento da terceira geração foi o crescimento fenomenal dos minicomputadores.
A ideia de tempo compartilhado foi demonstrada no início de 1960, mas já que sistemas de tempo compartilhado são mais difíceis e custosos para construir (devido aos numerosos dispositivos de E/S necessários), eles somente tornaram-se comuns no início dos anos 70. Conforme a popularidade destes sistemas cresceu, pesquisadores tentaram combinar os recursos de sistemas batch e de tempo compartilhado em um único sistema operacional. Muitos sistemas que foram inicialmente projetados como sistemas batch foram modificados para criar um subsistema de tempo compartilhado. Por exemplo, o sistema batch OS/360 da IBM foi modificado para suportar a opção de tempo compartilhado (Time Sharing Option - TSO). Ao mesmo tempo, à maioria dos sistemas de tempo compartilhado foi adicionado um subsistema batch. Hoje em dia, a maioria dos sistemas fornece ambos os processamentos batch e de tempo compartilhado, embora seu projeto básico e uso sejam preponderantes de um ou de outro tipo.

## 3. Multiprogramação

“Num ambiente de somente um processador, cada processo é executado um pouco de cada vez, de forma intercalada. O sistema operacional aloca a UCP um pouco para cada processo em uma ordem não previsível, pois depende de muitos fatores externos aos processos. Um processo após receber a UCP, só perde o controle da execução quando ocorre uma interrupção ou quando ele executa um trap, requerendo algum serviço do sistema operacional". Interrupções apenas param, temporariamente, a execução do processo, qual retornará em algum momento da onde ele foi interrompido. Já uma trap bloqueia o processo até que seja realizado o serviço dele.
Em um sistema com multiprocessadores a ideia de programação paralela fica mais evidente, pois se tem os processos literalmente executando ao mesmo tempo, por diferentes processadores. “Um sistema mono processado executando N processos de forma intercalada pode ser visto como se possuísse N processadores virtuais, um para cada processo em execução. Cada processador virtual teria 1/N da velocidade do processador real (desprezando-se o overhead existente na implementação da multiprogramação)".
A multiprogramação torna os processos muito eficientes, a partir do momento que se pode executar ações ao mesmo tempo para assim otimizar o tempo de execução de cada processo. Por exemplo, se queremos realizar uma job mais lenta e outra mais rápida, em um sistema com multiprogramação as duas serão executadas simultaneamente, logo a job mais rápida estará disponível antes. Em um sistema sem multiprogramação, pode acontecer de a job rápida ter que esperar a job lenta terminar.
Durante suas execuções, os processos dos usuários, ocasionalmente, através de traps, fazem requisições ao sistema operacional (para gravar um arquivo no disco, por exemplo). Recebendo a requisição, o sistema operacional bloqueia o processo (deixa de dar tempo de UCP a ele) até que a operação solicitada seja completada. Quando isto acontece o processo é desbloqueado e volta a competir pela UCP com os demais processos.
Um processo pode estar em três estágios: executando, quando o processo está usando a UCP; bloqueado, quando o processo está esperando um serviço que solicitou, um retorno; pronto, quando o processo já pode ser executado pela UCP mas não pode pois está esperando liberar espaço para ele. O sistema operacional mantém uma lista(fila) para a execução dos processos. A chamada desta lista é feita pelo escalonador, componente do sistema operacional que, após uma interrupção ou uma trap, escolhe o próximo processo para executar.

## 4. Tempo compartilhado

Ou multitarefa como é chamado também, é uma extensão lógica da multiprogramação onde múltiplos jobs são executados simultaneamente, ocupando uma fatia de tempo da UCP. O conceito básico é de alternância da fila de jobs, enquanto um processo espera um determinado dado, outro utiliza o processamento da UCP. Essa troca entre jobs é bastante rápida a ponto do usuário não perceber que enquanto ele utiliza um programa outros estão em processamento também. Porém quando há muitos jobs concorrendo pela UCP pode ocasionar uma certa lentidão.
Uma comparação é feita com os sistemas batch, nestes um fluxo de jobs separados são lidos.Quando um job termina seu resultado é impresso e outro job começa a processar. A principal desvantagem desse sistema é a falta de interação entre o usuário e o programa em execução. Nos sistemas batch, o usuário precisa entregar ao operador do programa o que ele deseja executar, incluindo as entradas, ocorre a submissão do programa. Somente algum tempo depois (do processamento) é que há o seu resultado. Tempo este que pode deixar o sistema ocioso por um período muito longo.
“Do ponto de vista do programador ou do usuário, existem algumas dificuldades com o sistema batch. O usuário não pode interagir com o job que está executando, e deve indicar através dos cartões de controle o tratamento de todos os resultados possíveis. Em um job de múltiplos passos, determinados passos podem depender do resultado dos anteriores. A execução de um programa, por exemplo, pode depender do sucesso da compilação. Pode ser difícil definir completamente o que fazer em todos os casos”. Outra desvantagem é que no sistema batch os programas devem ser depurados estaticamente a partir de uma listagem, impedindo o programador ou usuário de modificar o programa enquanto ele está executando.
Já em sistemas interativos(chamados de hands-on), fornece comunicação em tempo real entre o usuário e o sistema. Através do teclado o programador pode fornecer instruções para o sistema operacional trabalhar, recebendo uma resposta imediata. O usuário, desta forma, pode ter um controle maior da execução dos processos, pode ver resultados imediatos e fazer modificações como quiser. Nestes sistemas normalmente são usados o teclado para entrada de dados e um monitor para exibição dos resultados.
Sistemas batch são apropriados para execução de jobs grandes que precisam de pouca interação. São execuções demoradas, onde o programa é submetido e o resultado só vem depois de um tempo, em contrapartida, sistemas interativos são compostos por várias pequenas ações e o resultado delas são imediatos(tempo de resposta pequeno).
Sistemas de tempo compartilhado foram desenvolvidos para permitir a interatividade a custos pequenos. Esse sistema usa escalonamento da UCP e multiprogramação para fornecer para cada programa uma fração do tempo do processador.
“Um sistema operacional de tempo compartilhado permite que muitos usuários compartilhem o computador simultaneamente. Já que cada ação ou comando em um sistema de tempo compartilhado tende a ser pequeno, apenas uma pequena quantidade de tempo de UCP é necessária para cada usuário. Conforme o sistema troca de um usuário para outro, cada usuário tem a impressão de ter seu próprio computador, enquanto na realidade um computador está sendo compartilhado entre muitos usuários”.
Os sistemas de tempo compartilhado se tornaram comum na década de 70. Pesquisadores trabalhavam em uma forma de juntar o sistema batch e o de tempo compartilhado em um mesmo sistema operacional. Hoje em dia a maioria dos sistemas fornecem as duas formas, porém acaba-se preponderando o uso de um ou de outro em geral.
Esse sistema requer muitos jobs carregados na memória principal, logo precisa-se de um bom gerenciamento da memória do dispositivo. Devido às limitações da memória principal muitas vezes é preciso usar memórias mais lentas, como o disco rígido, para mapear dados. Assim tornando, quando preciso carregar dados do disco, o processo lento. Hoje, multiprogramação e sistema compartilhado são os temas centrais dos sistemas operacionais modernos.

## 5. Conclusão

Sistemas Operacionais podem ser divididos em três tipos: Sistemas mono programáveis e mono tarefa, multi programáveis e multitarefa com múltiplos processadores. Sistemas de tempo compartilhado, também conhecidos como time-sharing, são um gênero de multiprogramação. A estratégia principal utilizada em sistemas com time-sharing é reduzir a ociosidade do processador, de forma com que ele sempre fique ocupado, aumentar a eficiência, e obtendo o máximo possível do hardware. Para isso, o tempo do processador é dividido, geralmente em pequenos intervalos, chamados de time-slice ou fatias de tempo, em português. Cada processo tem uma fatia destinada a ele, quando termina-se a execução, ou chega-se ao final do tempo, é a vez de outro processo receber, ou continuar sua fatia, através de um sistema de fila simples. A execução é feita de forma concorrente.