Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 1. Introdução Um Sistema Computacional consiste fundamentalmente em duas partes, que são o seu Hardware e o seu Software. Mas muitas pessoas vêem um computador apenas como um gabinete de circuitos eletrônicos, cabos e fontes de alimentação (hardware), se isto fosse verdade não teria nenhuma utilidade, porque é através de programas (softwares) que o computador consegue armazenar dados em discos, imprimir relatórios, gerar gráficos, realizar cálculos, entre outras funções. O hardware é o responsável pela execução das instruções de um programa, com a finalidade de realizar alguma tarefa. Podemos afirmar que uma operação efetuada pelo software pode ser implementada pelo hardware, enquanto que uma instrução executada pelo hardware não pode ser simulada em software. Nos primeiros computadores, a programação era realizada em painéis, através de fios, exigindo um grande conhecimento do hardware e de sua linguagem de máquina. A solução para este problema foi o surgimento do sistema operacional, que tornou a interação do usuário com o computador mais simples, confiável e eficiente. Partindo deste principio, podemos considerar o computador como uma máquina de níveis ou camadas, onde inicialmente existem dois níveis: o nível 0 (Hardware) e o nível 1 (Sistema Operacional). Os sistemas operacionais realizam basicamente duas funções não relacionadas: estender a máquina e gerenciar recursos. Como máquina estendida (fig. 1.1) ele tem como função apresentar uma máquina virtual mais fácil de ser programada do que a programação direta sobre o hardware. Desta maneira teremos uma plataforma intermediária entre o hardware e o programa de aplicação. Usuários Aplicação Aplicação Aplicação Sistema Operacional Hardware Fig. 1.1 - Sistema Operacional como máquina estendida Como gerenciador de recursos (Fig. 1.2) prove uma interface adequada com os usuários e gerencia todos os dispositivos de hardware. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Aplicação Aplicação Sistema Operacional Fig. 1.2 – Sistema Operacional como gerenciador de recursos Mas na realidade, um computador não possui apenas dois níveis, e sim tantos níveis quantos forem necessários para adequar o usuário às diversas aplicações. Atualmente, a maioria dos computadores possui a estrutura mostrada abaixo (fig. 1.3), podendo conter mais ou menos camadas. A linguagem utilizada em cada um desses níveis é diferente, variando da mais elementar (Baixo Nível) a mais sofisticada (Alto Nível). Aplicativos Utilitários Sistema Operacional Linguagem de Máquina Micropragramação Hardware Dispositivos Físicos Fig. 1.3 – Camadas atuais nos computadores 2. Histórico A evolução dos sistemas operacionais está, em grande parte, relacionada ao desenvolvimento de equipamentos cada vez mais velozes, compactos e de custos baixos, e à necessidade de um melhor gerenciamento do hardware ou o compartilhamento deste recurso, e criando uma interface mais amigável com o usuário, por meio de ícones e automatização de tarefas. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Mas como sabemos nem sempre foi assim que as máquinas trabalharam. Os primeiros computadores não possuíam sistema operacional e sua operação era realizada por técnicos especializados. 2.1 Primeira Geração (1945 – 1955) A primeira geração dos computadores utilizava válvulas e painéis de programação. Um grupo de pessoas projetava, programava, operava e realizava a manutenção do computador. A programação era feita em código absoluto e, muitas vezes, conectado plugs em painéis para controlar as funções básicas da maquina. Não existia linguagem de programação nem sistema operacional. Quando um programador necessitasse utilizar a máquina ela deveria ser reservada, assim inseria-se o painel de programação no computador com um programa pré-montado. No inicia da década de 50 surgiu os cartões perfurados assim tornou-se possível escrever programas em cartões e posteriormente carregá-los através de uma leitora de cartões. 2.2 Segunda Geração Nesta geração foi introduzidos o transistor e o sistema em lote (batch). O uso dos transistores tornou o computador confiável para que pudessem ser fabricados e comercializados. Estas máquinas são conhecidas como mainframes. Ficavam localizadas em ambientes especiais com ar-condicionado e eram operadas por profissionais especializados. Somente as grandes corporações ou importantes órgãos do governo ou universidades tinham recursos pra arcar com seu preço, na casa dos milhões de dólares, Os seguintes passos eram necessários para a execução dos programas: 1. O programador escreve o programa em um papel em Assembly ou Fortram. 2. Posteriormente é reescrito em cartões perfurados. 3. O conjunto de cartões era levado para a sala do computador para o operador. 4. O operador coloca na ordem para processamento. 5. Ao termino da execução do programa ou job o operador pega na impressora os resultados e o conjunto de cartões e coloca a disposição para o programador. 6. O operador pega novo conjunto de cartões e retorna ao passo 4. Com isso a perda de tempo era considerável. Uma vez que o computador era um produto cara desenvolveu-se um sistema para melhorar seu tempo de uso. Surge então o processamento (batch). O processo consistia em utilizar um computador menor e mais barato cuja função era ler vários conjuntos de cartões e armazenar em uma fita magnética, a seqüência de programas que finalmente eram lidos pelo computador principal. Os principais sistemas operacionais eram FMS (FORTRAM Monitor System) e o IBSYS da IBM. 2.3 Terceira Geração (1965 – 1980) Nesta geração os fabricantes possuíam duas linhas de maquinas totalmente incompatíveis. Uma linha era a dos computadores científicos, utilizados para cálculos numéricos e a outra era a dos computadores comerciais, utilizados para classificar e imprimir informações. Com isso ficava caro á comercialização dos mesmos e reduzia a possibilidade de clientes. A IBM veio com uma solução por meio do desenvolvimento do System/360. Era uma serie de maquinas compatíveis em nível de software que variavam em termos de capacidade. As principais diferenças estavam no preço e no desempenho (memória máxima, velocidade de processamento, numero de dispositivos de E/S permitidos, etc). Uma vez que todas as máquinas possuíam a mesma arquitetura e conjunto de instruções todos os programas desenvolvidos para uma máquina podiam ser aproveitados Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos nas demais maquinas da serie possibilitando uma melhor adequação às necessidades de cada cliente e a expansão futura. O /360 foi o primeiro computador em escala comercial a utilizar circuitos integrados em baixa escala o que proporcionou uma melhor relação preço/desempenho. Assim todos os outros fabricantes resolveram seguir a mesma estratégia. Entretanto criar uma família de computadores que rodassem o mesmo software e o mesmo sistema operacional resultou em um sistema operacional complexo e grande uma vez que: • Tinha que ser eficiente em maquinas com poucos periféricos e com muitos periféricos. • Tinha que funcionar em ambientes comerciais e científicos. • Tinha que ser eficiente para qualquer uso. Então assim surgiu o SO/360 e os sistemas operacionais semelhantes de 3ª geração. Surgiu o conceito de multiprogramação, para evitar a ociosidade do Processador quando se fazia uma pausa para troca de fitas ou outra operação, dividia-se a memória em varias partições, com um job diferente em cada uma delas. Outro importante recurso da geração foi a capacidade de ler jobs de cartões para disco assim que chegavam na sala do computador. A necessidade de tempo de resposta rápido abriu caminho para uma variante de técnica de multiprogramação chamado compartilhamento de tempo (time sharing). Houve também o crescimento fenomenal dos minicomputadores dando origem a toda uma nova industria. Também nesta geração um cientista da Bell Labs, Ken Thompson, descobriu um pequeno minicomputador que ninguém estava usando e começou a escrever uma versão simplificada monousuária que evolui para o SCO UNIX, que se tornou popular no mundo acadêmico, entre órgãos do governo e entre muitas empresas. 2.4 Quarta Geração (1980 – presente) Com o desenvolvimento dos circuitos LSI (Large Scale Integration – Integração em Larga Escala), deu-se inicio a era do computador pessoal. Assim como o minicomputador da terceira geração possibilitou que cada departamento em uma empresa ou uma universidade tivesse seu computador, o microprocessador possibilitou que as pessoas tivessem seu computador pessoal. Os primeiros foram chamados estações de trabalho. Na realidade são computadores pessoais de menor portes, normalmente conectados por uma rede. Com isso abriu o caminho para o crescimento da industria de software, principalmente aqueles que ignoravam tudo sobre computadores como também não tinham nenhuma intenção de aprender. Dois sistemas operacionais dominaram a cena do computador pessoal e das estações de trabalho no seu inicio, respectivamente o MS-DOS da Microsoft e o UNIX. O MS-DOS era amplamente utilizado na IBM-PC e em outras maquinas que empregavam CPU 8088 e seus sucessores 80286, 80386 e 80486. Mais tarde o Pentium e o Pentium PRO, até chegar o sucessor Windows. Os UNIX já em sua versão multiusuário dominavam as estações de trabalho e em outros computadores topo de linha, como os servidores de rede. Nesta geração houve um crescimento de redes de computadores pessoais, executando sistemas operacionais de rede e sistemas operacionais distribuídos. 3. Classificação Os sistemas operacionais podem ser classificados em: Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 3.1 Quanto ao Tipo de serviços Oferecidos ao Usuário Sistema de Processamento de Lotes (Batch): neste sistema em lote as varias tarefas a serem executadas são organizadas num dispositivo de entrada. Estas são lidas e processadas em ordem seqüencial de leitura; Sistema de Tempo Compartilhado (Time-Sharing): trabalha com multiprogramação, isto é, aceita várias tarefas residentes na memória ao mesmo tempo, para serem processadas concorrentemente, através de um mecanismo de divisão do tempo do Processador entre os processos; Sistema de Temp Real (Real-Time): são, em geral, sistemas dedicados a um tipo determinado de aplicação. Seus módulos são construídos de forma a atender requisitos de tempo. 3.2 Quanto ao Número de Usuários Mono Usuário: apenas um usuário utiliza todo o sistema de cada vez; Multi Usuário: vários usuários podem estar utilizando o sistema de modo compartilhado num dado instante. 3.3 Quanto do Tipo de Interação Batch: por submissão de tarefas (jobs) em lotes, através de uma linguagem de controle de jobs (JCL), sem interação Usuário X Computador; Interativo: pela interação direta do usuário com o sistema, via terminal de entrada e saída (do tipo teleimpressora ou teclado e display); Transacional: Chegada de uma transação (ou comando, ou mensagem) que “acorda” um módulo, de tratamento ou execução apropriado. 3.4 Quanto a Aplicação Dedicado: tem uso restrito a determinada aplicação (ex. controle de processos); De uso Geral: tem uso indeterminado para qualquer aplicação, isto é, executa todos os tipos de programas; Híbrido: combina os dois anteriores. 4. Conceitos de hardware e software 4.1 Hardware Todos os componentes de um computador são agrupados em três subsistemas básicos: unidade central de processamento, memória principal e dispositivo de entrada e saída. 4.1.1 Unidade Central de Processamento A unidade central de processamento (UCP), ou processador, tem como função principal unificar todo o sistema, controlando as funções realizadas por cada unidade funcional. A UCP também é responsável pela execução de todos os programas do sistema que, obrigatoriamente deverão estar armazenados na memória principal. A UCP é composta por dois componentes básicos: unidade de controle e unidade lógica e aritmética. A unidade de controle (UC) é responsável por controlar as atividades de todos os componentes do computador, mediante a emissão de pulsos elétricos (sinais de controle) gerado por um dispositivo denominado clock. Este controle pode ser a gravação de um dado no disco ou a busca de Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos uma instrução da memória. A unidade lógica e aritmética (ULA), como o nome indica, é responsável pela realização de operações lógicas (testes e comparações) e aritméticas (somas e subtrações). A especificação da velocidade de processamento de uma UCP é determinada pelo número de instruções que o processador executa por unidade de tempo, normalmente segundo. 4.1.2 Clock É um dispositivo, localizado na UCP, que gera pulsos elétricos síncronos em um determinado intervalo de tempo (sinal de clock). A quantidade de vezes que este pulso se repete em um segundo define a freqüência do clock. O sinal de clock é utilizado pela unidade de controle para a execução das instruções. A sua freqüência é medida em Hertz (Hz), que significa o número de pulsos elétricos gerados em um segundo de tempo. 4.1.3 Registradores Os registradores são dispositivos de alta velocidade, localizados fisicamente dentro da UCP, para armazenamento temporário de dados. O número de registradores varia em função da arquitetura de cada processador. Alguns registradores são de uso específico e têm propósitos especiais, enquanto outros são ditos de uso geral. Podemos destacar alguns deles: • PC (program counter) – armazena o endereço da memória que contem a instrução que está em execução. • SP (stack pointer) – armazena o endereço da memória que contem o endereço de retorno de uma subrotina. • F (flag) – armazena as informações sobre o estado do processamento. 4.1.4 Memória Principal A memória principal, também conhecida como memória primária ou real, é a parte do computador onde são armazenados instruções e dados. Ela é composta por unidades de acesso chamada células, sendo que cada célula é composta por um determinado número de bits (binary digit). O bit é a unidade básica de memória, podendo assumir o valor 0 ou 1. Atualmente, a grande maioria dos computadores utiliza o byte (8 bits) como tamanho de célula, porém encontramos computadores de gerações passadas com células de 16, 32 e até mesmo 60 bits. Podemos concluir, então, que a memória é formada por um conjunto de células, onde cada célula possui um determinado número de bits. A memória principal pode ser classificada em função de sua volatilidade, que é a capacidade da memória preservar o seu conteúdo mesmo sem uma fonte de alimentação ativa. As memórias chamadas voláteis se caracterizam por poderem ser lidas ou gravadas, como o tipo RAM (random Access memory), que constitui quase que a totalidade da memória principal de um computador. O outro tipo, conhecido como ROM (real-only memory), já vem pré-gravado do fabricante, geralmente com algum programa, e seu conteúdo é preservado mesmo quando a alimentação é desligada. Uma variação da ROM é a EPROM (erasable programmable ROM), onde podemos gravar e regravar a memória através da exposição de luz ultravioleta por um dispositivo especial, atualmente chamada de EPROM. 4.1.5 Memória Cachê A memória cachê é uma memória volátil de alta velocidade. O tempo de acesso a um dado nela contido é muito menor que se o mesmo estivesse na memória principal. Toda vez que o processador faz referência a um dado armazenado na memória principal ele “olha” antes na memória cachê. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 4.1.6 Memória Secundária ou Auxiliar A memória secundária é um meio permanente (não volátil) de armazenamento de programas e dados. Enquanto a memória principal precisa estar sempre energizada para manter suas informações, a memória secundária não precisa de alimentação. O acesso à memória secundária é lento, se comparado com o acesso à memória cachê ou à principal, porém seu custo é baixo e sua capacidade de armazenamento é bem superior à da memória principal. Enquanto a unidade de acesso à memória secundária é de milissegundos, o acesso à memória principal é de nanossegundos. 4.1.7 Dispositivos de Entrada e Saída Os dispositivos de entrada e saída (E/S) são utilizados para permitir a comunicação entre o computador e o mundo externo. Através desses dispositivos, a UCP e a memória principal podem se comunicar, tanto com usuários quanto com memórias secundárias, a fim de realizar qualquer tipo de processamento. Os dispositivos de E/S podem ser divididos em duas categorias: os que são utilizados como memória secundária e os que servem para a interface homem-máquina. 4.1.8 Barramento A UCP, a memória principal e os dispositivos de E/S são interligados através de linhas de comunicação denominadas barramento, barras ou vias. Um barramento (bus) é um conjunto de fios paralelos (linhas de transmissão), onde trafegam informações, como dados, endereços ou sinais de controle. Ele pode ser classificado como unidirecional (transmissão em um só sentido) ou bidirecional (transmissão em ambos os sentidos). Na ligação entre UCP e memória principal, são utilizados três barramentos para que a comunicação seja realizada. • O barramento de dados transmite informações entre a memória principal e a UCP. • O barramento de endereços é utilizado pela UCP para especificar o endereço da célula de memória que será acessada. • O barramento de controle é por onde a UCP envia os pulsos de controle relativos às operações de leitura e gravação. 4.1.9 Pipelining O conceito de processamento pipeline se assemelha muito a uma linha de montagem, onde uma tarefa é dividida em uma seqüência de subtarefas, executadas em diferentes estágios, dentro da linha de produção. A técnica de pipelining pode ser empregada em sistemas com um ou mais processadores, em diversos níveis, e tem sido a técnica de paralelismo mais utilizada para maior desempenho dos sistemas de computadores. 4.1.10 Ativação/Desativação do Sistema O sistema operacional é essencial para o funcionamento de um computador. Sem ele, grande parte dos recursos do sistema não estaria disponível ou se apresentaria de uma forma complexa para utilização pelos usuários. Toda vez que um computador é ligado, é necessário que o sistema operacional seja carregado da memória secundária para a memória principal. Esse processo denomina-se ativação do sistema (boot) Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos e é realizado por um programa localizado em uma posição especifica do disco (boot block), geralmente o primeiro bloco. O procedimento de ativação varia em função do equipamento, podendo ser realizado através do teclado, de um terminal ou por manipulação de chaves de um painel. Além da carga do sistema operacional, a ativação do sistema também consiste na execução de arquivos de inicialização. Nestes arquivos são especificados procedimentos de inicialização e configuração de hardware e software específicos para cada ambiente. Na maioria dos sistemas, também existe o processo de desativação (shutdown). Este procedimento permite que as aplicações e componentes do sistema sejam desativados de forma ordenada, garantindo a integridade do sistema. 4.2 Software O hardware sozinho não tem utilidade. Para que seja útil, é necessário um conjunto de programas, que será usado como interface entre as necessidades do usuário e as capacidades do hardware. Como utilizamos software’s adequados para diversas tarefas tornam o trabalho do usuário mais simples e eficiente. 4.2.1 Tradutor Antigamente para programar era complicado, pois deveríamos possuir conhecimento do hardware e programar em painéis através de fios. Os programas eram desenvolvidos em linguagem de máquina e carregados diretamente na memória principal. Com o surgimento das linguagens de programação os programadores deixaram de se preocupar com o hardware, em que região da memória o programa deveria ser carregado e assim por diante, mas os programas não estavam prontos para serem executados pela UCP, assim foi criado o tradutor que altera os programas para a linguagem de máquina, mesmo assim ainda não poderíamos executar os programas, pois o tradutor não tinha o poder de chamar as sub-rotinas, para isso tínhamos outro utilitário que chamava linker. O tradutor pode ser chamado de montador ou compilador: • O montador (assembler) é um utilitário responsável por gerar, depois de uma programa escrito em linguagem de montagem, um programa em linguagem de máquina não executável. • A linguagem de montagem é um conjunto de símbolos (mnemônicos) associado às instruções da linguagem de máquina do processador. Programa Fonte Tradutor Linguagem de Montagem Montador Linguagem de Alto Nível Compilador Programa Objeto Módulo Objeto Módulo Objeto Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos • • O compilador é o utilitário que gera, a partir de um programa escrito em alto nível, um programa em linguagem de máquina não executável. Um compilador é o utilitário que interage de modo integrado com os componentes do sistema de programação disponível, sob a supervisão do sistema operacional. Então podemos dizer que o compilador age como uma interfase entre o usuário e o sistema operacional. 4.2.2 Interpretador O interpretador é um tradutor que não gera código-objeto. Ele traduz, interpreta cada instrução e a executa em seguida, depois do programa-fonte, que foi escrito em linguagem de alto nível ser apresentado. A desvantagem do Interpretador é o tempo gasto na tradução. A vantagem é que se os dados mudarem durante a execução do programa ele implementa fazendo assim que exista uma flexibilidade nos tipos de dados dinâmicos que estão sendo executados pelo programa. 4.2.3 Linker O linker (ligador), também chamado de linkage editor (editor de ligação), é responsável, a partir de um ou mais módulos-objetos, fazer um único programa executável. Ele pode pesquisar em bibliotecas do sistema ou do próprio usuário. Outra função do linker é determinar em que lugar da memória o programa será instalado para ser executado. Módulo-objeto Módulo-objeto Linker Programa executável Módulo-objeto Em sistemas multiprogramáveis antigos, a relocação é inviável, devido à memória ser compartilhada por diversos programas, e sendo assim no momento que o sistema carrega um programa é difícil que a área de memória esteja disponível. 4.2.4 Loader O loader, também chamado carregador, é responsável por colocar fisicamente na memória um programa para execução. Dependendo do código gerado pelo linker o procedimento de carga varia, assim sendo o loader é classificado como sendo do tipo absoluto ou relocável. Se o código for absoluto, o loader necessita apenas de saber o endereço da memória inicial e o tamanho do módulo. (loader absoluto) No outro caso, o relocável, do programa pode ser carregado em qualquer parte da memória. (loader relocável) Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 4.2.5 Depurador Todos os programas podem conter erros e para isso usamos o utilitário chamado de depurador (deburgger), que permite controlar toda a execução de um programa em busca de erros na estrutura. • Acompanha a execução de um programa instrução por instrução; • Possibilita a alteração e visualização do conteúdo de variáveis; • Implementa pontos de parada dentro do programa, para que durante a execução o programa de parada nestes pontos; • Especificar que cada vez que o conteúdo de uma variável sofra uma mudança, uma mensagem seja enviada. 4.2.6 Linguagem de Controle Todos os sistemas operacionais oferecem está linguagem, que também é conhecida como linguagem de comando, faz com que ao usuário, através de comandos simples, possa ter acesso a rotinas especificas do sistema. Algumas linguagens de controle são poderosas chegando a ponto de poderem ser criados programas com estrutura de decisão e interação. 4.2.7 Linguagem de Máquina É a linguagem de programação que o processador realmente reconhece e faz com que os comandos sejam executados de forma correta. Cada processador possui sua instrução de máquina, definido pelo próprio fabricante. Um programa escrito em linguagem de máquina é totalmente codificado em códigos binários, que para os usuários fica muito difícil de se entender. Ele pode ser diretamente processado pela UCP, não requerendo qualquer tipo de interpretador. 4.2.8 Microprogramação Define a linguagem de máquina de cada computador. Apesar de cada computador ter níveis de microprogramação diferentes. Os processadores chamados microprogramáveis são aqueles que permitem novas instruções de máquina através da criação de microprograma. Os programas em linguagem de máquina são executados diretamente no hardware nos processadores de arquitetura das máquinas RISC, o mesmo não acontecendo com as máquinas CISC. 5. Tipos de Sistemas Operacionais Os Sistemas Operacionais evoluíram juntos com o hardware e as aplicações por ele suportadas, assim foram popularizados vários conceitos junto aos computadores pessoais e os de estação de trabalho. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Tipos de Sistemas Operacionais Sistema Monoprogramáveis/ Monotarefa Sistema Multiprogramáveis /Multitarefa Sistema com Múltiplos Processadores 5.1 Sistemas Monoprogramáveis/Monotarefa Este tipo de sistema era aquele que apenas um programa (job) poderia ser utilizado, se necessitássemos de executar outro programa deveríamos aguardar o término do primeiro para poder executar o segundo e assim por diante. Estes Sistemas foram criados para trabalharem especificamente com os Mainframes, mas devido à evolução dos computadores eles também passaram a serem desenvolvidos para eles. Como estes Sistemas são simples não necessitamos de muita preocupação quanto a proteção. Programa/ Tarefa UCP Memória Dispositivos de E/S 5.2 Sistemas Multiprogramáveis/Multitarefa Os sistemas multiprogramáveis vieram substituir os monoprogramáveis e enquanto os monos trabalhavam apenas com um programa sendo executado utilizando todos os recursos da máquina o multiprogramável trabalha com vários programas sendo executados ao mesmo tempo e dividindo os mesmos recursos. A vantagem é que este sistema tem é que vários usuários podem trabalhar fazendo suas funções aumento a produtividade e reduzindo custos para a empresa. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Programa/ Tarefa Programa/ Tarefa UCP Memória Dispositivo de E/S Programa/ Tarefa Programa/ Tarefa Programa/ Tarefa Neste sistema podemos determinar se ele esta trabalhando como monousuário ou multiusuário, para isso vai depender do número de pessoas que estejam trabalhando. Os sistemas multiprogramáveis/multitarefa podem ser classificados de três maneiras, dependendo da forma que suas aplicações são gerenciadas, ele pode ser dividido em sistema batch, de tempo compartilhado ou de tempo real. Sistema Multiprogramáveis/Multitarefa Sistemas Batch Sistemas de Tempo Compartilhado Sistema de Tempo Real 5.2.1 Sistema Batch Estes sistemas também conhecidos por Lote, foram os primeiros programas multiprogramáveis a serem implementados e quando submetidos à execução, seus programas são armazenados em disco ou fitas. Quando elas são bem projetadas, sua eficiência é muito grande, devido à melhor utilização do processador, mas o tempo de resposta é muito mais elevado. 5.2.2. Sistema de Tempo Compartilhado Este sistema também conhecido como Time-sharing, permite a interação dos usuários com o sistema, basicamente através de terminais que incluem vídeos, teclado e mouse. Estes sistemas trabalham com um espaço reservado para cada usuário, conhecido como fatia de tempo (time-slice) do processador. Isso significa que se o programa de um determinado usuário (1) não terminar no tempo determinado ele o substitui por outro programa de outro usuário (2), pelo mesmo tempo utilizado pelo usuário (1), caso também não seja terminado o trabalho do usuário (2) ele retoma o Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos programa do usuário (1) e o termina, caso o tempo seja adequado, se houver outros usuários trabalhando eles entraram na fila para utilizarem o tempo necessário determinado a eles. t1 t2 t3 t4 t5 t6 Usuário (1) Usuário (2) Usuário (3) Usuário (4) Usuário (1) Usuário (2) t Sistemas de tempo compartilhado são de implementação complexa, mas se levarmos em conta o tempo de desenvolvimento e depuração de uma aplicação, aumenta consideravelmente a produtividade dos usuários, reduzindo assim custos de utilização do sistema. 5.2.3 Sistema de Tempo Real Estes sistemas também conhecidos como real-time são bem semelhantes em implementação aos sistemas de tempo compartilhado, sua diferença é o tempo de resposta exigido no processamento das aplicações. Isso quer dizer que o tempo de resposta do sistema de tempo compartilhado pode variar sem comprometer as aplicações em execução, nos sistemas de tempo real os tempos de resposta devem estar dentro de limites rígidos, que devem ser obedecidos, caso contrario poderão causar problemas irreparáveis. Esse sistema de tempo real está presente em controle de processos, como ex.: monitoramento de refinaria de Petróleo, controle de trafego aéreo, de usinas termoelétricas e nucleares. 5.3 Sistema com Múltiplos Processadores Estes sistemas se caracterizam por possuir duas ou mais UCPs interligadas, trabalhando em conjunto. Um fator-chave nestes sistemas é a forma de comunicação entre as UCPs e o grau de compartilhamento da memória e dos dispositivos de entrada e saída. Em função disso podemos classificá-los como fortemente acoplados e fracamente acoplados. Sistemas com Múltiplos Processadores Sistemas Fortemente Acoplados Sistemas Simétricos Sistemas Assimétricos Sistemas Fracamente Acoplados Sistemas Operacionais de Rede Sistemas Operacionais Distribuídos Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 5.3.1 Sistemas Fortemente Acoplados Neste sistema existem dois ou mais processadores compartilhando a mesma memória e controlados por apenas um único sistema operacional. Isso possibilita a execução de múltiplas tarefas simultaneamente ou a divisão de uma tarefa em pequenas subtarefas. Desta forma podemos ampliar a capacidade do sistema introduzindo novos processadores que possuem um custo menor que um novo computador. Memória UCP UCP Dispositivos de E/S Dispositivos de E/S A preocupação, neste tipo de sistema é o problema de concorrência, pois vários processadores podem acessar o mesmo espaço de memória, além do fato de como organizar de forma eficiente os processadores a memória e os periféricos. Os sistemas fortemente acoplados podem ser divididos conforme a simetria existente entre seus processadores, ou seja, se todos os processadores podem executar ou não as mesmas funções. E são Classificados em Assimétricos e Simétricos. 5.3.1.1 Sistemas Fortemente Acoplados Assimétricos Os sistemas assimétricos (mestre / escravo) têm como característica o fato de que somente um processador (mestre) tem a capacidade de executar os serviços do Sistema Operacional tais como as operações de Entrada e Saída. Sempre que o processador escravo necessitar realizar estas operações terá que solicitar ao processador mestre. O sistema pode tornar-se ineficiente caso ocorra um número excessivo de interrupções do processador escravo devido ao elevado índice de operações de I/O. Outro problema, que pode ser percebido nesta configuração, está no fato de que se o processador mestre falhar, todo o sistema ficará inoperante. UCP Master Dispositivos de E/S SO UCP Slave Usuário Usuário Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 5.3.1.2 Sistemas Fortemente Acoplados Simétricos Os sistemas simétricos são mais poderosos que os assimétricos, permitindo um melhor balanceamento do processamento e das operações de entrada / saída, apesar de sua implementação ser bastante complexa, neste sistema não existe hierarquia entre os processadores. Todas as tarefas podem ser executadas em qualquer CPU, ficando o sistema Operacional responsável pelo gerenciamento dos recursos compartilhados. O mesmo processo pode ser executado simultaneamente em mais de uma CPU, aproveitando possíveis recursos de paralelismo existentes na linguagem. UCP Dispositivos de E/S UCP SO Usuário A falha de uma CPU não afeta o funcionamento do sistema como um todo, além de permitir um melhor balanceamento de carga e menor tempo de gerenciamento, entretanto com menor capacidade. Apenas poucas funções ficam a cargo de um único processador, como, por exemplo, a inicialização do sistema. 5.3.2 Multiprocessamento em sistemas fortemente acoplados Sistemas com múltiplos processadores possibilitam o aumento da capacidade computacional com menor custo (escalabilidade), além de permitir a reconfiguração e o balanceamento do sistema. Reconfiguração é a capacidade de um sistema poder continuar o processamento mesmo que um dos processadores esteja falhando ou parem de funcionar. Os sistemas fortemente acoplados (tightly coupled) podem ser divididos conforme a simetria existente entre seus processadores, ou seja, se todos os processadores podem executar ou não as mesmas funções. Os computadores são vistos como máquinas seqüenciais, onde a UCP executa uma por uma as instruções de um programa, mas na realidade isso não é totalmente verdadeiro, pois no Hardware, múltiplos sinais estão ativos simultaneamente, o que pode ser entendido como um paralelismo. Agora com a implementação de sistemas com múltiplos processadores, o conceito de simultaneidade ou paralelismo pode ser expandido a um nível mais amplo, onde uma tarefa pode ser dividida e executada ao mesmo tempo, por mais de um processador. 5.3.2.1 Processamento Vetorial As maiorias dos computadores trabalham com dados escalares (elementares) e, sendo assim processam vetores seqüencialmente. Este processamento permite a manipulação de vetores inteiros, fazendo assim a execução da mesma operação sobre diferentes elementos de um ou mais vetores. Trabalham combinando dois vetores produzindo um vetor de saída. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Um processador escalar faz a soma dos vetores A e B correspondente às fases de busca e execução, ao cálculo dos endereços dos operandos e à execução das instruções de controle da repetição (FOR), para cada soma dos n elementos dos vetores. Para fazer a mesma conta os processadores vetoriais utilizam uma única instrução vetorial, onde o vetor A é somado ao vetor B e o resultado é atribuído ao C. A vantagem é que apenas uma instrução é executada. FOR i := 1 TO N DO C[i] := A[i] + B[i]; Computadores vetoriais possuem, além do processador vetorial o escalar, para que a unidade de controle verifique a instrução e a execute no processador adequado. A única vantagem de se usar um processador vetorial é quando as aplicações executadas têm um elevado grau de código vetorial, como problemas numéricos, processamento de imagens, estudos meteorológicos e de física nuclear. 5.3.2.2 Processamento Paralelo Possibilita que a aplicação seja executada por mais de um processador ao mesmo tempo. Neste caso só existirá ganho quando a aplicação puder ser dividida em partes independentes para execução simultânea. Vejamos um exemplo com uma máquina que tenha três processadores. X := Cos(gama) + (Delta/4) - (Alfa * 3,14); Um Processo Vetorial também pode ser implementado através de múltiplos processadores. Vejamos um exemplo com uma repetição onde inicializamos um vetor de 100 posições. FOR i := 1 TO 100 DO Vetor[i] := 0; Se um sistema possuir 100 processadores e todos estejam dedicados à mesma aplicação, cada processador pode inicializar uma posição diferente do vetor ao mesmo tempo, torrnando o processamento mais rápido que uma execução seqüencial. Vetor [1] Vetor [2] := 0; := 0; Vetor [99] := 0; Vetor [100] := 0; Processador 1 Processador 2 Processador 99 Processador 100 O grande problema é justamente determinar quando existe a possibilidade de implementarmos o paralelismo em um programa. O paralelismo pode ser indicado pelo programador (paralelismo explícito) através de comandos da linguagem utilizada. Atualmente muito se tenta desenvolver um compilador junto com sistema operacional que detectaria automaticamente o paralelismo nos programas (paralelismo implícito). Isso faria que, provavelmente, tenhamos programas mais eficientes e confiáveis. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Apesar disso ainda não surgiu a linguagem de programação própria para o desenvolvimento de aplicações paralelas, sendo utilizadas, atualmente, as linguagens Ada, Pascal Concorrente, FORTRAN e Modula 2. 5.3.2.3 Organização Funcional A comunicação interna das UCPs, memória e dispositivos de E/S (unidades funcionais) é fundamental no projeto de sistemas com múltiplos processadores, pois determina quantas UCPs o sistema poderá ter e como será o aceso à memória. A memória é dividida em módulos para que múltiplos acessos simultâneos sejam permitidos, podendo assim ser compartilhada por varias unidades funcionais. As organizações funcionais podem ser divididas, basicamente, em três: barramento comum, barramento cruzado e memória multiport. 5.3.2.3.1 Barramento comum Esta é a forma mais simples de se fazer comunicação entre múltiplos processadores e outras unidades funcionais. O maior problemas dessa organização é que somente uma unidade funcional pode estar utilizando o barramento em um determinado instante. Quando várias unidades tentam acessar o barramento pode ocasionar um gargalo e se ocorrer um problema no barramento todo o sistema ficara comprometido. UCP Memória Memória UCP Processamento de E/S Processamento de E/S Memória UCP Processamento de E/S Apesar de simples, econômico e flexível, sistemas assim estão limitados a poucos processadores, dependendo da velocidade de transmissão do barramento. 5.3.2.3.2 Barramento cruzado Este tipo de barramento foi criado para evitar o gargalo existente no barramento comum, criando uma rede de interconexão, os barramentos cruzados também são conhecidos como: crossbarswitch matrix. Assim fica para o hardware a solução de prováveis conflitos de acesso a uma mesma unidade, pois é possível a comunicação simultânea entre diferentes unidades funcionais. A principio o número de processadores que podem ser adicionados ao sistema é ilimitado. O preço de seu alto desempenho está no custo e complexidade do sistema. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Memória Memória Memória UCP Processador de E/S UCP Processador de E/S UCP Processador de E/S 5.3.2.3.3 Memória Multiport Enquanto no esquema de barramento cruzado não são possíveis dois processadores terem acesso a um módulo de memória no mesmo instante, a memória multiport permite acessos simultâneos a um mesmo módulo de memória. Nesse esquema, os acessos simultâneos são realizados através de múltiplas portas, existentes em cada módulo de memória. Os possíveis conflitos de acesso são resolvidos pelos próprios módulos através de prioridades a cada porta. UCP Memória Memória Processador de E/S UCP UCP Memória Processador de E/S Memória Processador de E/S 5.4 Sistemas Fracamente Acoplados Em sistemas fracamente acoplados existem dois ou mais sistemas de computação, conectados através de linhas de comunicação. Cada sistema funciona de maneira independente, possuindo seu(s) próprio(s) processador (es), memória e dispositivos. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Link de Comunicação UCP UCP Dispositivos de E/S Memória Dispositivos de E/S Memória A grande diferença entre os dois sistemas é que no fortemente acoplado existe apenas um espaço de endereçamento (memória) compartilhado por todos os processadores, enquanto no fracamente acoplado cada sistema tem sua própria memória individual. 5.4.1 Multiprocessasmento em Sistemas Fracamente Acoplados Tem a característica de possuir dois ou mais sistemas de computação interligados, sendo que cada um tem seu sistema operacional, gerenciando seus recursos. Nos anos 80 os sistemas operacionais e suas aplicações eram tipicamente concentradas em sistemas de grande porte com um ou mais processadores. Nos sistemas centralizados os operadores utilizavam terminais não inteligentes conectados a linhas serias dedicadas ou linha telefônicas públicas para a comunicação interativa com esses sistemas. Com a evolução da tecnologia em todos os ramos, surgiu uma nova configuração de computação, chamado de rede de computadores (computer network). Em uma rede existem dois ou mais sistemas independentes, também chamados de hosts ou estações, com capacidade de processamento próprio e interligados através de linhas de comunicação. Dependendo do grau de interligação dos nós da rede podemos dividir os sistemas entre dois: sistemas operacionais de rede e sistemas operacionais distribuídos. Nó Nó Nó Rede Nó Nó 5.4.1.1 Sistemas Operacionais de Rede (SOR) Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos No SOR, cada máquina possui seu sistema, hardware e software que permite ter acesso a outros componentes da rede, compartilhando seus recursos, além disso, o SOR permite: • • • • • Cópia remota de arquivos; Emulação de terminal; Impressão remota; Gerência remota; Correio eletrônico. Cada nó é independente do outro, sendo que o sistema operacional pode ser diferente, fazendo com que as máquinas continuem a trabalhar mesmo quando a conexão entre os nós sofra qualquer problema. Um exemplo de SOR são as redes locais (Local Área Network – LAN). 5.4.1.2 Sistemas Operacionais Distribuídos (SOD) A princípio o Sistema Operacional Distribuído e o Sistema Operacional Rede são iguais, os que diferem um do outro, é que no Sistema Operacional Distribuído existe um relacionamento mais forte entre seus componentes, fazendo com que todos os computadores tenham o mesmo sistema operacional. Para os usuários e suas aplicações é como se não existisse uma rede, mas um único sistema centralizado. Usuário A grande vantagem é a possibilidade do balanceamento de carga, quando um programa é admitido para execução, a carga de processamento de cada sistema é avaliada e o processador mais livre é escolhido, depois de aceito o programa roda no mesmo processador até o término. No Sistema Operacional Distribuído também é permitido o compartilhamento dos periféricos, discos e fitas, podemos considerar que ele é como uma evolução dos sistemas fortemente acoplados. Outra vantagem do Sistema Operacional Distribuído é a da implementação de aplicações distribuídas é a capacidade de redundância do sistema. Isso significa que se um dos componentes falhar outro poderá assumir o sistema defeituoso. Em aplicações de missão crítica, como controle de tráfego aéreo, existem sistemas especialmente desenvolvidos para essa finalidade, conhecidos como sistema de tolerância a falhas (fault tolerance), Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Alguns fabricantes juntamente com os órgãos de padronização, definiram padrões para a implementação de sistemas distribuídos. O Distributed Computing Enviroment (DCE), o Common Object Request Broker Architecture (COBRA) e o Object Linking and Embedding (OLE) são alguns dos padrões para o desenvolvimento de aplicações em ambiente distribuídos. COMP 1 COMP 2 5.4.2.1 Organização Funcional A organização funcional dos sistemas fracamente acoplados ou topologia define como interligados fisicamente os diversos sistemas da rede. 5.4.2.2 Barramento Os sistemas são conectados a uma única linha de comunicação e todos compartilham o mesmo meio, tanto para receber como para enviar mensagens. Esta configuração se usa geralmente em redes locais e nessa topologia, caso haja algum problema com o meio de transmissão todos os nós da rede ficarão incomunicáveis. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 5.4.2.3 Organização distribuída Neste tipo existem linhas de comunicação ponto-a-ponto que ligam os sistemas e caminhos alternativos entre os diversos nós da rede. Caso uma linha de comunicação apresente problema, linhas alternativas permitirão que a rede continue em funcionamento. Este tipo de organização é utilizado geralmente em redes distribuídas. 6. Sistemas Multiprogramáveis A possibilidade de periféricos e dispositivos funcionarem simultaneamente entre si, juntamente com a CPU, permitiu a execução de tarefas concorrentes, que é o principio básico para projeto e implementação de sistemas multiprogramáveis. Este sistema surgiu de um problema existente nos sistemas monoprogramáveis, que é a baixa utilização de recursos do sistema. No sistema monoprogramáveis, somente um programa pode ser residente em memória, e o Processador permanece dedicado, exclusivamente, à execução desse programa, com isso há um desperdício na utilização do Processador. Outro aspecto que devemos observar é a subutilização da memória, pois se um programa não utiliza totalmente a memória ocasiona a existência de áreas livres, sem utilização. Nos sistemas multiprogramáveis, vários programas podem estar residentes em memória, concorrendo pela utilização da UCP. Assim enquanto um programa solicita uma operação de Entrada / saída, outros programas poderão estar disponíveis para utilizar o processador. E/S UCP E/S Livre UCP 1 1 1 2 Tempo Tempo Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Nos programas que são executados concorrentemente o ganho na utilização do processador, memória, periféricos e no tempo de resposta é considerável. A eficiência proporcionada por um sistema multiprogramável resulta em maior complexidade do sistema operacional, já que alguns problemas surgem com esse tipo de implementação e a responsabilidade de resolução é do sistema operacional. • • • Quais os programas que devem estar residentes em memória; Qual a ordem que os programas utilizarão a UCP; Que um programa não pode destruir dados ou códigos de outro programa. 6.1 Interrupção e Exceção Enquanto um programa é executado pode ocorrer algum evento no seu processamento, fazendo com que haja uma intervenção do sistema operacional e esta intervenção é camada de interrupção ou exceção e pode ser resultado da execução de instruções do próprio programa, gerado pelo sistema operacional ou por algum dispositivo de hardware. Nestas situações o fluxo do programa é desviado para uma rotina especial de tratamento. Quando a interrupção é gerada pelo sistema operacional ou por algum dispositivo a UCP deve interromper o programa para atender a solicitação do dispositivo, fazendo com que o controle seja desviado para uma rotina responsável pelo tratamento da interrupção. Logo em seguida ao término desta interrupção o controle deve voltar ao programa que, anteriormente, estava sendo processado. Com isso é necessário que, no momento da interrupção, um conjunto de informações sobre a execução do programa seja preservado. Essas informações consistem no conteúdo de alguns registradores, que deverão ser restaurados posteriormente para continuação do programa. Não existe apenas um único tipo de interrupção e sim diferentes tipos que devem ser atendidos por diversas rotinas de tratamento. Quando uma interrupção acontece a UCP deve saber o tipo de interrupção que ocorreu, para fazer o desvio do fluxo da execução. Essa informação esta em uma estrutura chamada vetor de interrupção. Salva os registradores Identifica a origem da interrupção Rotina de Tratamento Interrupção Obtém o endereço da rotina de tratamento Restaura os registrador Mecanismo de Interrupção Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos As interrupções podem ser classificadas como mascaráveis e não mascaráveis. As mascaráveis podem ser desabilitadas pelo processador, isto quer dizer que não receberam tratamento. No caso das não mascaráveis o tratamento é sempre obrigatório. Caso ocorram múltiplas interrupções, o processador deve saber qual a interrupção deverá ser tratada em primeiro. Para isso, as interrupções devem conter prioridades, em função da necessidade de atendimento a cada uma. Quem tem essa função, normalmente, é o hardware, pois tem um dispositivo denominado controlador de pedidos de interrupção que é responsável por avaliar as interrupções geradas e suas prioridades de atendimento. Inicialmente os sistemas operacionais apenas implementavam o mecanismo de interrupção. Com a evolução dos sistemas foi introduzido o conceito de exceção, que é resultado direto da execução de uma instrução do próprio programa. O mecanismo de tratamento de exceções é semelhante ao de interrupções, porém muitas vezes, podem ser escritas pelo próprio programador. A diferença fundamental entre elas é que a primeira é gerada por um evento síncrono, enquanto a segunda é gerada por eventos assíncronos. Um evento é síncrono quando é resultado direto da execução do programa corrente. Um evento é dito assíncrono quando ocorre independentemente da execução do programa corrente e como esses eventos são imprevisíveis, podem ocorrer múltiplas vezes simultaneamente. 6.2 Operações de Entrada / Saída Antigamente a comunicação entre UCP e periféricos era controlada por um conjunto de instruções especiais, denominadas instruções de entrada/saída, executadas pela própria UCP. A implementação de um dispositivo chamado controlador ou interface permitiu à UCP agir de maneira independente dos dispositivos de E/S. Com isso a UCP passou a não se comunicar diretamente com os periféricos e sim através do controlador. Com a nova implementação, existem duas maneiras básicas pelas quais o processador controlava as operações de E/S. A primeira a UCP sincronizava-se com o periférico para inicio da transferência de dados e, após iniciava a transferência, e o sistema ficava permanentemente testando o estado do periférico para saber quando a operação se encerraria. A outra era mais inteligente permitia que após o início da transferência dos dados, a UCP ficasse livre para se ocupar de outras tarefas. Assim em determinados intervalos de tempo o sistema deveria realizar um teste para saber do termino ou não da operação de E/S em cada dispositivo (polling). Com a implementação do mecanismo de interrupção no hardware as operações de E/S puderam ser realizadas de uma forma mais eficiente. Em vez de o sistema verificar periodicamente o estado de uma operação pendente, o próprio controlador interrompia a UCP para avisar do termino da operação. UCP Memória Principal Controlador A operação de E/S controlada por interrupção é muito mais eficiente que a operação de E/S controlada por programa, já que elimina a necessidade de a UCP esperar pelo término da operação, além Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos de permitir que várias operações de E/S sejam executadas simultaneamente. Mesmo assim a UCP era sobrecarregada. A solução para esse problema foi a implantação, por parte do controlador de uma técnica de transferência de dados denominada DMA (Direct Memory Access). A DMA permite que um bloco de dados seja transferido entre memória e periféricos, sem a intervenção da UCP, exceto no início e no final da transferência. Quando o sistema deseja ler ou gravar um bloco de dados, são passadas da UCP para o controlador informações como: onde o dado está localizado, qual o dispositivo de E/S envolvido na operação, etc... No momento em que a transferência de DMA é realizada, o controlador assume momentaneamente, o controle do barramento. Por sua vez a UCP suspende o acesso ao bus, esse procedimento não gera uma interrupção e a UCP fica livre para executar outras tarefas, claro que sem a utilização do barramento. Memória Principal UCP Canais de E/S Controlador Controlador 6.3 Buffering Esta técnica consiste na utilização de uma área de memória para a transferência de dados entre os periféricos e a memória principal denominada buffer. Esta Técnica permite que quando um dado for transferido para o Buffer, após uma operação de leitura, o dispositivo de entrada possa fazer uma nova leitura. Ela é outra implementação para minimizar o problema de disparidade da velocidade do processamento existente entre a UCP e os dispositivos de E/S. O objetivo do buffering é manter, na maior parte do tempo a UCP e os dispositivos de E/S ocupados. A unidade de transferência usada é o registro. O tamanho do registro pode ser especificado em função da natureza do dispositivo ou da aplicação. O buffer deve possuir a capacidade de armazenar diversos registros, de maneira que existam dados lidos nele, mas não processados, ou processados, mas não gravados. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Memória Principal Gravação Buffer Gravação UCP Leitura Controlador de E/S Leitura 6.4 Spooling (simultaneous peripheral operation on-line). Essa técnica foi introduzida no final dos anos 50 para aumentar a produtividade e a eficiência dos sistemas operacionais. Jobs é a forma de armazenar os vários programas e seus dados. A técnica de buffering, permite que um job utilize um buffer concorrente com um dispositivo de E/S. O spooling, basicamente, utiliza o disco como um grande buffer, permitindo que dados sejam lidos e gravados em disco, enquanto outros jobs são processados. Sistema Operacional Programa Arquivo de Spool Impressão Atualmente, a técnica de spooling é implementada na maioria dos sistemas operacionais, fazendo com que tanto a UCP quanto os dispositivos de E/S sejam aproveitados de forma mais eficiente. 6.5 Reentrância É a capacidade de um código de programa (código reentrante) poder ser compartilhado por diversos usuários, exigindo que apenas uma cópia do programa esteja na memória. Uma característica da reentrância é que o código não pode ser modificado por nenhum usuário no momento em que está sendo executado. A reentrância permite que cada usuário possa estar em um ponto diferente do código reentrante, manipulando dados próprios, exclusivos de cada usuário. 6.6 Proteção do sistema A proteção do sistema faz com que nenhum utilitário, acidentalmente, acesse uma área de outro utilitário para poder manter a integridade dos dados pertencentes a cada usuário. Para isso todo sistema operacional implementa algum tipo de proteção aos diversos recursos que são compartilhados. Um programa mal escrito, ao ganhar a UCP, pode possuir no seu código um loop infinito, de forma a alocar o processador por tempo indeterminado. Para evitar este tipo de problema, a UCP possui um mecanismo denominado timer, que interromperá o processamento em determinados intervalos de tempo. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 7. Estrutura do Sistema Operacional O Sistema Operacional não é como uma aplicação tipicamente seqüencial, com início, meio e fim, por isso sua compreensão é complicada. Pois muitos dos eventos estão associados ao hardware e as tarefas internas do próprio sistema operacional. O Sistema Operacional é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários do sistema e sua aplicações, bem como a outras rotinas do próprio sistema. Esse conjunto de rotinas é chamado núcleo do sistema ou kernel (cérebro). As principais funções do núcleo são: • Tratamento de interrupções; • Criação e eliminação de processos; • Sincronização e comunicação entre processos; • Escalonamento e controle dos processos; • Gerência de memória; • Gerência do sistema de arquivos; • Operações de entrada e saída; • Contabilização e segurança do sistema. A estrutura do SO, ou seja, a maneira como o código do sistema é organizado e o interrelacionamento entre seus diversos componentes, pode variar conforme a concepção do projeto. 7.1 System Calls Uma preocupação na grande maioria dos projetos de SO é a implementação de mecanismo de proteção ao núcleo do sistema e de acesso aos seus serviços. O usuário (ou aplicação), quando deseja solicitar algum serviço do sistema, realiza uma chamada a uma de suas rotinas (ou serviços) através de system calls (chamadas ao sistema), que são as portas de entrada para se ter acesso ao núcleo do SO. Para cada serviço existe uma system calls associada e cada SO tem o seu próprio conjunto (biblioteca) de chamadas, com nomes, parâmetros e formas de ativação específica. H a System Call Aplicação Núcleo r d w a r e As system calls podem ser divididas em grupos de funções: • Gerência de processos o Criação e eliminação de processos o Alteração das características do processo o Sincronização e comunicação entre processos • Gerência de memória o Alocação e desalocação de memória Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos • Gerência de entrada/saída o Operações de entrada/saída o Manipulação de arquivos e diretórios 7.2 Modos de Acesso Certas Instruções não podem ser colocadas diretamente à disposição da aplicação, pois a sua utilização indevida ocasionaria sérios problemas à integridade do sistema. As instruções que têm o poder de comprometer o sistema são conhecidas como instruções privilegiadas, e as que não oferecem perigo são conhecidas como instruções não privilegiadas. Para que uma aplicação execute uma instrução privilegiada, o processador implementa o mecanismo de modos de acesso, esses modos são divididos em dois o modo usuário, que executa as aplicações não privilegiadas e o modo kernel, que executa as privilegiadas. Quem determina o modo de acesso é um conjunto de bits, que fica em um registrador especial da UCP. Através desse registrador, o hardware verifica se a instrução pode ou não ser executada pela aplicação. O núcleo do SO sempre é executado em modo kernel, porque tem que possuir a capacidade de gerenciar e compartilhar todos os recursos, solucionando, em diversos níveis, os problemas de acesso às instruções privilegiadas. Programa Usuário A Memória Principal System Call Rotina do Sistema Programa Usuário B Programas dos usuários executam no modo usuário Sistema Operacional executa no modo kernel 7.3 Sistemas Monolíticos A organização mais comum de ser encontrada é aquela que estrutura o sistema como um conjunto de rotinas que podem interagir livremente umas com as outras. A estrutura monolítica pode ser comparada com uma aplicação formada por vários programas que são compilados e depois linkados, formando um grande e único programa executável. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos Aplicação Aplicação Modo Usuário System Calls Modo Kernel Hardware 7.4 Sistemas em Camadas Um sistema em camadas divide o sistema operacional em camadas sobrepostas. Cada módulo oferece um conjunto de funções que podem ser utilizadas por outros módulos. Módulos de uma camada podem fazer referência apenas a módulos das camadas inferiores. 5 Operador 4 Programas de usuário 3 Entrada / Saída 2 Comunicação 1 Gerência de memória 0 Multiprogramação A vantagem da estruturação em camadas é isolar as funções do SO, facilitando sua alteração e depuração, além de criar uma hierarquia de níveis de modos de acesso, protegendo as camadas mais internas. Usuário Supervisor Executivo Kernel Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos Sistemas Operacionais Prof. Antonio Apparecido Oliveira dos Santos 7.5 Sistema Cliente-Servidor Na atualidade a idéia é tornar o núcleo do sistema operacional o menor e mais simples possível. Por isso o sistema é dividido em processos, sendo cada um responsável por oferecer um conjunto de serviços, como serviços de arquivo, serviços de criação de processos, serviços de memória, serviços de escalonamento etc. Quando um serviço é solicitado ao processo responsável à aplicação que solicita o serviço é conhecida como cliente, enquanto o processo que responde à solicitação é chamado de servidor. A solicitação é feita através de mensagem para o servidor, que responde também através de mensagem e esta função de comunicação é realizado pelo núcleo do sistema, ou seja, a troca de mensagens entre o cliente e o servidor. Servidor de Memoria Cliente Servidor de Arquivo Servidor de rede Servidor de Processo Modo Usuário Modo Kernel Núcleo Hardware Neste modelo os servidores executam o pedido em modo usuário, ou seja, não têm acesso direto a certos componentes do sistema. Apenas o núcleo do sistema, responsável pela comunicação entre clientes e servidores, executa no modo kernel. Com isso se ocorrer um problema o serviço pode parar sem ocasionar um comprometimento total do sistema. Além disso, a implementação de sistemas cliente-servidor permite isolar as funções do SO por diversos processos (servidores) pequenos e dedicados a serviços específicos. Como conseqüência, o SO passa a ser de mais fácil manutenção. Como servidores se comunicam por mensagens não interessa quantos processadores estão trabalhando, se um ou múltiplos (fortemente acoplados) ou ainda em ambiente de sistema distribuído (fracamente acoplados). A implementação de sistemas cliente-servidor em um ambiente distribuído permite que um cliente solicite um serviço e a resposta seja processada remotamente. Apesar de todas as vantagens deste sistema, sua implementação, na prática é difícil devido a certas funções do SO exigirem acesso direto ao hardware, como operações de entrada e saída. Então o que é implementado usualmente é uma combinação do modelo de camadas com o modelo clienteservidor. O núcleo do sistema, além de ser responsável pela comunicação entre cliente e servidor, passa a incorporar outras funções críticas do sistema, como escalonamento e gerência de memória, além das funções dos divice drivers. Copyright – Fevereiro de 2004 – Todos os direitos reservados para Antonio Apparecido Oliveira dos Santos