fundamentos de sistema operacional- S.O
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

fundamentos de sistema operacional- S.O

  • 1,149 views
Uploaded on

fundamentos de sistema operacional

fundamentos de sistema operacional

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,149
On Slideshare
1,149
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
26
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. Um sistema operacional é um programa que gerencia o hardware do computador, ele também fornece uma base para os programas aplicativos e atua como intermediário entre o usuário e o hardware. Um aspecto interessante dos sistemas operacionais é, o quanto eles assumem diferentes abordagens ao cumprir estas tarefas. Os sistemas operacionais de mainframes são projetados basicamente para otimizar a utilização de hardware, os sistemas operacionais de computadores pessoais suportam jogos complexos, aplicações comerciais e tudo mais entre estes, já os sistemas de computadores do tipo palm são projetados de modo a oferecer um ambiente no qual o usuário possa interagir facilmente com o computador para executar seus programas. Assim, alguns sistemas operacionais são projetados para serem eficazes, outros para serem eficientes e outros para atender a alguma combinação de ambos os aspectos. Mas afinal o que é um Sistema Operacional? Um sistema operacional é uma parte importante de quase todos os sistemas de computação. Um sistema de computação pode ser grosseiramente dividido em quatro componentes: Hardware, sistema operacional, programas aplicativos e usuário. Na figura 1, vemos a relação entre esses componentes. Figura 1 - Visão abstrata dos componentes de um sistema computacional. O sistema operacional oferece os meios para a utilização apropriada dos recursos durante a operação do sistema de computação. Um sistema operacional é semelhante ao governo, ele não desempenha funções úteis para ele mesmo, apenas proporciona um ambiente no qual outros possam desempenhar tarefas úteis. Os sistemas operacionais podem ser compreendidos a partir de dois pontos de vistas: do usuário e do sistema. O ponto de vita do usuário. A perspectiva do usuário em relação ao computador varia dependendo da interface que estiver sendo utilizada. A maioria dos usuários de computador senta-se diante de um computador pessoal, tal sistema é projetado para que um único usuário monopolize seus recursos, de modo a maximizar o trabalho que o usuário esteja executados. Neste caso, o sistema operacional é projetado principalmente para facilidade de uso, com alguma atenção dada ao desempenho e nenhuma atenção à utilização de recursos. O desempenho é importante para o usuário, mas não importa se a maioria do sistema permanece ociosa, esperando pela baixa velocidade de I/O do usuário. Alguns usuários colocam-se diante de um terminal conectado a um mainframe ou a um minicomputador. Outros usuários fazem acesso ao mesmo computador por intermédio de outros terminais. Estes usuários compartilham recursos e podem trocar informação. O sistema operacional é projetado para maximizar a utilização dos recursos, assegurando que todo o tempo de CPU, memória e I/O disponíveis sejam utilizados eficientemente e que nenhum usuário individual ocupe mais do que sua cota justa. Outros usuários ocupam estações de trabalho, conectados em rede com outras estações de trabalho e servidores. Estes usuários possuem recursos dedicados à sua disposição, mas também compartilham recursos tais como a rede e os servidores. Neste ambiente, o sistema operacional é projetado para estabelecer um
  • 2. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. compromisso entre usabilidade individual e utilização de recursos. Ultimamente, estão na moda muitas variedades de computadores do tipo palm. Estes dispositivos são na maioria monousuários, usados apenas por usuários individuais. Alguns são conectados a redes. Devido às limitações de energia e de interface, eles executam relativamente poucas operações remotas. Os sistemas operacionais são projetados principalmente objetivando usabilidade individual, embora o desempenho em relação ao tempo de vida da bateria também seja importante. Alguns computadores são pouco ou nada visíveis ao usuário, por exemplo os computadores de bordo de automóveis ou outros dispositivos. Basicamente eles e seus sistemas operacionais são projetados para operar sem intervenção do usuário. O ponto de vista do sistema. Do ponto de vista do computador, o sistema operacional é o programa mais íntimo do hardware. Podemos ver um sistema operacional como um alocador de recursos. Um sistema de computação tem muitos recursos que podem ser exigidos para resolver um problema: tempo de CPU, espaço de memória, espaço de armazenamento em arquivo, dispositivos de I/O, etc. O sistema operacional atua como o gerenciador destes recursos. Ao lidar com solicitações por recursos numerosas e possivelmente concorrentes, o sistema operacional precisa decidir como alocar tais recursos a programas e usuários específicos de modo que o sistema de computação possa ser operado com eficiência e justiça. Um enfoque ligeiramente diferente relacionado a um sistema operacional enfatiza a necessidade de controlar os diversos dispositivos de I/O e os programas de usuário. Um sistema operacional é um programa de controle que gerencia a execução dos programas de usuário para evitar erros e o uso impróprio do computador. Ele focaliza especialmente a operação e o controle dos dispositivos de I/O. Em geral, entretanto, não possuímos uma definição adequada de um sistema operacional. Sistemas operacionais, existem porque eles representam uma maneira razoável para resolver o problema de criar um sistema de computação utilizável. O objetivo fundamental dos sistemas de computação é executar os programas dos usuários e facilitar a resolução dos problemas. É com este objetivo que o hardware do computador é construído. Os programas aplicativos são desenvolvidos tendo em vista que o hardware puro não é particularmente fácil de ser utilizado. Estes programas requerem determinadas operações comuns, como as que controlam os dispositivos de I/O. As funções comuns de controle e alocação de recursos são então reunidas em um tipo de software: o sistema operacional. Além disso, não existe uma definição universalmente aceita sobre o que compõe o sistema operacional. Uma forma simplista de ver é que ele inclui tudo que um vendedor monta quando você encomenda “o sistema operacional”. Entretanto, os requisitos e facilidades de armazenamento incluídos variam muito entre os sistemas. Uma definição mais comum é que o sistema operacional é o programa (usualmente chamado de Kernel) que permanece em execução no computador durante todo o tempo e todos os demais são programas aplicativos. Objetivos do sistema. É mais fácil definir um sistema operacional pelo que ele faz do que pelo que ele é, mas mesmo isso pode ser complicado. O primeiro objetivo de qualquer sistema operacional é a eficácia para o usuário. Sistemas operacionais existem porque se espera que a computação seja mais fácil com eles do sem eles. Este ponto de vista fica mais claro quando você observa os sistemas operacionais de PCs de pequeno porte. O principal objetivo de outros sistemas operacionais é a operação eficiente do sistema de computação. Este é o caso dos grandes sistemas operacionais, compartilhados e com multiusuários. Tais sistemas são caros e portante é desejável fazê-los tão eficientes quanto possível. Estes dois objetivos são muitas vezes contraditório. No passado eficiência era muitas vezes mais importante que eficácia. Assim, muito da teoria dos sistemas operacionais concentrava-se no uso ótimo dos recursos computacionais. Os sistemas operacionais também evoluíram através dos tempos. Podemos dizer que os dois objetivos principais dos sistemas operacionais são: • Estender a máquina: tem como premissa garantir que haja um ambiente muito mais fácil de programa que o hardware, pois as formas que as chamadas de sistema são geradas para o sistema operacional são mais simples que as chamadas geradas para o hardware. • Gerenciar recursos: tem como premissa garantir que múltiplos usuários possam utilizar o sistema, gerenciando e protegendo a memória, os dispositivos de E/S e outros recursos. Para entendermos o que os sistemas operacionais são e o que eles fazem, devemos considerar a sua
  • 3. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. evolução. Traçando tal evolução, podemos identificar os elementos comuns dos sistemas operacionais e perceber como e por que estes sistemas evoluíram do modo como fizeram. Podemos notar que os sistemas operacionais e a arquitetura de computador tiveram grande influência mútua, ou seja, o desenvolvimento dos sistemas operacionais se deu para facilitar o uso do hardware, depois os sistemas operacionais propuseram mudanças no projeto do hardware para simplificá-lo. Nesta pequena revisão, observe como a identificação de problemas típicos do sistema operacional levou à introdução de novas facilidades no hardware. Podemos classificar os sistemas operacionais com base no hardware utilizado, da seguinte forma: • Sistemas Mainframe; • Sistemas de desktops; • Sistemas multiprocessadores; • Sistemas distribuídos; • Sistemas agrupados; • Sistemas de tempo real; • Sistemas palmer; Sistemas Mainframe. Foram os primeiros computadores usados para atender a muitas aplicações comerciais e científicas. Estes sistemas evoluíram desde os simples sistemas batch, onde o computador opera uma aplicação, até os sistemas de tempo compartilhado, passando pelos sistemas multiprogramados. Sistemas Batch. Os computadores iniciais eram, fisicamente, máquinas enormes operadas a partir de uma console. Os dispositivos de entrada corriqueiros eram as leitoras de cartão e os drives de fita. Os dispositivos comuns de saída eram as impressoras de linha, os drives de fita e as perfuradoras de cartões. O usuário não interagia diretamente com os computadores. Preferencialmente, o usuário preparava um job, que constituía do programa, dados e de alguma informação de controle sobre a natureza do job, e o submetia ao operador do computador. O job estava usualmente sob forma de cartões perfurados. Algum tempo mais tarde a saída aparecia. A saída consistia no resultado do programa, bem como em uma imagem da memória final e do conteúdo dos registradores, para depuração. Os sistemas operacionais neste computadores iniciais era um tanto simples. Sua maior tarefa era transferir automaticamente o controle de um job ao seguinte. O sistema operacional estava sempre residente na memória (Figura 2). Figura 2 - Esquema da memória para um sistema batch simples. Para aumentar a velocidade de processamento, os operadores reuniam os jobs em lotes com requisitos semelhante e os operavam no computador como um grupo. Assim, os programadores tinham que deixar seus programas com o operador. O operador classificaria os programas em lotes com requisitos semelhantes e, à medida que o computador ficasse disponível, operaria cada lote. A saída de cada job seria enviada de volta ao respectivo programador. Neste ambiente de execução, a CPU estava frequentemente ociosa. As velocidades dos dispositivos mecânicos de I/O eram intrinsecamente mais baixas do que as dos dispositivos eletrônicos. Mesmo uma CPU lenta trabalha em escala de microssegundo, com milhões de instruções por segundo. Uma leitora de cartões rápida, por outro lado, pode ler 1200 cartões por minuto (ou 20 cartões por segundo). Desta forma, a
  • 4. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. diferença de velocidade entre a CPU e seus dispositivos de I/O pode ser da magnitude de três ordens ou mais. Com o tempo, naturalmente, os avanças da tecnologia e a introdução dos discos resultaram em dispositivo de I/O mais rápidos. Entretanto, as velocidades da CPU aumentaram com maior expressão, e, assim, o problema não só não foi resolvido como foi exacerbado. A introdução da tecnologia de discos permitiu ao sistema operacional deixar todos os jobs em um disco, em vez de em uma leitora de cartões serial. Com acesso direto a vários jobs, o sistema operacional pode executar o agendamento de jobs de modo a utilizar os recurso e executar as tarefas eficientemente. Sistemas multiprogramados. O aspecto mais importante do agendamento dos jobs é a capacidade de multiprogramar. Um único usuário não pode, em geral, manter tanto a CPU como os dispositivos de I/O ocupados durante todo o tempo. A multiprogramação aumenta a utilizada da CPU organizando os jobs de modo que a CPU tenha sempre um deles para executar. Figura 3 - Esquema de memória para um sistema multiprogramável. A ideia é a seguinte: o sistema operacional mantém vários jobs na memória simultaneamente (Figura 3). Este conjunto de jobs é um subconjunto daqueles que estão agendados na fila, já que o número de jobs que pode ser mantidos ao mesmo tempo na memória é usualmente muito menor do que o número que pode estar na fila. O sistema operacional seleciona e começa a executar um dos jobs na memória. Em dado momento, o job pode ter que aguardar que alguma tarefa, como uma operação de I/O, seja completada. Em um sistema não multiprogramado, a CPU permaneceria ociosa. Em um sistema multiprogramado, o sistema operacional simplesmente redireciona para um novo job e o executa. Quando este job precisar aguardar, a CPU é redirecionada para um outro job, e assim por diante. Por fim, o primeiro job termina a espera e retoma a CPU. Considerando que pelo menos um job precise entrar em execução, a CPU nunca permanece ociosa. A multiprogramação é a primeira instância na qual o sistema operacional deve tomar decisões em favor dos usuários. Sistemas operacionais multiprogramados são, portanto, bastante sofisticados. Todos os jobs que entram no sistema são mantidos na fila de jobs. Esta fila compõe-se de todos os processos residentes em disco aguardando alocação na memória principal. Se diversos jobs estão prontos para serem carregados na memória e se não há espaço suficiente para todos, então o sistema deve escolher um dentre eles. A toma desta decisão corresponde ao agendamento de jobs. Quando o sistema operacional seleciona um job na fila, carrega-o na memória para execução. A manutenção de vários programas em memória ao mesmo tempo requer alguma forma de gerenciamento de memória, que iremos estudar mais à frente. Além disso, se diversos jobs estão prontos para execução ao mesmo tempo, o sistema deve escolher entre eles. Esta tomada de decisão é o agendamento da CPU. Finalmente, múltiplos jobs executando concorrentemente 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. Sistemas de tempo compartilhado. Sistemas batch multiprogramados propiciam um ambiente onde os diversos recursos do sistema são utilizados de forma eficiente, mas não propiciam a interação do usuário com o sistema computacional. Tempo compartilhado (ou multitarefa) é uma extensão da multiprogramação. A CPU executa múltiplos jobs permutando entre eles, mas as permutas ocorrem com tanta frequência que os usuários podem interagir com cada programa enquanto ele está em execução. Um sistema de computação interativo proporciona comunicação direta entre o usuário e o sistema. O
  • 5. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. usuário fornece instruções para o sistema operacional ou para um programa, diretamente, usando um teclado ou um mouse, e aguarda resultados imediatos. Em contrapartida, o tempo de resposta precisa ser curto, geralmente menor que 1 segundo. Um sistema operacional de tempo compartilhado permite que muitos usuários compartilhem o computador simultaneamente. Como cada ação ou comando em um sistema de tempo compartilhado tende a ser breve, apenas um pequeno tempo de CPU é necessário para cada usuário. Como o sistema permuta rapidamente de um usuário para o seguinte, cada usuário tem a impressão de que o sistema de computação inteiro está dedicado ao seu uso, mesmo que ele esteja sendo compartilhado entre muitos usuários. Um sistema operacional de tempo compartilhado usa o agendamento da CPU e a multiprogramação para prover cada usuário com uma pequena porção do computador de tempo compartilhado. Cada usuário tem pelo menos um programa separado na memória. Um programa carregado na memória e em execução é comumente denominado um processo. Quando um processo entra em execução, ele normalmente é executado por apenas um curto tempo antes que termine ou necessite executar I/O. O I/O pode ser interativo, isto é, a saída é exibida para o usuário e a entrada vem do teclado ou outro dispositivo. Considerando que o I/O interativo é executado normalmente na velocidade do usuário, pode levar um longo tempo para se completar. Ao invés de deixar a CPU ociosa enquanto esta entrada interativa acontece, o sistema operacional rapidamente a direcionará para o programa de algum outro usuário. Sistemas operacionais de tempo compartilhado são mais complexos do que sistemas operacionais multiprogramados. Em ambos, diversos jobs devem ser mantidos simultaneamente na memória, logo o sistema precisa possuir gerenciamento e proteção de memória. Para obter um tempo de resposta razoável, os jobs podem ser permutados entre a memória principal e o disco, que então funciona como uma memória secundária. Um método comum para alcançar este objetivo é a memória virtual, uma técnica que permite a execução de jobs que pode não estar completamente na memória. A principal vantagem do esquema de memória virtual é que os programas podem ser maiores do que a memória física. Além disso, ela sintetiza a memória principal em um grande e uniforme vetor de armazenamento, separando da memória física a memória lógica visualizada pelo usuário. Este esquema libera os programadores da preocupação com as limitação de armazenamento de memória. Sistema de tempo compartilhado devem também prover um sistema de arquivos. O sistema de arquivos reside em uma coleção de discos, deste modo, o gerenciamento de discos precisa estar disponível. Além disso, os sistemas de tempo compartilhado proveem um mecanismo para execução concorrente, o que requer sofisticados esquemas de agendamento da CPU. Para garantir a execução ordenada, o sistema deve fornecer mecanismos para sincronização e comunicação de jobs e deve assegurar que os jobs não ficarão bloqueados em um deadlock, eternamente esperando um pelo outro. A ideia de tempo compartilhado foi demonstrada desde 1960, mas como os sistemas de tempo compartilhado são difíceis e de construção dispendiosa, não se tornaram comuns até o início dos anos 1970. Embora algum processamento batch ainda seja executado, a maioria dos sistemas atuais são de tempo compartilhado. Consequentemente, a multiprogramação e o tempo compartilhado são os temas centrais dos modernos sistemas operacionais. Sistemas de Desktop. Os computadores pessoais apareceram nos anos 1970. Durante sua primeira década, as CPUs dos PCs não possuíam as facilidades necessárias para proteger um sistema operacional dos programas do usuário. Os sistemas operacionais dos PCs não eram, portanto, nem multiusuário nem multitarefa. Entretanto, os objetivos destes sistemas operacionais mudaram com o tempo, em vez de maximizar a utilização da CPU e dos periféricos, os sistemas operacionais optaram por maximizar a eficácia e a capacidade de resposta para o usuário. Os sistemas operacionais para estes computadores beneficiaram-se, de diversas maneiras, do desenvolvimento dos sistemas operacionais para mainframes. Os microcomputadores tornaram-se logo capazes de adotar algumas das tecnologias desenvolvidas para os sistemas operacionais maiores. Por outro lado, os custo de 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. Deste modo, algumas das decisões de projeto tomadas em relação aos sistemas operacionais de mainframes podem não ser apropriadas para sistemas menores. Outras decisões de projeto ainda se aplicam. Por exemplo, a proteção de arquivo não era, em
  • 6. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. princípio, necessária para uma máquina pessoa. Entretanto, estes computadores agora estão interligados a outros computadores em redes locais ou a outras conexões da Internet. Quando outros computadores e outros usuários podem ter acesso aos arquivos de um PC, a proteção de arquivos torna-se novamente uma característica necessária ao sistema operacional. A falta de tal proteção tem facilitado a programas predadores a destruição de dados em sistemas menos robustos. Características avançadas de tempo compartilhado, como memória protegida e permissões de arquivos, não são suficientes, por si só, para salvaguardar de ataques um sistema. Recentes quebras de segurança tem demonstrado isso. Sistemas multiprocessadores. A maioria dos sistemas, até então, são sistemas de um único processador, isto é, eles têm somente uma CPU principal. Entretanto, os sistema multiprocessadores (ou sistemas paralelos ou sistemas fortemente acoplados) estão crescendo em importância. Tais sistemas possuem mais que um processador em íntima comunicação, compartilhando o barramento do computador, o relógio e, algumas vezes, a memória e os dispositivos periféricos. Os sistemas multiprocessadores têm três vantagens principais: • Throughput aumentado: com o aumento do número de processadores, espera-se obter mais trabalho executado em menor tempo. A taxa incremental de velocidade com N processadores não é N, antes, é menor do que N. Quando múltiplos processadores cooperam em uma tarefa, está implícita uma certa quantidade de overhead para que se mantenham todas as partes trabalhando corretamente. Este overhead, mais a concorrência por recursos compartilhados, diminui o ganho esperado dos processadores adicionais. Do mesmo modo, um grupo de N programadores trabalhando em íntima cooperação não dá, como resultado, um montante de trabalho realizado aumentado N vezes. • Economia de escala: sistemas multiprocessadores podem economizar mais dinheiro que múltiplos sistemas com um único processador, porque eles podem compartilhar periféricos, memória de massa e suprimentos de energia. Se vários programas operam sobre o mesmo conjunto de dados, é mais barato armazenar estes dados em um disco, fazendo com que todos os processadores os compartilhem, do que manter muitos computadores com discos locais e muitas cópias dos dados. • Confiabilidade aumentada: se as funções podem ser distribuídas apropriadamente entre vários processadores, então a falha de um processador não interrompe o sistema, apenas o torna mais lento. Se temos dez processadores e um falha, então cada um dos ove processadores remanescentes deve compartilhar o trabalho do processador que falhou. Assim, o sistema inteiro opera somente 10% mais devagar, em vez de falhar completamente. Esta capacidade de continuar fornecendo serviço proporcionalmente ao nível do hardware remanescente é chamada degradação limpa. Sistemas projetados para atender à degradação limpa são também chamados de sistemas tolerantes a falhas. A operação continuada em presença de falhas requer um mecanismo para permitir que a falha seja detectada, diagnosticada e, se possível, corrigida. Os sistemas multiprocessadores mais comuns hoje em dia usam multiprocessamento simétrico (SMP), no qual cada processador executa uma cópia idêntica do sistema operacional, e estas cópias comunicam-se umas com as outras quando necessário. Alguns sistemas usam multiprocessamento assimétrico, no qual a cada processador é designada uma tarefa específica. Um processador mestre controla o sistema, os demais processadores ou se dirigem ao mestre para instruções ou possuem tarefas predefinidas. Este esquema define um relacionamento mestre-escravo. O processador mestre planeja e aloca trabalho para os processadores escravos. O SMP significa que todos os processadores são pares, não existe um relacionamento mestre-escravo entre eles. Cada processador executa concorrentemente uma cópia do sistema operacional. O benefício deste modelo é que muitos processadores podem operar simultaneamente, N processos podem ser executados se houve N CPUs, sem causar uma deterioração de desempenho significativa. Entretanto, devemos controlar cuidadosamente o I/O para assegurar que os dados alcancem o processador apropriado. Além disso, como as CPUs estão separadas, uma pode ficar ociosa enquanto outra está sobrecarregada, resultando em ineficiência. Estas ineficiências podem ser evitadas se os processadores compartilharem determinadas estruturas de dados. Um sistema multiprocessador deste tipo possibilitará que processos e recursos sejam compartilhados dinamicamente entre os vários processadores. A diferença entre os multiprocessadores simétrico e assimétrico pode ser resultante tanto do hardware quando do software. Um hardware especial pode diferenciar os processadores múltiplos, ou o software pode ser escrito para permitir somente um mestre e vários escravos. À medida que os
  • 7. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. microprocessadores tornam-se mais baratos e mais poderosos, funções de sistema operacional adicionais são atribuídas aos processadores escravos. Sistemas distribuídos. Uma rede é, simplesmente, uma via de comunicação entre dois ou mais sistemas. Sistemas distribuídos dependem da interconexão em rede para realizarem comunicação, os sistemas distribuídos conseguem compartilhar tarefas computacionais e oferecer um rico conjunto de facilidades aos usuários. Sistemas Cliente-Servidor. À medida que os PCs têm se tornado mais rápidos, mais poderosos e mais baratos, os projetistas têm se afastado da arquitetura de sistemas centralizados. Terminais conectados a sistemas centralizados estão agora sendo suplantados por PCs. Ao mesmo tempo, as funcionalidades de interface com usuário que costumavam ser manejadas diretamente por sistemas centralizados estão, cada vez mais, sendo manejados por PCs. Como resultado, os sistemas centralizados atuam, hoje, como sistemas servidores para satisfazer requisitos gerados por sistemas clientes. Sistemas paralelos. O crescimento das redes de computadores tem influenciado profundamente o desenvolvimento recente dos sistemas operacionais. Quando os PCs foram introduzidos nos anos 1970, eles eram projetados para uso pessoal e eram geralmente considerados computadores monousuários. No anos 1980, com o início da expansão do uso público da Internet para correio eletrônico, ftp, etc, muitos computadores se conectaram a redes de computadores. Com a introdução da Web, na metade dos anos 1990, a conectividade para rede tornou-se componente essencial de um sistema computacional. Em contraste com os sistemas fortemente acoplados vistos anteriormente, as redes de computadores usadas nestas aplicações compõem-se de uma coleção de processadores que não compartilham memória ou relógio. Em vez disso, cada processador tem sua memória local. Os processadores intercomunicam-se através de diversas linhas de comunicação, como barramentos de alta velocidade ou linhas telefônicas. Estes sistemas são usualmente conhecidos como sistemas fracamente acoplados. Alguns sistemas operacionais absorveram o conceito de redes e sistemas distribuídos além da noção de prover conectividade em rede. Um sistema operacional de rede é um sistema operacional que oferece facilidades como compartilhamento de arquivos e que inclui um esquema de comunicação que permite a troca de mensagens entre processos diferentes em computadores diferentes. Um computador que execute um sistema operacional de rede age autonomamente em relação a todos os outros computadores na rede. Um sistema operacional distribuído é um ambiente menos autônomo. Os diferentes sistemas operacionais comunicam-se suficientemente próximos para cria a ilusão de que somente um único sistema operacional controla a rede. Sistemas agrupados (clusters). Como os sistemas paralelos, os sistemas agrupados reúnem múltiplos PCs para desenvolver trabalho computacional. Entretanto, estes sistemas diferem dos sistemas paralelos no sentido de que são compostos de dois ou mais sistemas individuais acoplados. A definição do termo agrupamento não é correta, muitos pacotes comerciais divergem com relação ao que um sistema agrupado é, e por que uma forma é melhor do que outra. A definição geralmente aceita é que os sistemas agrupados compartilham memória e são proximamente conectados. O agrupamento é habitualmente utilizado para proporcionar alta disponibilidade ou então alto desempenho. Uma camada de software de agrupamento opera nos nós do agrupamento. Apesar dos avanços da computação distribuída, a maioria dos sistemas não oferece sistemas de arquivo distribuído de uso geral. Portanto, a maioria dos agrupamentos não permite acesso compartilhado aos dados no disco. Por isso, os sistemas de arquivos distribuídos devem oferecer controle e segurança de acesso aos arquivos para garantir que não ocorram operações conflitantes. Sistemas de tempo real. Uma outra forma de sistema operacional de uso específico é o sistema de tempo real. Um sistema de tempo real é usado quando requisitos de tempo rígidos são exigidos para a operação de um processador ou para o fluxo de dados, assim, ele é muito usado como dispositivo de controle em uma aplicação dedicada. Os sensores trazem dados para o computador. O computador deve analisar os dados e possivelmente ajustar os controles para modificar as entradas do sensor. Sistemas que controlam experimentos científicos, sistemas médicos de processamento de imagem, sistemas de controle industrial e certos sistemas de exibição são sistemas de tempo real. Alguns sistemas de injeção de combustível em automóveis, controladores de uso
  • 8. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. doméstico e sistemas bélicos são também sistemas de tempo real. Um sistema de tempo real possui restrições de tempo fixas e bem definidas. O processamento tem que ser realizado dentro das restrições definidas, ou o sistema irá falhar. Um sistema de tempo real somente funciona corretamente quando retorna o resultado correto dentro das suas restrições de tempo. Os sistemas de tempo real são de duas espécies: rígidos e flexíveis. Um sistema de tempo real rígido garante que tarefas críticas sejam completadas em tempo. Esta meta requer que todos os retardos no sistema sejam confinados, desde a recuperação de dados armazenados até o tempo que o sistema operacional leva para concluir qualquer solicitação a ele dirigida. Tais restrições de tempo definem as facilidades que estão disponíveis em sistemas de tempo real rígidos. Sistemas de tempo real flexível são menos restritivos, visto que uma tarefa de tempo real crítica tem prioridade sobre outras tarefas e retém esta prioridade até que se complete. Como nos sistemas de tempo real rígidos, os retardos do kernel do sistema operacional precisam ser confinados: uma tarefa de tempo real não pode ser mantida indefinidamente em espera até que o kernel possa processá-la. O tempo real flexível é um objetivo alcançável que pode ser mesclado a outros tipos de sistemas. Sistemas palmer. Estes sistemas incluem celulares, PDAs, tablets, etc. Os desenvolvedores destes sistemas encontram inúmeras dificuldades, a maior parte devido à limitação do tamanho dos dispositivos e ao seu hardware, que na maioria das vezes é muito conflitante. Como decorrência, o sistema operacional e as aplicações precisam gerenciar eficientemente o uso do hardware. Nestes sistemas o maior objetivo é maximizar a duração da bateria. Migração de características. De modo geral, um exame dos sistemas operacionais para mainframes e microcomputadores mostra que características antes disponível somente em mainframes foram adotadas pelos microcomputadores. Os mesmos conceitos são apropriados para as diversas classes de computadores, como podemos ver na figura abaixo. Figura 4 – Migração de conceitos e características dos sistemas operacionais Estruturas do Sistema Operacional.
  • 9. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. Um sistema operacional proporciona o ambiente dentro do qual os programas são executados. Internamente, os sistemas operacionais diferem grandemente em sua composição, sendo organizados de acordo com muitas linhas diferentes. O projeto de um novo sistema operacional é uma tarefa importante. Os objetivos do sistema devem estar bem definidos antes que o projeto se inicie. O tipo do sistema requerido é a base que orienta as escolhas entre vários algoritmos e estratégias. Um sistema operacional pode ser analisado segundo diversos critérios. Um deles é o exame dos serviços que ele oferece. Um outro é a avaliação da interface oferecida para usuários e programadores. Um terceiro é a desmontagem do sistema em seus componentes e interconexões. Vamos explorar estes três aspectos dos sistemas operacionais, analisando os pontos de vista de seus usuários, programadores e projetistas. Considerando quais serviços um sistema operacional oferece, como eles são oferecidos e que metodologias existem para o projeto de tais sistemas. Componentes do sistema. Podemos criar um sistema tão grande e complexo quanto um sistema operacional apenas particionando-o em módulos menores. Cada módulo deve ser uma porção bem delineada do sistema, com entradas, saídas, e funções cuidadosamente definidas. Obviamente, nem todos os sistemas têm a mesma estrutura. Entretanto, muitos sistemas modernos compartilham a função de suporte aos componentes apresentados a seguir. Gerenciamento de processos. Um programa não faz coisa alguma a menos que suas instruções sejam executadas por uma CPU. Um processo pode ser conceituado como um programa em execução. Um programa de usuário de tempo compartilhado, como um comilador, é um processo. Um programa de processamento de texto sendo operado por usuário individual em um PC é um processo. Uma tarefa do sistema, como enviar uma saída para uma impressora, é também um processo. Por ora, podemos considerar um processo como sendo um job ou um programa de tempo compartilhado, porém iremos entender que o conceito é mais geral. Um processo precisa de certos recursos – incluindo tempo de CPU, memória, arquivos e dispositivos de I/o – para desempenhar suas tarefas. Estes recursos podem ser fornecidos ao processo quando ele é criado ou podem ser a ele alocados durante a sua execução. Além dos vários recursos lógicos e físicos que um processo obtém quando é criado, diversos dados de inicialização (ou entradas) podem ser passados a ele durante sua execução. É importante enfatizar que um programa, por si só, não é um processo, um programa é uma entidade passiva, como os conteúdos de um arquivo armazenado em um disco, enquanto um processo é uma entidade ativa, com um contador de programa indicando a próxima instrução a ser executada. A execução de um processo deve ser sequencial. A CPU executa uma instrução do processo após a outra, até que o processo se complete. Além disso, em cada momento, no máximo uma instrução relacionada ao processo é executada. Assim, embora dois processos possam ser associados ao mesmo programa, eles não são jamais considerados duas sequências de execução separadas. É comum haver um programa que gera muitos processos enquanto está em execução. O processo é a unidade de trabalho de um sistema. Um sistema consiste em uma coleção de processos, alguns dos quais processos do sistema operacional (aqueles que executam código do sistema) e os demais processos de usuário (aqueles que executam código do usuário). Todos estes processos podem, em potencial, operar concorrentemente, multiplexando a CPU entre eles. O sistema operacional é responsável pelas seguintes atividades, juntamente com o gerenciamento de processos: • Criar e apagar os processos tanto do sistema como de usuário. • Suspender e recomeçar processos. • Fornecer mecanismos de sincronização de processos. • Fornecer mecanismos para comunicação entre processos. • Fornecer mecanismos para manipulação de deadlock. Gerenciamento de memória principal. Conforme já estudado a memória principal é essencial para a operação de um moderno sistema de computação. A memória principal é um grande vetor de palavras ou bytes que varia em tamanho, de centenas de milhares a bilhões. Cada palavra ou byte tem seu próprio endereço. A memória principal é um repositório
  • 10. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. de dados rapidamente acessíveis, compartilhados entre a CPU e os dispositivos de I/O. O processador central lê instruções a partir da memória principal durante o ciclo de busca de instrução, e tanto lê como grava dados também a partir da memória principal durante o ciclo de busca de dados. As operações de I/O implementadas via DMA também leem e grava dados na memória principal. A memória principal é em geral o único grande dispositivo de armazenamento que a CPU é capaz de endereçar e acessar diretamente. Para que um programa seja executado, ele precisa ser mapeado para endereços absolutos e carregado na memória. Enquanto o programa executa, ele acessa instruções e dados na memória gerando esses endereços absolutos. Em dado momento, o programa termina sua execução, seu espaço de memória é declarado disponível, e o próximo programa pode ser carregado e executado. No sentido de melhorar tanto a utilização da CPU quanto a velocidade de resposta do computador para seus usuários, é desejável que se mantenham diversos programas em memória. Muitos esquemas diferentes de gerenciamento de memória estão disponíveis, e a eficiência dos diversos algoritmos depende da situação em particular. A seleção de um esquema de gerenciamento de memória para um sistema específico depende de muitos fatores – em especial, do projeto de hardware do sistema. Cada algoritmo requer seu próprio suporte de hardware. O sistema operacional é responsável pelas seguintes atividades relacionadas ao gerenciamento de memória: • Monitorar as porções de memória que estão sendo correntemente usadas e por quem estão sendo usadas. • Decidir que processos estão prontos para ser carregados na memória quando o espaço de memória tornar-se disponível. • Alocar e desalocar espaço de memória conforme necessário. Gerenciamento de arquivos. O gerenciamento de arquivos é um dos componentes mais visíveis de um sistema operacional. Os computadores podem armazenar informação em diferentes tipos de mídia física. Cada tipo de mídia tem suas próprias características e sua própria organização física. Cada mídia é controlada por um dispositivo, como um drive de disco ou de fita que também tem características únicas. Estas propriedades incluem velocidade de acesso, capacidade, taxa de transferência de dados e método de acesso (sequencial ou randômico). Para o uso adequado do sistema de computação, o sistema operacional oferece uma visão lógica e uniforme do armazenamento da informação. O sistema operacional abstrai-se das propriedades físicas dos seus dispositivos de armazenamento focalizando a definição de uma unidade de armazenamento lógico, o arquivo. O sistema operacional organiza arquivos em mídias físicas e acessa estes arquivos via dispositivos de armazenamento. Um arquivo é uma coleção de informação relacionada, definida pelo seu criador. Comumente, os arquivos contêm programas (em ambas as formas, fonte e objeto) e dados. Arquivos de dados podem ser numéricos, alfabéticos ou alfanuméricos. Os arquivos podem ter formato livre ou podem ser rigidamente formatados. Um arquivo consiste em uma sequência de bits, bytes, linhas ou registros cujos significados são definidos por seus criadores. O conceito de arquivo é extremamente genérico. O sistema operacional implementa o conceito abstrato de arquivo gerenciando mídias de armazenamento de massa, como discos e fitas, e os dispositivos que as controlam. Além disso, os arquivos são normalmente organizados em diretórios para facilitar seu uso. Finalmente, quando múltiplos usuários fazem acesso aos arquivos, podemos querer exercer controle sobre quem pode acessar estes arquivos e de que modos eles podem ser acessados. O sistema operacional é responsável pelas seguintes atividades relacionada ao gerenciamento de arquivos: • Criar e apagar arquivos. • Criar e apagar diretórios. • Suportar primitivos para manipulação de arquivos e diretórios. • Mapear arquivos em memória secundária. • Criar cópias de arquivos em mídias de armazenamento não voláteis. Gerenciamento do sistema de I/O.
  • 11. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. Um dos objetivos de um sistema operacional é tornar transparente para o usuário as peculiaridades dos dispositivos específicos de hardware. Por exemplo no Unix, as peculiaridades dos dispositivos de I/O são escondidas do corpo do sistema operacional em si pelo subsistema de I/O. Este subsistema consistem em: • Um componente de gerenciamento de memória que inclui o armazenamento em buffers, o armazenamento em memória cache e o spooling. • Uma interface genérica para drivers de dispositivos. • Drivers para dispositivos específicos de hardware. Somente o drivers conhece as peculiaridades do dispositivo específico ao qual está associado. Gerenciamento de memória secundária. O principal objetivo de um sistema de computação é executar programas. Estes programas, com o dados que acessam, devem estar na memória principal, ou memória primária, durante a execução. Com a memória principal é muito pequena para acomodar todos os dados e programas, e como os dados que ela mantém se perdem quando falta energia, o sistema de computação deve fornecer memória secundária para copiar a memória principal. A maioria dos modernos sistemas de computadores utilizam discos como o principal meio de armazenamento on-line tanto para programas quanto para dados. A maior parte dos programas – incluindo compiladores, montadores, rotinas de classificação, editores e formatadores – é armazenada em disco até que seja carregada na memória, e deste modo utilizam o disco tanto como fonte quanto como destino de seu processamento. Assim, o monitoramento adequado da memória em disco é de importância primordial para um sistema de computação. O sistema operacional é responsável pelas seguintes atividades relacionadas ao gerenciamento de disco: • Gerenciamento de espaço livre. • Alocação de espaço de armazenamento. • Programação de alocação de disco. Como a memória secundária é utilizada como frequência, precisa ser utilizada de modo eficiente. A velocidade de operação de um computador pode depender das velocidades do subsistema de disco e dos algoritmos que manipulam este subsistema. Conexão em rede. Um sistema distribuído é uma coleção de processadores que não compartilham memória, dispositivos periféricos ou um relógio. Ao contrário, cada processador tem sua própria memória principal local e seu relógio, comunicando-se uns com os outros por intermédio de diversas linhas de comunicação, como barramento de alta velocidade ou redes. Os processadores em um sistema distribuído variam em tamanho e função. Podem incluir pequenos microprocessadores, estações de trabalho, minicomputadores e grandes sistemas de computadores de uso geral. Os processadores no sistema são conectados por intermédio de uma rede de comunicações, que pode ser configurada de diferentes modos. A rede pode ser total ou parcialmente conectada. O projeto da rede de comunicações deve considerar o roteamento das mensagens e as estratégias de conexão, além dos problemas de concorrência e segurança. Um sistema distribuído integra, em um único sistema coerente, sistemas fisicamente separados e possivelmente heterogêneos, proporcionando ao usuário o acesso aos vários recursos que o sistema possui. O acesso a um recurso compartilhado permite aumentar a velocidade de processamento, a funcionalidade, a disponibilidade dos dados e a confiabilidade. Os sistemas operacionais normalmente generalizam o acesso à rede, considerando-o como uma forma de acesso a arquivo, com detalhes de conexão sendo incluídos no driver do dispositivo de interface de rede. Os protocolos que dão origem aos sistema distribuídos podem ter grande influência na utilidade e popularidade desses sistemas. Sistema de proteção. Se um sistema de computação tem múltiplos usuários e permite a execução concorrente de múltiplos processos, então os vários processos precisam ser protegidos das atividades uns dos outros. Com este objetivo, alguns mecanismos garantem que arquivos, segmentos de memória, CPU e outros recursos possam ser operados somente por aqueles processos que tenham recebido autorização adequada do sistema
  • 12. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. operacional. A proteção define-se por qualquer mecanismo que objetive controlar o acesso dos programas, processos ou usuários aos recursos de um sistema de computação. Este mecanismo deve oferecer os meios para especificação dos controles a serem impostos e os meios para sua imposição. A proteção pode aumentar a confiabilidade identificando erros latentes nas interfaces entre os subsistemas componentes. A identificação precoce de erros de interface pode, com frequência, prevenir a contaminação de um subsistema saudável por outro que esteja com defeito. Um recurso desprotegido não pode se defender do uso (ou do mau uso) feito por um usuário desautorizado ou incompetente. Um sistema orientado para a proteção oferece meios para distinguir entre utilização autorizada e desautorizada. Sistema interpretador de comandos. Para um sistema operacional, um dos mais importantes programas de sistema é o interpretador de comandos, que é a interface entre o usuário e o sistema operacional. Alguns sistemas operacionais incluem o interpretador de comandos no kernel, outros sistemas tratam o interpretador de comandos como um programa especial que está em operação quando um job é iniciado ou quando um usuário estabelece sua primeira conexão (em sistemas de tempo compartilhado). Muitos comandos são fornecidos ao sistema operacional por declarações de controle. Este programa é algumas vezes denominado interpretador de cartões de controle ou interpretador de linhas de comando e é frequentemente conhecido como shell. Sua função é simples: obter a próxima declaração de comando e executá-la. Os sistemas operacionais são muitas vezes diferenciados na área do shell, com um interpretador de comandos amigável tornando o sistema mais agradável para alguns usuários. Shells mais poderosos, complexos e difíceis de aprender são preferidos por outros usuários. As próprias declarações de comandos lidam com a criação e o gerenciamento de memória secundária, com o gerenciamento de memória principal, com o acesso ao sistema de arquivos, com a proteção e com a conexão em rede. Serviços do sistema operacional. Um sistema operacional oferece um ambiente para a execução de programas. Ele fornece certos serviços aos programas e aos usuários desses programas. Naturalmente, os serviços específicos fornecidos diferem de um sistema operacional para outro, mas podemos identificar classes comuns. Esses serviços do sistema operacional destinam-se a atender ao programador, tornando mais fácil a tarefa de programar. • Execução do programa: o sistema deve ser capaz de carregar um programa na memória e executá-lo. O programa deve poder terminar sua execução tanto no modo normal quanto anormal (indicando o erro). • Operações de I/O: um programa em execução pode requerer I/O. Este I/O pode envolver um arquivo ou um dispositivo de I/O. Para dispositivos específicos, podem ser necessárias funções especiais. Para obter eficiência e proteção, os usuários normalmente não podem controlar os dispositivos de I/O diretamente. Portanto, o sistema operacional deve fornecer os meios para se fazer I/O. • Manipulação dos sistema de arquivos: o sistema de arquivos é de particular interesse. Obviamente, os programas precisam ler e gravar arquivos. Os programas necessitam também criar e apagar arquivos pelo nome. • Comunicações: em muitas circunstâncias, um processo precisa trocar informação com outro. Tal comunicação pode ocorrer de dois modos mais expressivos. O primeiro ocorre entre processos que estão sendo executados no mesmo computador, o segundo ocorre entre processos que estão sendo executados em computadores diferentes interligados por uma rede. As comunicações podem ser implementadas através da memória compartilhada ou pela técnica de troca de mensagens, na qual pacotes de informação são movimentados entre processos pelo sistema operacional. • Detecção de erros: o sistema operacional precisa estar constantemente atento a possíveis erros. Podem ocorrer erros no hardware da CPU ou da memória, nos dispositivos de I/O, e no programa do usuário. Para cada tipo de erro, o sistema operacional tem que executar a ação apropriada, de modo e garantir o processamento correto e contínuo. Além disso, existe um outro conjunto de funções do sistema operacional cujo objetivo não é auxiliar
  • 13. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. o usuário, mas assegurar a operação eficiente do próprio sistema operacional. Sistemas com múltiplos usuários podem obter eficiência compartilhando os recursos do computador entre os usuários. • Alocação de recursos: quando múltiplos usuários estão conectados ao sistema ou múltiplos jobs estão em execução ao mesmo tempo, é necessário alocar recursos a cada um deles. Muitos tipos de recursos diferentes são gerenciados pelo sistema operacional. Alguns podem ter associado um código de alocação especial, enquanto outros podem ter um código muito mais geral para solicitação e liberação. • Contabilização: queremos ter controle sobre quais usuários utilizam os recursos computacionais e quantos e quais tipos de recursos são utilizados. Os registros obtidos podem ser usados para contabilizar (e assim os usuários podem ser cobrados) ou, simplesmente, para acumular estatísticas de uso. As estatísticas de uso podem se constituir em ferramenta valiosa para os pesquisadores que desejem reconfigurar o sistema com o objetivo de melhorar os serviços de computação. • Proteção: os proprietários de informação armazenada em um sistema de computação multiusuário podem desejar controlar o uso daquela informação. Quando diversos processos disjuntos são executados concorrentemente, não deveria ser possível que um processo interferisse nos demais processos ou no próprio sistema operacional. A proteção envolve a garantia de que todo acesso aos recursos do sistema seja controlado. A segurança do sistema contra influências externas é também importante. Esta segurança começa com cada usuário tendo que se autenticar junto ao sistema, normalmente por meio de uma senha, para ter acesso autorizado aos recursos, continua com a defesa dos dispositivos externos de I/O contra tentativas de acesso inválido, e como o registro de todas essas conexões, para identificação de quebras de segurança. As precauções precisam ser implementadas para que um sistema seja protegido e seguro. Uma cadeia é tão forte quanto o seu elo mais fraco. Chamada de sistema. As chamadas de sistema constituem a interface entre um processo e o sistema operacional. Estas chamadas estão em geral disponíveis como instruções em linguagem de montagem e são usualmente incluídas nos diversos manuais usados pelos programadores. Determinados sistemas permitem que as chamadas de sistema sejam feitas diretamente a partir de um programa em linguagem de mais alto nível, caso em que as chamadas normalmente tomam a forma de uma função predefinida ou de chamadas a sub-rotinas. Elas podem gerar uma chamada a uma rotina especial em tempo de execução que faz a chamada de sistema, ou a chamada de sistema pode ser gerada diretamente. Diversas linguagens foram adotadas em substituição à linguagem de montagem na programação de sistemas. Essas linguagens permitem que as chamadas de sistema sejam diretamente realizadas. Chamadas de sistema ocorrem de diferentes maneiras, dependendo do computador em uso. Com frequência, faz-se necessária mais informações do que simplesmente o nome da chamada de sistema desejado. O tipo exato e a quantidade de informação variam de acordo com o sistema operacional em particular e com a chamada. Três métodos gerais são utilizados para passar parâmetros. A solução mais simples é passar os parâmetros em registradores. Entretanto, em alguns casos pode haver mais parâmetros do que registradores. Nestes casos, os parâmetros são em geral armazenados em um bloco ou tabela na memória, e o endereço do bloco é passado como um parâmetro em um registrador (Figura 5). Os parâmetros podem também ser colocados, ou incluídos, na pilha pelo programa, e extraídos da pilha pelo sistema operacional. Alguns sistemas operacionais preferem os métodos do bloco ou da pilha porque estas abordagens não limitam o número ou o tamanho dos parâmetros que estão sendo passados.
  • 14. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. Figura 5 – Passagem de parâmetros em forma de tabela. As chamadas de sistema podem ser classificadas, de modo geral, em cinco categoriais principais: controle de processo, gerenciamento de arquivo, gerenciamento de dispositivo, manutenção de informação e comunicações. Na lista abaixo temos um resumo dos principais tipos de chamadas de sistema normalmente fornecidas por um sistema operacional. • Controle de processo: ◦ end, abort, load, execute, create process, terminate process, get process atributes, set process atributes, wait for time, wait event, signal event e allocate and free memory. • Gerenciamento de arquivo: ◦ create file, delete file, open, close, read, write, reposition, get file attributes e set file attributes. • Gerenciamento de dispositivo: ◦ request device, release device, read, write, reposition, get device attributes, set device attributes e logically attach or detach devices. • Manutenção de informação: ◦ get time or date, set time or date, get system data, set system data, get process, file, or device attributes e set process, file, or device attributes. • Comunicações: ◦ create, delete communication conection, send, receive messages, transfer status information e attach or detach remote devices. Estrutura do sistema. Um sistema tão grande e complexo como um moderno sistema operacional deve ser cuidadosamente desenvolvido para funcionar apropriadamente e ser facilmente modificado. Uma abordagem comum é particionar a tarefa em pequenos componentes, em vez de desenvolver um sistema monolítico. Cada um deste módulos deve ser uma porção bem definida do sistema, com entradas, saídas e funções cuidadosamente definidas. Estruturas simples. Muitos sistemas comerciais não possuem uma estrutura bem definida. Frequentemente, tais sistemas operacionais começam como sistemas pequenos, simples e limitados e depois crescem além do seu escopo original. O MS-DOS é um exemplo de um sistema com esta característica. Ele foi originalmente projetado e implementado por poucas pessoas que não tinham ideia de que ele se tornaria tão popular. Foi escrito para oferecer o máximo de funcionalidades no menor espaço, e assim não foi cuidadosamente dividido. Podemos ver sua estrutura na Figura 6.
  • 15. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. Figura 6 – A estrutura de camadas do MS-DOS. Figura 7 – A estrutura do sistema UNIX O UNIX é um outro sistema que foi inicialmente limitado pela funcionalidade do hardware. Ele compõe-se de duas partes separadas: o kernel e os programas de sistema. O kernel é constituído de uma série de interfaces e drivers de dispositivos, que foram adicionados e expandidos ao longo dos anos em que o UNIX evoluiu. Na Figura 7 podemos visualizar o sistema operacional UNIX tradicional estruturado. Tudo que está abaixo da interface de chamada de sistema e acima do hardware físico é o kernel. O kernel fornece o sistema de arquivos, o agendamento da CPU, o gerenciamento de memória e outras funções do sistema operacional até as chamadas do sistema. Tudo somado, trata-se de um enorme montante de funcionalidades combinadas em um único nível. Isso torna o UNIX difícil de ser expandido, pois mudanças em uma seção poderiam afetar outras áreas de modo adverso. As chamadas de sistema definem a API para o UNIX, o conjunto de programas de sistema comumente disponíveis define a interface do usuário. As interfaces de usuário e de programador definem o contexto que o kernel deve suportar. Novas versões do UNIX são projetadas para utilizar hardware mais avançado. Dado o suporte de hardware próprio, os sistema operacionais podem ser divididos em peças menores e mais apropriadas do que aquelas permitidas pelos sistemas UNIX ou MS-DOS originais. O sistema operacional pode, então, deter um controle muito maior sobre o computador e sombre as aplicações que fazem uso desse computador. Os implementadores têm mais liberdade para fazer mudanças nas funções internas do sistema e para criar sistemas operacionais modulares. Sob a abordagem topdown, as funcionalidades e facilidades globais são determinadas e separadas em componentes. Esta separação permite aos programadores ocultar informação, eles ficam livres, portanto, para implementar as rotinas de baixo nível conforme lhes pareça melhor, contanto que a interface externa da rotina permaneça inalterada e que a própria rotina desempenhe a tarefa esperada. Abordagem em Camadas. A modularização de um sistema pode ser feita de muitas maneiras. Um dos métodos é a abordagem
  • 16. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. em camadas, na qual o sistema operacional é particionado em um número de camadas (ou níveis), cada uma delas construída sobre camadas mais baixas. A camada da base (camada 0) é o hardware, a mais alta (camada N) é a interface com o usuário. Uma camada do sistema operacional é uma implementação de um objeto abstrato definido como o encapsulamento dos dados e das operações que podem manipular aqueles dados. Uma camada típica do sistema operacional pode ser vista na Figura 8. Consiste em estruturas de dados e em um conjunto de rotinas que podem ser invocadas por camadas de nível mais alto. A camada M, por sua vez, pode invocar operações em camadas de nível mais baixo. Figura 8 – Uma camada do sistema operacional. A principal vantagem da abordagem em camada é a modularidade. As camadas são selecionadas de tal modo que cada uma delas use apenas funções (ou operações) e serviços das camadas de nível mais baixo. Este enfoque simplifica a depuração e a verificação do sistema. Cada camada é implementada focalizando-se apenas aquelas operações supridas pelas camadas de nível mais baixo. A camada não precisa saber como as operações de nível mais baixo estão implementadas, ela precisa saber, somente, o que estas operações fazem. Deste modo, cada camada esconde das camadas de nível mais alto, a existência de certas estruturas de dados, operações e hardware. A principal dificuldade da abordagem em camadas diz respeito ao cuidado na definição das camadas, porque uma camada só pode usar as que estão abaixo dela. Um outro problema concernente às implementações em camadas é que elas tendem a ser menos eficientes do que outras opções. Estas limitações têm provocado, nos últimos anos, algumas críticas contra a estruturação em camadas. Ultimamente, tem-se preferido um número menor de camadas com mais funcionalidades, mantendo-se a maior parte das vantagens do código modularizado e evitando-se os difíceis problemas de definição e interação das camadas Microkernels. À medida que o sistema operacional UNIX expandiu-se, o kernel tornou-se grande e difícil de gerenciar. Na metade dos anos 1980, pesquisas na Universidade de Carnegie Mellon desenvolveram um sistema operacional chamado Mach que modularizou o kernel, utilizando o enfoque do microkernel. Este método estrutura o sistema operacional removendo todos os componentes não essenciais do kernel e implementando-os como programas de nível de sistema e de usuário. O resultado é um kernel menor. Há pouco consenso sobre quais serviços deveriam permanecer no kernel e quais deveriam ser implementados no espaço do usuário. Entretanto, os microkernels proveem, em geral, gerenciamento de processos e de memória mínimos, adicionalmente a facilidade de comunicação. A principal função do microkernel é proporcionar facilidade de comunicação entre o programa cliente e os diversos serviços que estão também operando no espaço do usuário. A comunicação é fornecida por transmissão de mensagens. Os benefícios da opção microkernel incluem a facilidade de expandir o sistema operacional. Todos os novos serviços são adicionados ao espaço do usuário e, consequentemente, não exigem a modificação do kernel. Quando o kernel precisa ser modificado, as mudanças tendem a ser menores, porque o microkernel é um kernel reduzido. O sistema operacional resultante é mais fácil de ser transportador de uma arquitetura de
  • 17. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. hardware para outra. O microkernel também proporciona maior segurança e confiabilidade, já que a maioria dos serviços opera como processos de usuário. Se um serviço falhar, o restante do sistema permanecerá intocável. Projeto e implementação do sistema. Objetivos de projeto. O primeiro problema que enfrentamos ao projeto um sistema é a definição dos seus objetivos e especificações. No nível mais alto, o projeto do sistema será afetado pela escolha do hardware e do tipo do sistema: batch, tempo compartilhado, monousuário, multiusuário, distribuído, tempo real, ou de uso geral. Além do nível de projeto mais alto, os requisitos podem ser muito difíceis de especificar. Eles podem ser divididos em dois grupos básicos: objetivos do usuário e objetivos do sistema. Os usuários desejam certa propriedades óbvias em um sistema: ele deve ser eficaz e fácil de usar, fácil de aprender, confiável, seguro e rápido. Naturalmente, estas especificações não são particularmente úteis ao projeto do sistema, já que não há consenso geral sobre como alcançar tais objetivos. Um conjunto semelhante de requisitos pode ser definido por aquelas pessoas responsáveis por projetar, criar, manter e operar o sistema: o sistema operacional deve ser fácil de projetar, implementar e manter, deve ser flexível, confiável, livre de erros e eficiente. De novo, estes requisitos são vagos e não possuem solução geral. Não temos solução única para o problema de definir os requisitos para um sistema operacional. O grande número de sistema mostra que requisitos diferentes podem resultar em uma grande variedade de soluções para ambientes diferentes. Mecanismos e políticas. A especificação e o projeto de um sistema operacional é uma tarefa altamente criativa. Embora nenhum livro possa dizer como fazê-lo, existem princípios gerais de engenharia de software especialmente aplicáveis aos sistemas operacionais. Um importante princípio é a separação entre política e mecanismo. Os mecanismos determinam como fazer algo, as políticas determinam o que será feito. Por exemplo, o timer é um mecanismo para assegurar a proteção da CPU, mas a decisão de por quanto tempo o timer deve ficar ativo, para um determinado usuário, é uma decisão de política. A separação entre política e mecanismo é importante para a flexibilidade. As políticas provavelmente se modificam no espaço ou no tempo. No pior caso, cada mudança na política irá requerer alteração no mecanismo subjacente. Um mecanismo geral seria mais desejável. Uma mudança na política iria, então, exigir a redefinição de apenas alguns parâmetros do sistema. Sistemas operacionais baseados em microkernel levam ao extermo a separação entre mecanismo e política, implementando um conjunto básico de blocos de construção primitivos. Estes blocos são quase independentes de política, permitindo que mecanismos e políticas mais avançados sejam adicionados via módulos de kernel criados pelo usuário ou por meio dos próprios programas do usuário. No outro extremo está um sistema como Apple MacOS, no qual tanto o mecanismo como a política são incluídos no sistema para obrigar a percepção global do sistema. Todas as aplicações têm interfaces semelhantes porque a própria interface é construída no kernel. Devem ser realizadas decisões de política para todos os problemas de agendamento e de alocação de recursos. Sempre que a questão for como em vez de o que, é um mecanismo que deve ser determinado. Implementação. Uma vez que um sistema operacional tenha sido projetado, ele deve ser implementado. Tradicionalmente, os sistemas operacionais têm sido escritos em linguagem de montagem. Agora, entretanto, eles têm sido, com frequência escritos em linguagens de mais alto nível. As vantagens de usar uma linguagem de mais alto nível, ou pelo menos uma linguagem de implementação de sistemas, para implementar sistemas operacionais são as mesmas levadas em conta quando a linguagem é usada para programas aplicativos: o código pode ser escrito mais rapidamente, é mais fácil de compreender e depurar. Além disso, os avanças na tecnologia de compiladores irão melhorar o código gerado para o sistema operacional inteiro por meio de uma simples recompilação. Finalmente, um sistema operacional é mais fácil de portar se for escrito em uma linguagem de alto nível. Os que se opõem à implementação de um sistema operacional em linguagens de mais alto nível alegam como desvantagens a redução da velocidade e o aumento dos requisitos de armazenamento. Embora um programador experto em linguagem de montagem possa produzir rotinas pequenas e eficientes para
  • 18. Introdução aos Sistemas Operacionais – Aula 02 – 10/02/2012. Introdução aos Sistemas Operacionais. grandes programas, um moderno compilador é capaz de desenvolver análises complexas e de aplicar otimizações sofisticadas, produzindo excelente código. Os processadores modernos possuem fortes interligações e múltiplas unidades funcionais, que podem manipular dependências complexas e sobrepujar a limitada habilidade da mente humana em cuidar de detalhes. Assim como é verdade para outros sistemas, as mais significativas melhorias de desempenho nos sistemas operacionais parecem ser mais o resultado de estruturas de dados e algoritmos melhores do que da excelência do código em linguagem de montagem. Além disso, embora os sistemas operacionais sejam extensos, somente uma pequena quantidade de código é crítica para o alto desempenho. Depois que o sistema é escrito e está funcionando corretamente, rotinas que representem gargalos podem ser identificadas e substituídas por equivalentes em linguagem de montagem.