Introdução

Vou continuar o artigo Entendo Sistemas Operacionais – parte 1 falando um pouco sobre a história dos sistemas operacionais. Uma maneira mais fácil de compreender os modernos sistemas operacionais é observar a evolução dos computadores e como tais sistemas ajudaram a desenvolver o hardware e os sistemas computacionais em geral.

1.Computadores com válvulas

Os primeiros sistemas computacionais eram gigantescos aglomerados de válvulas, cabos e painéis de conectores. Eram apenas grandes e lentas calculadoras, que conseguiam executar cálculos muito simples, como gerar tabelas de senos e cossenos.

Naquele tempo um único grupo de pessoas exercia várias funções: eram programadores, engenheiros, projetistas de cada máquina. Segundo [1], “toda a programação era feita em linguagem de máquina pura, frequentemente ligando com fios os painéis de conectores para controlar as funções básicas da máquina”. Esqueça Assembly, pois nem isso era conhecido naquela época. Sistemas operacionais então, nem pensar!

No final da década de 1950, os famosos cartões perfurados que ouvimos falar nos livros de introdução à Computação foram introduzidos, não sendo mais necessário a utilização de fios e cabos para fazer programas; fora isso, o demorado e custoso processo continuava o mesmo.

Devido ao seu alto custo e difícil manutenção, os sistemas computacionais não passavam de experimentos.

Univac - o primeiro computador de válvulas do mundo

Univac - o primeiro computador de válvulas do mundo

2.Sistemas mainframe

2.1 – Sistemas Batch (em lote)

A introdução dos transistores em meados de 1950 serviu como uma alavanca para a industria eletrônica e para os computadores, pois os tornou mas confiáveis ou pelo menos não queimariam de maneira tão fácil quanto os computadores a válvulas. Os primeiros computadores comerciais puderam ser fabricados e vendidos a grandes empresas, como bancos e companhias de seguro, e instituições governamentais. As primeiras empresas especializadas nestes sistemas começaram a ganhar força, como a IBM.

Começou a ser formar uma distinção entre programadores, projetistas, construtores e operadores de tais sistemas computacionais. A programação destas máquinas ainda era feita por pessoas que possuíam conhecimentos do hardware que as compunham. Estes especialistas encontravam muitas dificuldades ao lidar com a programação dos computadores da época, pois cada um tinha suas particularidades no hardware, o que significava que uma única peça diferente podia significar uma mudança bastante grande em todo o programa.

Para executar programas nestas máquinas, geralmente os seguintes passos eram feitos:

  1. O programador escrevia o programa em papel (geralmente em FORTRAN ou Assembly) e passava o programa para cartões perfurados;

  2. preparava um job – que se constituía do programa, dos dados e de alguma informação de controle sobre a natureza do job – e o levava para um máquina leitora de cartões que lia os jobs em lote e gravava em uma fita magnética;

  3. esta fita magnética era entregue ao operador do computador;

  4. o operador então levava os jobs ao computador, organizava todos os jobs com requisitos semelhantes em lotes para serem executados pelo computador, que gravava cada job em uma outra fita magnética;

  5. essas fitas eras levadas a um outra máquina leitora de fitas conectada a uma impressora que mostrava a saída de cada programa.

Procedimento para utilizar sistemas batch

Procedimento para utilizar sistemas batch

Com a evolução dos computadores tornou-se necessário a criação de programas que controlassem a execução de tarefas cotidianas para facilitar a execução dos programas. Esses programas operando em conjunto podem ser considerados os primeiros sistemas operacionais. Sua principal função era transferir automaticamente o controle de um job ao seguinte.

2.2 – Sistemas com suporte à multiprogramação

Os sistemas batch possibilitaram que os computadores pudessem ser realmente úteis mas eles tinham um grande problema: o tempo ocioso de CPU. Sistemas computacionais eram bastante caros para serem construídos e mantidos em meados das décadas de 1960 até 1970, e o tempo ocioso destes sistemas significava jogar dinheiro investido no lixo.

Os projetistas destes sistemas tinham que procurar alguma maneira de deixá-los ocupados a maior parte do tempo possível. Isso representava um grande desafio, pois as velocidades da CPU e outros dispositivos eletrônicos eram escalas de vezes maiores que os mais rápidos dispositivos de I/O (Para se ter uma idéia uma CPU lenta conseguia trabalhar com milhões de instruções executadas por segundo e uma leitora de cartões rápida, por outro lado, podia ler 20 cartões por segundo).

A solução desenvolvida foi dividir a memória em vários setores, onde cada job ficaria em um setor. Enquanto um job ficasse esperando por I/O, outro job podia usar a CPU. Se um número suficiente de jobs pudesse ocupar todo a memória do computar, a CPU poderia, hipoteticamente, ficar ocupada 100% do tempo. Essa solução ficou conhecida como multiprogramação e ainda hoje é utilizada nos sistemas operacionais modernos.

Outro importante recurso desenvolvido nestes sistemas foi uma técnica que permitia o sistema ler cartões de jobs direto para discos logo que eram trazidos para a sala do computador, dispensando a fase de gravar esses cartões em fitas magnéticas, o que trouxe mais rapidez aos processos de programação. Sempre que um job que estava executando acabava, o sistema operacional podia carregar um novo job do disco para um setor de memória vazio. Essa técnica ficou conhecida como spooling e também era utilizada para saída.

Segundo [2] “a multiprogramação é a primeira instância na qual o sistemas operacional deve tomar decisões em favor dos usuários”, portanto, tais sistemas são bastante sofisticados e algumas questões devem ser levadas em consideração na hora de projetá-los:

  • Se há vários jobs prontos para serem carregados na memória e não espaço suficiente, o que o sistema operacional deve escolher um dentre eles. A tomada dessa decisão corresponde ao agendamento dos jobs;
  • a manutenção de vários jobs na memória ao mesmo tempo requer alguma forma de gerenciamento dessa memória. Esse gerenciamento necessita de um hardware especial que dê suporte ao sistema operacional;
  • se diversos jobs estão prontos para a execução ao mesmo tempo, o sistema deve utilizar políticas de escalonamento de CPU para tomar decisões sobre como organizar os jobs de forma que a CPU passe a maior parte do tempo ocupada e dê as respostas da maneira mais rápido possível;
  • múltiplos jobs executando de forma concorrente exigem que suas capacidades de afetar uns aos outros sejam limitadas em todas as fases do sistema operacional, incluindo o agendamento de processos, o armazenamento em disco e o gerenciamento de memória.

2.3 – Sistemas de tempo compartilhado (time-sharing)

Sistemas batch multiprogramados utilizam os recursos do sistema operacional de forma eficiente, mas não proporcionam a interação do usuário com o sistema e tem tempos de resposta muito demorados. Os programadores tinham que esperar horas ou dias para poder receber uma resposta do processamento de seus programas e, caso algo desse errado, como um ponto-e-vírgula mal colocado, eles teriam que submeter seus programas novamente para que fossem processados e esperar mais um pouco (haja paciência!). Para resolver este problema, foi criada a técnica de tempo compartilhado (time-sharing).

Nesta técnica, que é uma extensão da multiprogramação, segundo [2] “a CPU executa vários jobs permutando entre eles com tanta freqüência que os usuários podem interagir com cada programa enquanto ele está em execução”, com isso os tempos de resposta tornaram-se bastante menores. Ela também permite que muitos usuários compartilhem o computador simultaneamente.

Um sistemas operacional de tempo compartilhado usa a multiprogramação e o agendamento de CPU para permitir que cada usuário tenha uma pequena porção do computador, onde cada usuário tem pelo menos um programa carregado na memória.

Obviamente, sistemas que implementam o tempo compartilhado são mais complexos que os sistemas que utilizam apenas a técnica de multiprogramação. Em ambos, diversos jobs devem ser carregados na memória, logo o sistema deve possuir políticas de gerenciamento e proteção da memória.

Uma técnica bastante interessante desenvolvida com os sistemas compartilhados é a memória virtual, que permite que os tempos de resposta ao usuário sejam bastante reduzidos pois o sistema fica permutando os programas entre a memória e disco, que acaba funcionando como uma memória de retaguarda. Esta técnica também permite que os programas possam ser maiores que a memória principal, liberando os programadores da preocupação com as limitações de memória e armazenamento.

Sistemas operacionais de tempo compartilhado também apresentam algumas questões, além das questões já citadas nos sistemas multiprogramados, que devem ser levadas em consideração ao serem projetados:

  • eles devem possuir um sistema de arquivos, para lidar com os dados dos diferentes usuários e diferentes programas;
  • devem possuir mecanismos que provêem execução concorrente de processos (programas carregados na memória e em execução), o que sofistica os processos de escalonamento da CPU;
  • garantir a execução ordenada do sistemas através de mecanismos de comunicação e sincronização entre jobs;
  • deve assegurar que os jobs não irão bloquear recursos do sistema computacional por tempo indeterminado (deadlock).

A idéia de tempo compartilhado foi demonstrado na década de 1960, mas como estes sistemas são bastante complexos de serem projetados e implementados, eles se tornaram comuns apenas na década de 1970.

Muitos dos sistemas atuais não utilizam mais processamento em lote, apenas sistemas legados, mas muitas das técnicas desenvolvidas para estes sistemas estão presentes nos modernos sistemas operacionais.

3. Sistemas desktops

Os computadores pessoais (PCs) apareceram por volta da década de 1970. Os primeiros PCs eram bastante simples e possuíam um hardware bastante fraco em comparação aos grandes sistemas da época. Eles não ofereciam qualquer proteção ao sistema operacional dos programas de usuário, o que tornava os sistemas operacionais dos PCs muito simples, sem soporte a multiprogramação e muito menos a multitarefa. Um exemplo desse tipo de sistema é o Microsoft MS-DOS, que é um sistema operacional monotarefa e monousuário, em que os programas de usuários tem acesso direto ao hardware.

Com o passar dos anos, o hardware ficou cada vez mais barato e as facilidades para se adquirir um PC também. Com um poder de processamento cada vez maior, os PCs evoluíram muito juntamente com seus sistemas operacionais.

Grande parte das técnicas dos sistemas mainframe como a multitarefa, multiprogramação e memória virtual estão presentes nos sistemas operacionais de qualquer desktop atualmente, mas outras puderam ser deixadas de lado, pois, segundo [2] “os custos e hardware para os microcomputadores são suficientemente baixos para que indivíduos façam uso isolado do computador, e assim a utilização da CPU não é mais um problema primordial”.

Alguns destes sistemas não nasceram com todas essas técnicas sofisticadas, como o MS-DOS e o UNIX original, mas evoluíram muito ou estão evoluindo (Microsof Windows). Outros já nasceram com todas estas técnicas bem sofisticadas, como é o caso do Linux.

Um fator importante que deve ser levado em conta ao projetar esses sistemas é que a maioria dos seus usuários é formada por usuários não-técnicos. Isso faz com que o projeto destes sistemas dê uma atenção especial para o desenvolvimento de GUIs (graphic users interfaces). Um bom exemplo são as interfaces gráficas do Mach OS X, do Microsoft Windows Vista e as interfaces gráficas KDE e Gnome para o Linux e outros sistemas UNIX-like.

Mac OS X

Mac OS X

Ambiente gráfico KDE

Ambiente gráfico KDE

Ambiente gráfico Gnome

Ambiente gráfico Gnome

4. Sistemas Multiprocessados

Estes sistemas possuem mais de uma CPU em íntima comunicação, que dividem o mesmo barramento, o clock e, algumas vezes, a memória e outros recursos. Já são utilizados há muito tempo nos grandes sistemas computacionais e estão começando a ser mais utilizados em sistemas desktops (mais uma vez o que começa nos grandes sistemas é adaptado para sistemas menores).

Estes sistemas apresentam 3 vantagens importantes segundo [2], que são:

  • Throughput aumentado: com o aumento do número de processadores, espera-se obter mais trabalho executado em menos tempo
  • Economia de escala: um sistema com múltiplo processadores pode sair mais barato que vários sistemas, cada um com seu processador
  • Confiabilidade aumentada: se um dos processadores parar ele pode transferir o que estava fazendo para outro processador.

5. Sistemas distribuídos

São sistemas que conseguem compartilhar tarefas computacionais e oferecer um rico conjunto de facilidades aos usuários. Segundo [1] um sistema operacional distribuído “é aquele que aparece para seus usuários como um sistema monoprocessado tradicional, mesmo que realmente seja composto por váiros núcleos. Os usuários não sabem onde seus programas estão sendo executados nem onde seus arquivos estão localizados”.

Nestes sistemas, cada computador não precisa necessariamente ter o mesmo S.O., mas é necessários que eles sejam capazes de trocar mensagens. Essa troca de mensagens geralmente é feita através de uma rede local (LAN – Local Area Network).

Um exemplo típico deste tipo de sistema é a Web. Quando você acessa seu email, você não sabe onde seus arquivos estão localizados e que espécie de programas os estão manipulando. Provavelmente eles estão armazenados em servidores com múltiplas CPUs ao redor do mundo.

6. Clusters

Estes sistemas reúnem múltiplos computadores para realizar uma determinada tarefa. São compostos por dois ou mais sistemas operacionais iguais e acoplados.

Segundo [2], não existe uma definição do termo clusters, mas o termo é geralmente um sinônimo para sistemas agrupados que compartilham memória e são proximamente ligados através de um rede local.

Cluster utilizado na NASA

Cluster utilizado na NASA

7. Sistema real-time

São sistemas usados em aplicações onde o tempo de resposta do sistema tem um limite rígido de processamento e fluxo de dados. Geralmente estão em aplicações dedicadas.

8. Sistemas para dispositivos móveis

São os sistemas projtatos especificamente para celulares, dispositivos Palm, mini-PCs e outros dispositivos. Os desenvolvedores destes sistemas enfrentam um grande número de desafios ao projetar estes sistemas por limitações de hardware.

Os principais desafios são:

  • estes dispositivos possuem pouca memória, o que exige dos desenvolvedores políticas muito cuidadosas de gerenciamento da mesma
  • Possuem processadores mais lentos se comparados aos outros tipos de sistemas, o que leva a um projeto cuidados não só do sistema operacional, mas também das aplicações para estes dispositivos com o objetivo de não sobrecarregar a CPU.

A questão das interfaces de comunicação com o usuário também eram um sério problema para os desenvolvedores. Este problema está sendo resolvido com a implementação de telas sensíveis ao toque e projetos de designer sofisticados que estes aparelhos vem recebendo. Como exemplo, temos o iPhone da Apple.

iPhone

iPhone

Exemplos de sistemas operacionais para estes dispositivos são o Palm OS, Symbian OS, Windows Mobile e a plataforma Android, desenvolvida pelo Google junto com outras várias empresas, que é baseada no kernel do Linux e com um fork da máquina virtual do Java chamada de Dalvik.

Simbolo da plataforma Android

Símbolo da plataforma Android

Conclusão

Os sistemas operacionais desenvolveram-se desde os primeiros sistema batch com dois objetivos principais: manter o bom desempenho do sistema de computação e proporcionar um ambiente adequado para o desenvolvimento e execução de programas.

Ao examinarmos a evolução dos sistemas mainframes, percebemos que muitas das característica de tais sistemas se desenvolveram devido as dificuldades encontradas pelos projetistas destes sistemas, como a multiprogramação, a tempo-compartilhado e a memória virtual. Percebemos também que muitas das características presentes nos sistemas operacionais desktops de hoje, vem dos antigos sistemas mainframes.

Ao mesmo tempo que as características dos grandes sistemas operacionais mainframes foram sendo adaptadas aos PCs, hardware mais sofisticado, mais rápido e mais poderoso foi desenvolvido para dar maior suporte aos sistemas operacionais e aos sistemas de computação de um modo geral.

Ao longo do tempo surgiram novas formas de fazer trabalhos computacionais (computação distribuída, clusters), com novos requisitos e novas questões sobre estes temas. Isso resulta em uma evolução constante dos sistemas operacionais, responsáveis pelo gerenciamento de todos esses requisitos de forma segura e transparente para usuários e programadores.

Outro fator muito importante é a evolução da computação móvel, que embora tenha seus desafios, está evoluindo a uma velocidade incrível e logo teremos dispositivos móveis tão potentes quanto nossos desktops (para comprovar  clique aqui).

No próximo e último artigos irei falar sobre as estruturas mais comuns aos sistemas operacionais e alguns conceitos importantes.

REFERENCIAS:

[1] Andrew S. Tanenbaum & Albert S. Woodhull, Sistemas Operacionais: Projeto e Implementação – 2ª edição. Bookman, 2000.

[2] Abraham Silberschatz et al. Fundamentos de Sistemas Operacionais – 6ª edição, Livros Técnicos e Científicos (LTC), 2004.

Anúncios