1 Sistemas Operacionais 1 – Introdução 1.1 - O que é Sistema Operacional? Antes de definir o que é um sistema operacional, é necessário que se entenda o conceito de sistema computacional. Um sistema computacional consiste em um ou mais processadores, memórias principal e secundária, dispositivos de entrada/saída como interfaces de redes, teclado, mouse, etc. e interface com usuário, seja ela através de linha de comando ou gráfica. Em outras palavras, um sistema computacional é o conjunto formado pelo hardware e software. Um sistema operacional é um programa ou conjunto de programas que faz o gerenciamento do computador. Sua principal função é controlar o funcionamento do computador, gerenciando a utilização e o compartilhamento de recursos tais como processador, memória e dispositivos de entrada/saída. São exemplos de sistemas operacionais os antigos D.O.S. (Disk Operation System) e o Unix, e os atuais Windows XP, Windows Vista e Seven(7), Solaris, Mac OS X, Linux, FreeBSD, Symbian, Android, iOS entre outros. Sendo alguns de sistemas operacionais livres e distribuídos com o código-fonte aberto, outros são sistemas proprietários. Também temos aqueles que foram desenvolvidos exclusivamente para celulares e smartphones. Se não existisse o sistema operacional, para trabalhar com o computador, seria necessário um profundo conhecimento do hardware para poder usar o computador. O sistema operacional serve como interface entre o usuário e o hardware. As funções de um sistema operacional são executadas por demanda, ou seja, sempre que necessário e não de forma linear, como um programa desenvolvido em Pascal ou C. Suas funções são executadas sempre que algum evento ocorrer, como exemplo, a solicitação de desligar o computador por parte do usuário. 2 Figura 1.1 – IBM-PC e MS-DOS Figura 1.2 – Microsoft Windows Vista 3 Figura 1.3 – MAC OS X Figura 1.4 – Mandriva Linux 4 Figura 1.5 – Kurumin Linux (Brasileiro) 1.2 - Funções Básicas 1.2.1 - Facilitar o acesso aos recursos do sistema Um computador possui diversos dispositivos, como monitor, entradas USB, disco rígido, etc. O sistema operacional facilita o acesso a estes dispositivos, tornando essa operação transparente para os usuários. Por exemplo, quando se vai ler ou gravar um arquivo em disco, você não sabe o que esta ocorrendo, apenas executa o comando que faz a gravação, mas quem cuida de todo o processo de gravação, que vai de posicionar o cabeçote na trilha e no setor certo, para depois fazer a gravação, desde o início da operação e até o término da mesma, é o sistema operacional. É o sistema operacional que comanda todo o funcionamento do computador, seja de hardware, seja de software. 5 1.2.2 - Compartilhamento de Recursos O Sistema Operacional cuida de compartilhar os recursos de forma organizada, como por exemplo, gerenciar o compartilhamento de uma impressora em rede. Quando um usuário manda um arquivo para a impressora, este arquivo é colocado em uma fila de impressão para depois ser impresso. Se a impressora estiver compartilhada e algum outro usuário mandar outro arquivo para a impressora, este entrará ao final da fila de impressão e, caso haja algum arquivo sendo impresso, o sistema operacional irá esperar o primeiro arquivo terminar a impressão para depois imprimir o segundo arquivo. Tudo isto ocorre sem a intervenção do usuário, ou sem mesmo que o usuário saiba o que está acontecendo. 1.3 - Máquina de Níveis Antes do surgimento do Sistema Operacional, para utilizar o computador, fazer algum programa, era necessário um profundo conhecimento do hardware que seria usado. Com o surgimento do Sistema Operacional, essa operação ficou mais rápida e eficiente. O programador não precisava mais conhecer o hardware para fazer seus programas, pois os usuários passaram a interagir com o sistema operacional e não diretamente com o hardware. O computador pode ser considerado como uma máquina de níveis, onde existem dois níveis, sendo o hardware o nível mais baixo e o sistema operacional o nível logo acima. Mas esses níveis podem, e devem, serem expandidos para quantos níveis forem necessários. computadores estão estruturados da seguinte forma: Atualmente, os 6 Figura 1.6 – Máquina de Níveis Pensando no computador na forma de máquina de níveis, para poder trabalhar em apenas um nível não é necessário o conhecimento dos outros níveis acima ou abaixo. 1.4 – Histórico A evolução dos sistemas operacionais esta diretamente ligada à evolução dos computadores em si. Vamos dividir o histórico dos Sistemas Operacionais em décadas, desde o seu surgimento até os dias de hoje. Antes da década de 1940, várias pesquisas foram feitas na tentativa de criar uma máquina capaz de realizar cálculos de forma rápida e precisa. Ordem Cronológica - em 1642, o matemático francês Blaise Pascal inventou uma máquina de somar; - em 1673, o matemático e filósofo alemão Gottfried Leibniz, inventou uma máquina capaz de somar e multiplicar. - em 1820, o francês Charles Colmar inventou uma máquina capaz de efetuar as quatro operações. 7 - em 1822, o matemático inglês Charles Babbage, considerado o pai do computador, criou uma máquina para cálculos de equações polinomiais. - em 1833, ele fez outra máquina capaz de executar qualquer tipo de operação chamada Máquina Analítica, que nunca funcionou como deveria. Foi o invento mais próximo do computador. Babbage tinha uma secretaria chamada Ada Byron. Babbage cuidava da parte mecânica enquanto Ada cuidava das instruções a serem executadas, por isso é considerada por muitos como a primeira programadora da história. - em 1854, o matemático inglês George Boole criou a lógica booleana, que é usada até hoje. - no fim do século XIX, Herman Hollerith criou os tão famosos cartões perfurados e foi o fundador de uma empresa que viria a se tornar a IBM. - na década de 1930, o alemão Konrad Zuse desenvolveu o Z-1. Nos EUA, John Vicent Atanasoff e Clifford Berry desenvolveram uma máquina para cálculo de equações lineares, que é considerada por muitos como sendo o primeiro computador eletrônico da história. - em 1937, o matemático inglês Alan Turing desenvolveu a idéia de uma máquina capaz de executar uma seqüência de operações que ficou conhecida como a Máquina de Turing. 1.4.1 – Década de 1940 Uma das coisas que alavancou a evolução da computação foi a Segunda Guerra Mundial. Em 1943, Alan Turing estava envolvido em um projeto de uma máquina para decifrar códigos. Nos EUA, em 1944 foi construído o primeiro computador eletromecânico, batizado de Mark I, desenvolvido pelo professor Howard Aiken, da Universidade de Harvard com apoio da IBM e utilizava os mesmos princípios da Maquina Analítica de Babbage. O ENIAC (Eletronic Numerical Integrator and Calculator) é considerado o primeiro computador digital e eletrônico. Desenvolvido pelos engenheiros J. Presper Eckert e John W. Mauchly, na Universidade da 8 Pensilvânia. O ENIAC ficou em operação entre 1946 a 1955. Sua estrutura possuía mais de 17 mil válvulas, 10 mil capacitores, 70 mil resistores e pesava 30 toneladas. Consumia cerca de 140 quilowatts e era capaz de realizar 5 mil adições por segundo. O ENIAC não possuía sistema operacional e para ser utilizado era necessário o conhecimento do hardware, sendo feita a programação em painéis. Figura 1.7 – Parte do ENIAC O professor John von Neumann, imaginou uma máquina que utilizasse uma memória única, onde os dados e a instruções seriam armazenados. Esse conceito é conhecido como “programa armazenado”, que é a base da arquitetura da computação atual, chamada de “Arquitetura von Neumann”. 9 1.4.2 – Década de 1950 O uso de transistor e da memória magnética contribuiu para o avanço da computação. O transistor permitiu o aumento da velocidade de processamento e a memória magnética o acesso mais rápido aos dados. Os primeiros computadores transistorizados foram lançados comercialmente apenas no final da década de 50. Em 1946, os criadores do ENIAC, criaram o UNIVAC (Universal Automatic Computer), que foi o primeiro computador que funcionou efetivamente. Em 1951, o MIT (Massachusetts Instituite of Technology – Instituto de Tecnologia de Massachusetss) colocou em operação o primeiro computador voltado para processamento em tempo real, o Whirlwind I, que foi o primeiro a utilizar memória magnética. Os programas eram feitos em cartões perfurados, que eram gravados em uma fita de entrada que, depois era lida pelo computador, que executava os programas um a um, gravando o resultado em uma fita de saída. A fita de saída era lida e impressa. Esse tipo de processamento é chamado de processamento em lote ou “processamento batch”. O primeiro sistema operacional foi desenvolvido em 1953, pelos usuários do IBM 701 do Centro de Pesquisas da General Motors, que depois esse sistema seria reescrito para um IBM 704 pelos usuários da IBM. Com o surgimento das primeiras linguagens de programação de alto nível, como o FORTRAN, ALGOL e COBOL, os programas deixaram de ter relação direta com o hardware. Os Sistemas Operacionais evoluíram também e foram incorporados a eles rotinas para operações de Entrada/Saída (Input/Output Control System). Isso liberava os programadores a não ter mais que escrever essas rotinas. No final da década de 1950, a Universidade de Manchester na Inglaterra desenvolveu o sistema operacional Atlas, quem introduziu a ideia de paginação por demanda. 10 1.4.3 – Década de 1960 A década de 1960 foi um marco nas inovações na área de Sistemas Operacionais, houve aumento no poder de processamento e diminuição do tamanho dos computadores. Surgiram às técnicas de multiprogramação, multiprocessamento, time-sharing e memória virtual. Antes da multiprogramação, enquanto um programa executava uma operação de entrada/saída, o processador ficava ocioso, esperando a operação terminar. Em 1963, a Burroughs lança o B-5000 com o sistema operacional Master Control Program (MCP), que implementava multiprogramação, memória virtual, multiprocessamento assimétrico, e foi o primeiro sistema desenvolvido em linguagem de alto nível. No mesmo ano, a Control Data Corporation, lançou o primeiro supercomputador PCDC6600. Em 1964, a IBM lança o System/360, que era uma máquina de porte menor, mas que poderia ser expandido. O System/360 usava o sistema operacional OS/360, que implementava todas as características anteriormente citadas. Cada programa poderia utilizar o processador por intervalos determinados de tempo, esse conceito é chamado de time-sharing, ou tempo compartilhado. Nesta década também surgiram os terminais de vídeo e teclados, dispositivos de E/S, permitindo a interação do usuário com a aplicação enquanto era executada, de onde surgiu o conceito de sistema online. Em 1965, a Bell Labs, o MIT e a General Eletrics estavam envolvidos no projeto do sistema operacional MULTICS (Multiplexed Information and Computing Service). O MULTICS implementava memória virtual com paginação e segmentação. A Digital Equipament Corp. (DEC), lançou o PDP-8, que era o primeiro computador de pequeno porte. Em 1969, Ken Thompson criou o sistema operacional Unix, utilizando um PDP-7. 11 1.4.4 – Década de 1970 Em 1970, a DEC lança o PDP-11, posteriormente o VAX/MMs, de 32 bits. Em 1971, a Intel produz seu primeiro microprocessador, o Intel 4004, e três anos depois o 8080, utilizado no primeiro microcomputador, o Altair. Posteriormente, a Zilog lançaria o processador Z80. Em 1976, Steve Jobs e Steve Wozniak produzem o Apple II de 8 bits. Neste ano surgiram as duas grandes do mundo dos softwares conhecidas atualmente, a Apple e a Microsoft. O sistema operacional mais utilizado na época era o CP/M(Control Program Monitor) da Digital Research. Também em 1976, foi lançado o Cray-1, contendo 200.000 circuitos integrados e realizando 100 milhões de operações de ponto flutuante por segundo (100 MFLOPS). Nesta década surgiram as redes distribuídas e, com elas, os protocolos de comunicação como o TCP/IP. Também surgiram as primeiras LANs. Duas linguagens de programação foram desenvolvidas nesta década. Em 1971, Niklaus Wirth desenvolvem a linguagem Pascal. Em 1975, Dennis Ritchie desenvolve a linguagem C, e juntamente com Ken Thompson, reescrevem o sistema operacional Unix, em linguagem C, para um PDP-11. 1.4.5 – Década de 1980 Em 1981, a IBM cria o primeiro computador pessoal, chamado IBM PC. O primeiro PC utilizava o processador Intel 8088 de 16 bits e o sistema operacional MS-DOS (Microsoft Disk Operating System). A Universidade de Berkeley na Califórnia desenvolveu sua própria versão do Unix, chamada de BSD (Berkeley Software Distribution) e introduziu vários melhoramentos, com destaque para o TCP/IP. Em 1982, a Sun Microsystems lança as primeiras estações RISC com o sistema operacional SunOS, que viria a se tornar o Solaris. Com a evolução dos microcomputadores, surgiram os primeiros sistemas operacionais com interface gráfica, com o Microsoft Windows e o IBM 12 OS/2. Surgem os sistemas operacionais de rede, como o Novell Netware e o Microsoft LAN Manager. Nota: entre os anos de 1982 e 1986, foi desenvolvido no Núcleo de Computação Eletrônica da Universidade Federal do Rio de Janeiro (NCE/UFRJ) o sistema operacional PLURIX para o computador PEGASUS, também construído no NCE. 1.4.6 – Década de 1990 A evolução da microeletrônica permitiu o desenvolvimento de processadores cada vez mais baratos e menores, dispositivos de E/S menores, mais rápidos e com maior capacidade de armazenamento. Os componentes baseados em VLSI evoluem para ULSI (Ultra Large Scale Integration). Houve o surgimento oficial da Internet, o protocolo TCP/IP passou a ser padrão. A arquitetura Cliente/Servidor passa a ser amplamente utilizada, com o avanço da Internet. A década de 1990 consolidou os sistemas operacionais baseados em interface gráfica. Surgiram os sistemas operacionais Microsoft Windows, os Unixes HP-UX, IBM-AIX e o Solaris. Outro fato importante, o surgimento de sistemas operacionais como o Linux, e o FreeBSD, e do movimento pelo software livre e Open Source. 1.4.7 – Dias atuais – Década de 2000 No final da década de 90, a Microsoft já lançava a família de sistemas operacionais Windows 2000 e também o Windows Milenium. Alguns anos após, o surgimento do Windows XP. O Windows XP também foi somente considerado após o Service Pack 2, que praticamente reescreve o kernel do sistema e incorpora diversos drivers e uma boa dose de segurança. Em janeiro de 2007, a Microsoft lançou o sistema operacional Windows Vista, que nada mais é do que uma versão mais pesada, com mais firulas de segurança e telinhas engraçadas, porém pouco funcional e um consumidor 13 voraz de hardware, além de ser um péssimo gerenciador de recursos. Porém, a Microsoft se redimiu dois anos mais tarde, com o Windows 7, um sistema operacional muito bem feito, com visual atraente e boa usabilidade. Outro fato importante é o advento e popularização de celulares e smartphones, fazendo com que os sistemas operacionais para esses dispositivos também evoluíssem bastante e novos sistemas surgiram, como o caso do Google Android, o Blackberry da RIM, o Apple iOS e outros. Figura 1.8 – Motorola Millestone com Android 1.5 – Tipos de Sistemas Operacionais Os sistemas operacionais evoluíram continuamente com a evolução do hardware. Muitos conceitos foram surgindo e mudando ou sendo substituídos por outros e muitos outros foram apenas mudando de nome. Com os sistemas operacionais aconteceu a mesma coisa. Continuaram chamando sistema operacional, mas foram incorporados conceitos, uma espécie de classificação. Os sistemas operacionais podem ser classificados em três tipos: Sistemas Monoprogramáveis / Monotarefa, Sistemas Multiprogramáveis / Multitarefa e Sistemas com Múltiplos Processadores ou Sistemas Multiprocessados. A seguir vãos estudar esses três tipos. 14 1.5.1 – Sistemas Monoprogramáveis/Monotarefa Sistemas Monoprogramáveis ou Sistemas Monotarefas, como o próprio nome diz, são sistemas feitos para a execução de um único programa ou uma única tarefa. Esses sistemas têm como características permitir que todos os recursos computacionais fiquem exclusivamente dedicados a uma mesma tarefa. Esses sistemas também ficam dedicados a um único usuário, chamados assim de sistema monousuário. Uma vantagem desse tipo de sistema operacional é a fácil implementação, pois não existe a preocupação com o compartilhamento de recursos, como o uso da memória ou uma operação de entrada/saída. Uma desvantagem é exatamente a monoprogramação, pois enquanto um programa executa uma operação de entrada/saída o processador fica ocioso aguardando o término da operação. 1.5.2 – Sistemas Multiprogramáveis/Multitarefa Os Sistemas Multiprogramáveis ou Multitarefa são uma evolução dos sistemas monoprogramáveis. Neste tipo de sistema, os recursos computacionais, como memória e processador são compartilhados por diversas aplicações e usuários. Nestes sistemas, diferentemente dos sistemas monoprogramáveis, enquanto um programa espera por uma operação de entrada/saída, outros programas podem estar em execução. Nestes casos, quem se preocupa em fazer o gerenciamento do acesso aos recursos de forma correta é o sistema operacional. Uma das vantagens do uso desses sistemas é o tempo de resposta das aplicações, que é mais curto, mas a implementação desses sistemas é muito mais complexa devido ao compartilhamento de recursos. Os Sistemas Multiprogramáveis podem ser classificados de acordo com o número de usuários que interagem com o sistema. Eles podem ser monousuários se apenas um usuário interage com o sistema, monopolizando 15 todos os recursos do mesmo, e podem ser multiusuário, se mais de um usuário interage com o sistema ao mesmo tempo. Outra classificação dada aos sistemas multiprogramáveis podem ser devido a como o sistema faz o gerenciamento das aplicações. Os sistemas podem ser divididos em sistemas batch(em lote), sistemas de tempo compartilhado e sistemas de tempo real. Esses sistemas podem suportar mais de um tipo de classificação. 1.5.2.1 – Sistemas Batch(em lote) Os sistemas batch foram os primeiros sistemas multiprogramáveis que surgiram. O processamento batch tem por característica de não exigir interação com o usuário. Todos os programas são executados sequencialmente, um após o outro, sendo gravados em uma fita de entrada, depois são processados e gravados em uma fita de saída e então impressos. Esses sistemas podem ser bastante eficientes devido à boa utilização do processador, mas podem ter tempos de respostas longos. Atualmente, os sistemas implementam ou simulam o processamento batch, mas não são dedicadamente batch. 1.5.2.2 – Sistemas de tempo compartilhado Sistemas de tempo compartilhado (time-sharing) permitem que diversos programas utilizem o processador em um determinado espaço de tempo, denominados time slice. Caso o programa não termine a execução nesse espaço de tempo, o sistema operacional interrompe o processo e coloca outro processo em execução, até que termine o time slice desse processo e o processo anterior volte à execução. Os sistemas de tempo compartilhado permitem a interação do usuário com sistema, durante a execução de um processo. Desta forma é possível verificar o status do processo, e se necessário, até interromper a sua execução. Devido a esta interação, os sistemas de tempo compartilhado também são chamados de sistemas on-line. 16 1.5.2.3 – Sistemas de tempo real Os sistemas de tempo real são bem parecidos com o sistema de tempo compartilhado, o que os diferencia é o tempo de processamento. Nos sistemas de tempo real, o tempo de processamento deve obedecer a limites rígidos. Nos sistemas de tempo real, um programa utiliza o processador o tempo que for necessário ou até que apareça outro programa com prioridade mais alta. Esse nível de prioridade é definido pela própria aplicação e não pelo sistema operacional. 1.5.3 – Sistemas com Múltiplos Processadores Os sistemas com múltiplos processadores possuem, como o próprio nome diz, um ou mais processadores interligados e trabalhando em conjunto. Esses sistemas permitem que vários programas sejam executados ao mesmo tempo ou que um mesmo programa seja executado por vários processadores. Os conceitos empregados nos projetos de sistemas com múltiplos processadores se baseia nos mesmos princípios da multiprogramação. Além disso, possuem outras características muito importantes, tais como: - Escalabilidade: capacidade de ampliar o poder de processamento apenas adicionando novos processadores. - Disponibilidade: capacidade de manter o sistema operação mesmo em caso de falha de algum processador, de forma transparente. - Balanceamento de carga (load balancing): capacidade de distribuir a carga de processamento entre os diversos processadores, a partir da carga de um processador, o que garante um melhor desempenho. Os sistemas com múltiplos processadores podem ser classificados, em sistemas fortemente acoplados e sistemas fracamente acoplados. Essa classificação é feita em função de como é feita à comunicação entre os processadores e o compartilhamento da memória e dos dispositivos de entrada/saída. 17 1.5.3.1 – Sistemas Fortemente Acoplados Um sistema fortemente acoplado tem como principal característica vários processadores dividindo a mesma memória principal e os mesmos dispositivos de entrada/saída, todos sendo gerenciados por um único sistema operacional. Esses sistemas também são conhecidos como sistemas multiprocessados. Em sistemas multiprocessados são divididos em SMP (Symetric Multiprocessors – Multiprocessamento Simétrico) e NUMA(Non-Uniform Memory Access). Em sistemas SMP todos os processadores acessam a memória de forma uniforme e todos os processadores têm a mesma função. 1.5.3.2 – Sistemas Fracamente Acoplados Um sistema fracamente acoplado possui dois ou mais computadores conectados através de algum meio de comunicação. Cada sistema possui sua própria memória, processador, dispositivos de entrada/saída e sistema operacional. Nos sistemas fracamente acoplados normalmente são sistemas de pequeno porte computacional e estão interligados em rede ou por algum outro meio de comunicação. Esses sistemas fazem uma intercomunicação entre os hosts da rede, distribuindo o processamento e o armazenamento das informações, onde surgiram os sistemas operacionais de redes e os sistemas distribuídos. Os sistemas operacionais de redes permitem o compartilhamento de recursos entre os hosts da rede, de forma clara para o usuário. Em sistemas distribuídos, o sistema operacional esconde esses detalhes dos usuários, como se fosse um sistema único. Um exemplo de sistema distribuído são os clusters. Em cluster, existem dois ou mais computadores interligados por uma rede de alta performance e os usuários não sabem quantos são os nós do cluster.