SUMÁRIO SISTEMAS DE NUMERAÇÃO • INTRODUÇÃO • SISTEMA DECIMAL DE NUMERAÇÃO • SISTEMA BINÁRIO DE NUMERAÇÃO • SISTEMA HEXADECIMAL DE NUMERAÇÃO COMPUTADOR DIGITAL • INTRODUÇÃO • HARDWARE • Unidade Central de Processamento • Memória principal • Memória Cache • Memória secundária • Dispositivos de entrada e saída • Barramento • Pipelining • Ativação do sistema • Arquiteturas RISC e CISC • SOFTWARE • Tradutores (montador, compilador • Linker • Loader • Depurador INTRODUÇÃO A SISTEMAS OPERACIONAIS • INTRODUÇÃO • MÁQUINA DE NÍVEIS • ANEXO: Execução do Programa da Figura 2 pelo computador TIPOS DE SISTEMAS OPERACIONAIS • INTRODUÇÃO • SISTEMAS MONOPROGRAMÁVEIS/MONOTAREFA • SISTEMAS MULTIPROGRAMÁVEIS/MULTITAREFA • SISTEMAS COM MÚLTIPLOS PROCESSADORES • Sistemas fortemente acoplados • Sistemas fracamente acoplados SISTEMAS MULTIPROGRAMÁVEIS • INTRODUÇÃO • SISTEMAS MONOPROGRAMÁVEIS/MULTIPROGRAMÁVEIS • INTERRUPÇÃO E EXCEÇÃO • OPERAÇÕES DE ENTRADA/SAÍDA • BUFFERING • SPOOLING • REENTRÂNCIA 1. SISTEMAS DE NUMERAÇÃO 1.1 INTRODUÇÃO Quando mencionamos sistemas de numeração estamos nos referindo à utilização de um sistema para representar uma quantidade. Exemplo: Quando contamos algo ou expressamos algum valor, utilizamos no dia a dia um sistema de numeração, que é o sistema decimal. Para isto seguimos a organização dos números, pois eles obedecem à uma certa ordem, e uma das regras é utilizar somente os caracteres 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 combinados, obedecendo à ordenação, para formar dos números. Muitos sistemas de numeração são usados sendo os mais comuns o decimal, o binário, o octal e o hexadecimal. 1.2 O SISTEMA DECIMAL DE NUMERAÇÃO 0 Sistema decimal é composto de 10 algarismos ou símbolos. Estes 10 símbolos são 0, 1, 2, 3. 4, 5, 6, 7, 8 e 9. Utilizando estes símbolos como dígitos de um número, podemos expressar qualquer quantidade. 0 Sistema decimal é também chamado de sistema de base 10 porque possui 10 dígitos e evoluiu naturalmente do fato de que as pessoas terem 10 dedos. 0 Sistema decimal é um Sistema de valor posicional, isto é, um sistema no qual o valor do dígito depende de sua posição. Considere por exemplo o número decimal 27,35. Este número é na verdade igual a 2 X 10 + 7 X 1 + 3 X 0,1 + 5 X 0,01. A vírgula decimal é usada para separar a parte inteira da parte fracionária do número. De modo mais rigoroso, as várias posições possuem pesos que podem ser expressos em potências de 10. Por exemplo, o número 2745,214 é igual a CONTAGEM DECIMAL Quando fazemos uma contagem no sistema decimal, começamos com 0 na posição das unidades e vamos tomando cada símbolo em progressão até atingirmos 9. Quando isto acontece, adicionamos 1 a posição de maior peso e mais próxima e começamos de novo com o 0, na primeira posição. Este processo continua até que a contagern de 99 seja alcançada. Neste momento, adicionamos 1 a terceira posição começamos de novo com 0 nas duas primeiras posições. Este procedimento pode ser seguido continuamente, qualquer que seja o número que desejemos contar. Prof. Adão de Melo Neto 1 1.3 O SISTEMA BINÁRIO DE NUMERAÇÃO O sistema de numeração de base 2 é chamado de sistema binário (dois), pois utiliza somente dois dígitos: 0 e 1. O sistema binário é também um sistema de numeração posicional, onde cada dígito binário possui seu próprio peso expresso como uma potência de 2. 0 número 1011.101 é mostrado na figura. Para encontrar o seu equivalente no sistema decimal, simplesmente fazemos a soma dos produtos de cada dígito (0 ou 1) pelo seu respectivo peso. Prof. Adão de Melo Neto 2 No Sistema binário o termo dígito binário é geralmente abreviado para bit ( binary digit), que usaremos daqui por diante. CONTAGEM BINÁRIA A seqüência começa com todos bits em 0; é a chamada contagem zero. Para cada contagem sucessiva, a posição ) Cada vez que o bit das unidades trocar de 1 para referente as unidades (20) troca o seu valor binário pelo outro (comuta). 0, a posição de peso dois (21) vai comutar (trocar de estado). Cada vez que o bit de posição de peso dois mudar de 1 para 0, o bit da posição ao de peso quatro (24) vai comutar (mudar de estado). Do mesmo modo, cada vez que o bit de posição de peso quatro mudar de 1 para 0, o bit da posição de peso oito (28) vai comutar (mudar de estado). Este processo continuaria para os bits de mais alta ordem, se o número binário tivesse mais do que quatro bits. Prof. Adão de Melo Neto 3 Byte Um byte é um grupo de oito bits. Exemplos: 1 Byte ==> 01111001 2 Bytes ==> 011110011110001 3 bytes ==> 01111001111000111110000 CIRCUITOS DIGITAIS E CIRCUITOS LÓGICOS Circuitos digitais são projetados para produzir tensões de saída que estejam dentro dos intervalos determinados pelos binários 0 e 1 Cada tipo de circuito obedece a um determinado conjunto de regras lógicas. Por esta razão, os circuitos digitais são também chamados de circuitos lógicos. CONVERSÃO BINÁRIO-DECIMAL Qualquer número binário pode ser convertido em seu equivalente decimal simplesmente somando-se os pesos das várias posições que contiverem 1 no número binário. Exemplo 1 Exemplo 2 Prof. Adão de Melo Neto 4 CONVERSÃO DECIMAL-BINÁRIO Utiliza-se o método das divisões sucessivas: divide-se sucessivamente o número decimal por 2 até resultar em um número igual 0. Os restos destas divisões formarão o número binário. 1.4 O SISTEMA HEXADECIMAL DE NUMERAÇÃO O sistema hexadecimal de numeração usa a base 16, ou seja, ele tem 16 símbolos possíveis. Ele usa os dígitos de 0 à 9 do sistema decimal sendo os números de 10 à 15 representado pelos caracteres A, B, C, D, E, F. Note que cada dígito em hexadecimal representa um grupo de 4 dígitos binários. A tabela abaixo mostra as relação entre hexadecimal, decimal e binário. Prof. Adão de Melo Neto 5 Conversão Hexadecimal-Decimal Pode ser realizada considerando que cada posição do dígito hexadecimal representa um peso que é potência de 16 Exemplos: Note que no segundo exemplo o valor 10 substituiu o A e o valor 15 o F na conversão para decimal. Conversão Decimal-Hexadecimal Utiliza-se o método das divisões sucessivas: divide-se sucessivamente o número decimal por 16 até resultar em um número igual 0. Os restos destas divisões formarão o número hexadecimal. Exemplo Note que qualquer resto maior que 9 é representado pelas letras de A até F. 1.5 Conversão Hexadecimal-Binário O sistema hexadecimal é usado como um método compacto para representação de números binários. Nesta conversão, cada dígito hexadecimal é convertido para o seu equivalente de quatro bits (ver tabela anterior) Prof. Adão de Melo Neto 6 Exemplo: Conversão Binário-Hexadecimal É apenas o inverso do processo anterior. O número binário é reunido em grupos de 4 bits, e cada grupo é convertido para o seu equivalente hexadecimal. Zeros são adicionados, se necessário, para compactar um grupo de 4 bits. Contagem em Hexadecimal O maior dígito hexadecimal é F, portanto na contagem em hexadecimal cada posição de dígito é incrementada de 0 a F. Uma vez alcançado o F ele retorna para 0 na próxima contagem causando o incremento da próxima posição de dígito mais alta. Isto é ilustrado nas seqüências de contagem abaixo: Note que quando existe um 9 numa posição de dígito, ele se torna A quando incrementado. Prof. Adão de Melo Neto 7 2. Computador Digital 2.1 Introdução O objetivo deste capítulo é apresentar os conceitos básicos de hardware e software relativos à arquitetura de computadores necessários a compreensão dos demais capítulos. 2.2 Hardware Um computador digital (figura 1) é constituído por um conjunto de componentes interligados, composto por processadores, memórias, registradores, barramentos, monitores de vídeo, impressoras, mouse, além de outros dispositivos físicos (hardware). Esses dispositivos manipulam dados na forma digital (bits 0 e 1), o que proporciona uma maneira confiável de representação. Todos os componentes de um computador são agrupados em três subsistemas básicos: unidade central de processamento (CPU), memória principal, e dispositivos de entrada e saída (Figura 1). Unidade Central de Processamento/Processador A unidade central de processamento (CPU), ou processador, tem como função principal unificar todo o sistema, controlando as funções realizadas por cada unidade funcional. A CPU também é responsável pela execução de todos os programas do sistema, que obrigatoriamente deverão estar armazenados na memória principal. Um programa em linguagem de máquina, armazenado na memória principal do computador, é composto por uma série de instruções que são executadas seqüencialmente pela CPU, através de operações básicas como somar, subtrair, comparar e movimentar dados. Desta forma, a CPU busca cada instrução na memória principal e a interpreta para sua execução. Figura 1 - Unidades funcionais de um computador Um programa em linguagem de máquina (figura 2) é executado a partir do conjunto de instruções da CPU (figura 3). Particularmente, o programa da figura 2 executa a seguinte operação: Prof. Adão de Melo Neto 8 Para verificar como o computador executa o programa descrito na Figura 2, consulte o anexo. Figura 2 - Programa em linguagem de máquina Prof. Adão de Melo Neto 9 Figura 3 – Conjunto de instruções do Processador A CPU é composta pela unidade de controle, unidade lógica aritmética e registradores. A Unidade de controle (UC) é responsável por controlar as atividades de todos os componentes do computador, como a gravação de um dado no disco ou a busca de uma instrução da memória. A unidade lógica e aritmética (ULA), é responsável pela realização de operações lógicas (testes e comparações) e aritméticas (somas e subtrações). Os registradores são dispositivos de alta velocidade, localizados fisicamente na CPU, para armazenamento temporário de dados. Funcionam como uma memória interna de alta velocidade do processador Alguns registradores são de uso específico e têm propósitos especiais, enquanto outros são ditos de uso geral. - Contador de instruções (CI) ou program counter (PC) é o registrador responsável pelo armazenamento do endereço da próxima instrução que a CPU deverá executar. Toda vez que a CPU execute uma instrução, o PC é atualizado com um novo endereço; - Apontador da pilha (AP) ou stack pointer (SP) é o registrador que contém o endereço de memória do topo da pilha, que é a estrutura de dados onde o sistema mantém informações sobre tarefas que estavam sendo processadas e tiveram que ser interrompidas por algum motivo (Figura 4); - Registrador de estado, também chamado em alguns equipamentos de program status word (PSW), é o registrador responsável por armazenar informações sobre a execução de intruções, como a ocorrência de carry e overflow. A cada instrução executada, o registrador de estado e alterado conforme o resultado gerado pela instrução. Prof. Adão de Melo Neto 10 Figura 4 – Endereço apontado pelo PC (Program Counter) Memória Principal A memória principal é a parte do computador onde são armazenados instruções e dados. Ela é composta por unidades de acesso chamadas células, sendo 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, e formada por um conjunto de células, onde cada célula possui um determinado número de bits (Figura 5). 0 1 2 Endereços M-1 Célula = n bits Figura 5 - Memória principal O acesso ao conteúdo de uma célula é realizado através da especificação de um número chamado endereço. O endereço é uma referência única, que podemos fazer a uma célula de memória. Quando um programa deseja ler ou escrever um dado em uma célula, deve primeiro especificar qual o endereço de memória desejado, para depois realizar a operação. A especificação do endereço é realizada através de um registrador denominado registrador de endereço de memória (memory register address - MAR) através do conteúdo deste registrador, a unidade de controle sabe qual a célula de memória que será acessada. Outro registrador usado em operações com a memória é o registrador de dados da memória Prof. Adão de Melo Neto 11 (memory buffer register—MBR) . Este registrador e utilizado para guardar o conteúdo de uma ou mais células de memória após uma operação de leitura, ou para guardar o dado que será transferido para a memória em uma operação de gravação. Este ciclo de leitura e gravação e mostrado na Figura 6. Operação de Leitura 1. A CPU armazena no MAR, o endereço da célula a ser lida. 2. A CPU gera um sinal de controle para a memória principal, indicando que uma operação de leitura deve ser realizada. 3. 0 conteúdo da(s) célula(s), identificada(s) pelo endereço contido no MAR, é transferido para o MBR. Operação de gravação 1. A CPU armazena no MAR, o endereço da célula que será gravada. 2. A CPU armazena no MBR, a informação que deverá ser gravada. 3. A CPU gera um sinal de controle para a memória principal, indicando que uma operação de gravação deve ser realizada. 4. A informação contida no MBR e transferida para a célula de memória endereçada pelo MAR. Figura 6 - Ciclo de leitura e gravação A capacidade de uma memória é limitada pelo tamanho do MAR. No caso de o registrador possuir n bits, a memória principal poderá no máximo endereçar 2n células, isto é , do endereço 0 ao 2n-1. A memória principal pode ser classificada em função de sua volatilidade. Uma memória volátil não preserva seu conteúdo sem uma fonte de alimentação. A RAM (random access memory), que constitui quase que a totalidade da memória principal de um computador é uma memória volátil que pode ser lida e gravada. A memória ROM (read-only memory), já vem pré-gravado do fabricante, geralmente com algum programa, e seu conteúdo é preservado mesmo quando a alimentação e desligada (não volátil). Memória Cache A MEMÓRIA cache é 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 fez referência a um dado armazenado na memória principal, ele "olha" antes na memória cache. Se o processador encontrar o dado na cache, não ha necessidade do acesso a memória principal; do contrário, o acesso e obrigatório Neste último caso, o processador, a partir do dado referenciado, transfere um bloco de dados para a cache (Figura 7). O tempo de transferência entre as memórias e pequeno, se comparado com o aumento do desempenho obtido com a utilização, ao desse tipo de memória. Apesar de ser uma memória de acesso rápido, seu uso é limitado em função do alto custo. Figura 7 – Memória Cache Prof. Adão de Melo Neto 12 Memória Secundária 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 a memória secundária é lento, se comparado com o acesso a memória cache ou à principal, porém seu custo e baixo e sua capacidade de armazenamento é bem superior a da memória principal. Podemos citar, como exemplos de memórias secundárias, a fita magnética, o disco magnético e o disco óptico (Figura 9). A Figura 8 mostra a relação entre os diversos tipos de dispositivos de armazenamento apresentados, comparando custo, velocidade de acesso e capacidade de armazenamento. Registradores Maior Capacidade de armazenamento Memória Cache Maior Custo e Maior Velocidade de Acesso Memória Principal Memória Secundária Figura 8 - Relação entre os diversos tipos de dispositivos de armazenamento. Figura 9 - Disco ótico, disco magnético e fita magnética 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. 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. Os dispositivos utilizados como memória secundária, como discos e fitas magnéticas se caracterizam por armazenar de três a quatro vezes mais informações que a memória principal. Seu custo e relativamente baixo, porém o tempo de acesso a memória secundária é de quatro a seis vezes maior que o acesso a memória principal. Alguns dispositivos servem para a comunicação, ao homem-máquina, como teclados, monitores de vídeo, impressoras, plotters, entre outros. Com o avanço no desenvolvimento de aplicações de uso cada vez mais geral, procurase aumentar a facilidade de comunicação entre o usuário e o computador. A implementação, de interfaces mais amigáveis permite, cada vez mais, que pessoas sem conhecimento específico sobre informática possam utilizar o computador. Scanner, caneta ótica, mouse, dispositivos sensíveis a voz humana e ao calor do corpo humano são alguns exemplos desses tipos de dispositivos. Prof. Adão de Melo Neto 13 Barramento A CPU, a memória principal e os dispositivos de E/S são interligados através de linhas de comunicação denominada barramento. 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 CPU e memória principal, podemos observar que três barramentos são necessários para que a comunicação seja realizada (Figura 1). O barramento de dados transmite informações entre a memória principal e a CPU. O barramento de endereços é utilizado pela CPU para especificar o endereço, o da célula de memória que será acessada. Finalmente , o barramento de controle é por onde a CPU envia os pulsos de controle relativos as operações de leitura e gravação. Pipelining O pipelining é uma técnica que permite o processador executar múltiplas instruções paralelamente e em diferentes estágios (Figura 10). O conceito de processamento pipeline se assemelha muito a uma linha de montagem, onde uma tarefa e dividida em uma seqüência de subtarefas, executadas em diferentes estágios, dentro da linha de produção. Da mesma forma que em uma linha de montagem, a execução de uma instrução pode ser dividida em subtarefas. O processador, através de suas várias unidades funcionais pipeline, funciona de forma a permitir que, enquanto uma instrução se encontra na fase de execução por exemplo outra possa estar na fase de busca simultaneamente. Figura 10 – Subtarefas e execução da instrução em pipeline Ativaçã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, denominado ativação do sistema (boot), é realizado por um programa localizado em um posição específica do disco (disco 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 (Figura 11). Prof. Adão de Melo Neto 14 Memória Principal Disco Boot Sistema Operacional Figura 11 - Ativação do sistema Arquiteturas RISC e CISC A linguagem de máquina de um computador é a linguagem de programação que o processador realmente consegue entender (Figura 2). Cada processador possui um conjunto único de instruções de máquina, definido pelo próprio fabricante. As instruções especificam detalhes, como registradores, modos de endereçamento e tipos de dados, que caracterizam um processador e suas potencialidades (Figura 3). Um programa em linguagem de máquina é executado diretamente pelo hardware em processadores de arquitetura RISC, porém em máquinas CISC isto não acontece. Neste caso, como podemos observar na Figura 15, entre os níveis de linguagem de máquina e o hardware, existem ainda o da microprogramação. Um processador com arquitetura RISC (Reduced Instruction Set Computer) se caracteriza por possuir poucas instruções de máquina, em geral bastante simples, que são executadas diretamente pelo hardware. Na sua maioria, estas instruções não acessam a memória principal, trabalhando principalmente com registradores que, neste tipo de processador, se apresentam em grande número. Estas características, além de ajudarem as instruções serem executadas em alta velocidade. Neste tipo de arquitetura, a implementação do pipeline é fácil. Como exemplos de processadores RISC podemos citar o Sparc (SUN) e RS-6000 (IBM), Os processadores CISC (Complex Instruction Set computers) já possuem instruções complexas que são interpretadas por microprogramas. O número de registradores é pequeno e qualquer instrução pode referenciar a memória principal. Neste tipo de arquitetura, a implementação do pipeline é mais difícil. São exemplos de processadores CISC o VAX (DEC) e o Pentium (Intel). Prof. Adão de Melo Neto 15 2.3 Software O Hardware por si só não tem a menor utilidade. Para torná-lo útil existe um conjunto de programas, utilizado como interface entre as necessidades do usuário e as capacidades do hardware. A utilização de softwares adequados às diversas tarefas e aplicações (conceitos de camadas) torna o trabalho do usuários muito mais simples e eficiente. Tradutores Nos sistemas operacionais antigos, o ato de programar era bastante complicado, já que o programador deveria possuir conhecimento do hardware e programar em painéis através de fios (Figura 14). Esses programas eram desenvolvidos em linguagem de máquina e carregados diretamente na memória principal para execução. Com o surgimento das primeiras linguagens de montagem (assembly languages) (Figura 2) e das linguagens de alto nível (por exemplo C, Pascal, etc) , o programador deixou de se preocupar com muitos aspectos pertinentes ao hardware, como em qual região da memória o programa deveria ser carregado ou quais endereços de memória seriam reservados para as variáveis. A utilização dessas linguagens facilitou a construção de programas em muitos aspectos. Desse modo, um programa poderia ser escrito de uma forma bem documentada e com facilidades para realizar alterações. Apesar das vantagens proporcionadas pelas linguagens de montagem e de alto nível, elas não estão prontas para serem executadas diretamente pelo processador. Para isto elas devem ser convertidas da representação simbólica das instruções para o código de máquina (linguagem de máquina). O módulo gerado pelo tradutor é conhecido como módulo-objeto que apesar de estar em código de máquina, ainda não pode ser executado. Isto ocorre em função de um programa poder chamar rotinas externas, e não tem como o tradutor associar o programa principal as sub-rotinas chamadas. Esta função é executada pelo linker. O montador (assembler) é um utilitário utilizado para traduzir um programa fonte em linguagem de montagem (assembly languages) em um programa-objeto não executável LINGUAGEM DE MONTAGEM Î MONTADOR Î MÓDULO-OBJETO Um compilador é um utilitário utilizado para gerar a partir de uma linguagem de alto-nível em um programa em linguagem de máquina não executável. As Linguagem de alto nível tais como Pascal, Fortran e Cobol O programador não tem relação direta com a máquina, ou seja, programador não preocupa com arquitetura do processador. LINGUAGEM DE ALTO NÍVEL Î COMPILADOR Î MÓDULO-OBJETO O linker é considerado um Tradutor que não gera módulo-objeto. Durante a execução do programa traduz cada instrução e a executa imediatamente. São exemplos o Basic e Perl Linker O linker gera a partir de um ou mais módulos-objeto um programa executável Suas funções são resolver referências simbólicas existentes entre os módulos e reservar memória para execução do programa Prof. Adão de Melo Neto 16 Módulo Fonte Compilador Módulo Objeto Módulo Fonte Compilador Módulo Objeto Módulo Fonte Compilador Módulo Objeto Linker Programa Executável Loader É um utilitário utilizado para carregar na memória principal um programa a ser executado Depurador O desenvolvimento de programas está sujeito a erros de lógica, independentemente de metodologias utilizadas pelo programador. A depuração é um dos estágios desse desenvolvimento, e a utilização de ferramentas adequadas é essencial para acelerar o processo de correção de programas. O depurador (debbuger) é o utilitário que permite ao usuário controlar a execução de um programa a fim de detectar erros na sua estrutura. Prof. Adão de Melo Neto 17 3. Introdução a Sistemas Operacionais 3.1 Introdução Um sistema operacional é um conjunto de rotinas (programa) executado pelo processador cuja principal função é controlar o funcionamento do computador, como um gerente dos diversos recursos disponíveis no sistema, tais como processadores, memórias e dispositivos de entrada e saída. Facilidade de acesso aos recursos do sistema Sem um sistema operacional, um usuário, para interagir com o computador deveria conhecer profundamente diversos detalhes do hardware do equipamento (Figura 14) , o que torna seu trabalho lento e com grande possibilidade erros. O sistema operacional, então, serve de interface entre o usuários e os recursos disponíveis no sistema, tornando esta comunicação transparente e permitindo ao usuário um trabalho mais eficiente e com menores chances de erros (Figura 12). Para a maioria de nós uma operação cotidiana, como, por exemplo, a leitura de um arquivo em disquete, pode parecer simples. Na realidade, existe um conjunto de rotinas específicas, controladas pelo sistema operacional, responsável por acionar a cabeça, a de leitura e gravação da unidade de disco, posicionar na trilha e setor onde estão os dados, transferir os dados do disco para a memória e, finalmente, informar ao programa a chegada dos dados. Este conceito de ambiente simulado, criado pelo sistema operacional, é denominado máquina virtual (virtual machine) e está presente, de alguma forma, na maioria dos sistemas atuais. É comum pensar-se que compiladores, linkers, bibliotecas, depuradores e outras ferramentas fazem parte do sistema operacional, mas, na realidade, estas facilidades são apenas utilitários, destinados a ajudar a interação do usuário com o computador (Figura 15). Figura 12 - Visão do sistema operacional como interface entre os usuários e os recursos do sistema. Prof. Adão de Melo Neto 18 Compartilhamento de recursos de forma organizada e protegida O sistema operacional é responsável por permitir o acesso concorrente a esse e a outros recursos, de forma organizada e protegida, dando ao usuário a impressão de ser o único a utilizá-los. Quando pensamos em sistemas multiusuário, onde vários usuários podem estar compartilhando os mesmos recursos, como, por exemplo, memória e discos, é necessário que todos tenham oportunidade de ter acesso a esses recursos, de forma que um usuário não interfira no trabalho do outro. Se imaginarmos, por exemplo, que uma impressora possa ser utilizada por vários usuários do sistema, deverá existir algum controle para impedir que a impressão de um usuário interrompa a impressão de outro. Não é apenas em sistemas multiusuário que o sistema operacional é importante. Se pensarmos que um computador pessoal (sistema monousuário) nos permite executar várias tarefas, como imprimir um documento, copiar um arquivo pela internet ou processar uma planilha, o sistema operacional deve ser capaz de controlar a execução concorrentes de todas essas tarefas. 3.2 Máquinas de Níveis Um computador, visto somente como um gabinete composto de circuitos eletrônicos, cabos e fontes de alimentação (hardware), não tem nenhuma utilidade. É através de programas (software) que o computador consegue armazenar dados em discos, imprimir relatórios, gerar gráficos, realizar cálculos, entre outras funções. 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 (Figura 14). Isso era uma grande dificuldade para os programadores da época (Figura 13 (a)). A solução para esse problema foi o surgimento do sistema operacional, que tornou a interação entre usuário e computador mais simples, confiável e eficiente. A partir desse acontecimento, não existia mais a necessidade de o programador se envolver com a complexidade do hardware para poder trabalhar; ou seja, a parte física do computador tornou-se transparente para o usuário (Figura 13 (b)). Figura 13 - Visão modular do computador pelo usuário. Prof. Adão de Melo Neto 19 Figura 14 - Programação em painéis Partindo desse princípio, 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). Desta forma, o usuário pode enxergar a máquina como sendo apenas o sistema operacional, ou seja, como se o hardware não existisse. Esta visão modular e abstrata é chamada máquina virtual. Na realidade, um computador não possui apenas dois níveis, e sim tantos níveis quanto forem necessários para adequar o usuário às suas diversas aplicações. Quando o usuário está trabalhando em um desse níveis, não necessita da existência das outras camadas, acima ou abaixo de sua máquina virtual. Atualmente, a maioria dos computadores possui a estrutura mostrada na Figura 15, podendo conter mais ou menos camadas. Aplicativos Utilitários Sistema Operacional Linguagem de Máquina Microprogramação Hadware Dispositivos Físicos Figura 15 - Máquina de níveis. ANEXO: Execução do Programa da Figura 2 pelo computador Prof. Adão de Melo Neto 20 Prof. Adão de Melo Neto 21 Obs: opcode significa código da operação Prof. Adão de Melo Neto 22 4. Tipos de Sistemas Operacionais 4.1 Introdução Tipos de sistemas operacionais e sua evolução estão intimamente relacionados com a evolução do hardware e das aplicações por ele suportadas. A seguir , abordaremos os diversos tipos de sistemas operacionais, suas características vantagens e desvantagens. Tipos de Sistemas Operacionais Sistemas Monoprogamáveis/ Monotarefa Sistemas Multiprogramáveis/ Multitarefa Sistemas com Múltiplos Processadores Figura 16 - Tipos de sistemas operacionais 4.2 Sistemas Monoprogramáveis/Monotarefa Os primeiros sistemas operacionais eram tipicamente voltados para a execução de um único programa. Qualquer outro programa, para ser executado, deveria aguardar o término do programa corrente. Os sistemas monoprogramáveis, como vieram a ser conhecidos, se caracterizam por permitir que o processador, a memória e os periféricos permaneçam exclusivamente dedicados à execução de um único programa. Neste tipo de sistema, enquanto um programa aguarda por um evento, como a digitação de um dado, o processador permanece ocioso, sem realizar qualquer tipo de processamento. A memória é subtilizada caso o programa não a preencha totalmente, e os periféricos, como discos e impressoras, estão dedicados a um único usuário. Comparados a outros sistemas, os sistemas monoprogramáveis/monotarefa são de simples implementação, não existindo muita preocupação com problemas de compartilhamento de recursos, tais como memória, processador e dispositivos de E/S. UCP Programa/ Tarefa Memória Dispositivos de E/S Figura 17 - Sistemas monoprogramáveis/monotarefa Prof. Adão de Melo Neto 23 4.3 Sistemas Multiprogramáveis/Multitarefa Os Sistemas multiprogramáveis, embora mais eficientes, são mais complexos. Enquanto em sistemas monoprogramáveis existe apenas um programa utilizando seus diversos recursos (memória, processador, dispositivos de entrada e saída) , nos multiprogramáveis vários programas dividem esses mesmos recursos. As vantagens do uso de sistemas multiprogramáveis são a redução de custos, a partir do compartilhamento dos diversos recursos do sistema e a redução do tempo médio de execução das aplicações. A partir do número de usuários que interagem com o sistema, podemos classificar os sistemas multiprogramáveis como monousuário e multiusuário. Sistema multiprogramáveis monousuário são encontrados nos computadores pessoais onde há um único usuário interagindo com o sistema. Neste caso é possível que ele execute diversas tarefas simultaneamente como a edição de um texto e o acesso à internet. O sistemas multiprogramáveis multiusuário são ambientes interativos que permitem diversos usuários conectarem ao sistema simultaneamente. Monoprogramação/Monotarefa Multiprogramação/Multitarefa Um usuário Monousuário Monousuário Dois ou mais usuários N/A Multiusuário Sistemas X Usuários Os sistemas multiprogramáveis/multitarefa podem ser classificados pela forma com que suas aplicações são gerenciadas, podendo ser divididos em sistemas batch, de tempo compartilhado ou de tempo real. Um sistema operacional pode suportar um ou mais desses tipos de processamento. Sistemas Multiprogramáveis/Multirefa Sistemas Batch Sistemas de Tempo compartilhado Sistemas de Tempo Real Figura 18 - Tipos de sistemas multiprogramáveis/multitarefa Sistemas Batch Os sistemas batch (lote) foram os primeiros sistemas multiprogramáveis a serem implementados e caracterizamse por terem seus programas, quando submetidos, armazenados em disco ou fita, onde esperam para ser executados seqüencialmente. Normalmente, os programas, também chamados de jobs, não exigem interação com os usuários, pois o mesmo lê e grava dados em discos e fitas. Alguns exemplos de aplicações originalmente processadas em batch são programas envolvendo cálculos numéricos, compilações, ordenações, backups e todos aqueles onde não é necessária a interação com o usuário. Sistemas de Tempo Compartilhado Estes sistemas permitem que diversos programas sejam executados a partir da divisão do tempo do processador em pequenos intervalos denominados fatias de tempo (time-slice). Caso o programa do usuário não esteja concluído nesse intervalo de tempo, ele é substituído por um de outro programa, enquanto fica esperando por uma nova fatia de tempo. Não só o processador é compartilhado nesse sistema, mas também a memória e os periféricos, como discos e impressoras. O sistema cria para o usuário um ambiente de trabalho próprio, dando a impressão de que todo o sistema está dedicado, exclusivamente, a ele. Os sistemas de tempo compartilhado (time-sharing) permitem a interação dos usuários com o sistema, basicamente através de terminais que incluem vídeo, teclado e mouse. Prof. Adão de Melo Neto 24 Sistemas de tempo compartilhado são de implementação complexa, porém, se levado em consideração o tempo de desenvolvimento e depuração de uma aplicação, aumentam consideravelmente a produtividade dos seus usuários, reduzindo os custos de utilização do sistema. Sistemas de Tempo Real Os sistemas de tempo real (real time) são bem semelhantes em implementação aos sistemas de tempo compartilhado. A maior diferença é o tempo de resposta exigido no processamento das aplicações. Enquanto em sistemas de tempo compartilhado o tempo de resposta 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 contrário poderão ocorrer problemas irreparáveis. Não existe idéia de fatia de tempo, ou seja, um programa detém o processador o tempo que for necessário, ou até que apareça outro prioritário em função de sua importância no sistema. Esta importância ou prioridade de execução é controlada pela própria aplicação e não pelo sistema operacional, como nos sistemas de tempo compartilhado. Esses sistemas, normalmente, estão presentes em controle de processos, como no monitoramento de refinarias de petróleo, controle de tráfego aéreo, de usinas termelétricas e nucleares, ou em qualquer aplicação onde o tempo de resposta é fator fundamental. 4.4 Sistemas com Múltiplos Processadores Os sistemas com múltiplos processadores caracterizam-se por possuir duas ou mais CPUS interligadas, trabalhando em conjunto. A vantagem deste tipo de sistema é a de permitir que vários programas sejam executados ao mesmo tempo ou que um mesmo programa seja subdividido em partes para serem executadas simultaneamente em mais de um processador. Um fator-chave no desenvolvimento de sistemas operacionais com múltiplos processadores é a forma de comunicação entre as CPUs e o grau de compartilhamento da memória e dos dispositivos de entrada e saída. Em função desses fatores, podemos classificar os sistemas em fortemente acoplados ou 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 Figura 19 - Sistemas com múltiplos processadores. 4.4.1 Sistemas Fortemente Acoplados Nos sistemas fortemente acoplados (tightly coupled) existem vários processadores compartilhando uma única memória e dispositivos de E/S sendo gerenciados por apenas um sistema operacional. Os sistemas fortemente acoplados são conhecidos como multiprocessadores. Múltiplos processadores permitem que vários programas sejam executados ao mesmo tempo, ou que um programa seja dividido em subprogramas, para execução simultânea em mais de um processador. Dessa forma, é possível ampliar a capacidade de computação de um sistema, adicionando-se apenas novos processadores, com um custo muito inferior à aquisição de outros computadores. Com o multiprocessamento, novos problemas de concorrência foram introduzidos, pois vários processadores podem estar acessando as mesmas áreas de memória. Além disso, existe o problema de organizar de forma eficiente os processadores, a memória e os periféricos. Uma conseqüência do multiprocessamento foi o surgimento dos computadores voltados, principalmente, para processamento científico, aplicado, por exemplo, ao desenvolvimento aeroespacial, prospeção de petróleo, simulações, Prof. Adão de Melo Neto 25 processamento de imagens e CAD. A princípio qualquer aplicação que faça uso intensivo da CPU será beneficiada pelo acréscimo de processadores ao sistema. Memória UCP UCP Dispositivos de E/S Dispositivos de E/S Figura 20 - Sistemas fortemente acoplados Link de Comunicação UCP UCP Dispositivos de E/S Memória Dispositivos de E/S Memória Figura 21 - Sistemas fracamente acoplados Sistemas Assimétricos Na organização assimétrica ou mestre/escravo(master/slave), somente um processador (mestre) pode executar serviços do sistema operacional, como, por exemplo, realizar operações de entrada/saída. Sempre que um processador do tipo escravo precisar realizar uma operação de entrada/saída, terá de requisitar o serviço ao processador mestre. Dependendo do volume de operações de entrada/saída destinadas aos processadores escravos, o sistema pode se tornar ineficiente, devido ao elevado número de interrupções que deverão ser tratadas pelo mestre. UCP Master Dispositivos de E/S S.O UCP Slave Usuários Usuários Figura 22 - Sistemas Fortemente Acoplados Assimétricos. Prof. Adão de Melo Neto 26 Se o processador falhar, todo o sistema ficará incapaz de continuar o processamento. Neste caso, o sistema deve ser reconfigurado, fazendo um dos processadores escravos assumir o papel do mestre. Mesmo sendo uma organização simples de implementar e quase um extensão dos sistemas multiprogramáveis, esse tipo de sistema não utiliza eficientemente o hardware, devido à assimetria dos processadores, que não realizam as mesmas funções. Sistemas Simétricos O multiprocessamento simétrico (Simmetric Multiprocessing- SMP), ao contrário da organização mestre/escravo, implementa a simetria dos processadores, ou seja, todos os processadores realizam as mesmas funções. Apenas algumas poucas funções ficam a cargo de um único processador, como, por exemplo, a inicialização (boot) do sistema. UCP UCP Dispositivos de E/S S.O Usuários Figura 23 - Sistemas Fortamente Acoplados Simétricos. Como vários processadores estão utilizando, independentemente, a mesma memória e o mesmo sistema operacional, é natural a ocorrência de acessos simultâneos às mesmas áreas de memória. A solução desses conflitos fica a cargo do hardware e do sistema operacional. No processamento simétrico, um programa pode ser executado por qualquer processador, inclusive por vários processadores ao mesmo tempo (paralelismo). Além disso, quando um processador falha, o sistema continua em funcionamento sem nenhuma interferência manual, porém com menor capacidade de computação. 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. 4.4.2 Sistemas Fracamente Acoplados Os sistemas fracamente acoplados caracterizam-se por possuir dois ou mais sistemas de computação interligados, sendo que cada sistema possui o seu próprio sistema operacional, gerenciando os seus recursos, como processador, memória e dispositivos de entrada/saída. Até meados da década de 80, os sistemas operacionais e as aplicações suportadas por eles eram tipicamente concentradas em sistemas de grande porte, com um ou mais processadores. Nos sistemas centralizados, os usuários utilizam terminais não inteligentes conectados a linhas seriais dedicadas ou linhas telefônicas públicas para a comunicação interativa com esses sistemas. No modelo centralizado, os terminais não têm capacidade de processamento. Sempre um usuário deseja alguma tarefa, o pedido é encaminhado ao sistema, que realiza o processamento e retorna uma resposta, utilizando as linhas de comunicação. Com a evolução dos computadores pessoais e das estações de trabalho, juntamente com o avanço das telecomunicações e da tecnologia de redes, surgiu um novo modelo de computação, chamado de modelo de rede de computadores em que existem dois ou mais sistemas inteligentes (estação), interligados através de linhas de comunicação, que fornecem algum tipo de serviço aos demais. Com base no grau de interação das estações da rede, os sistemas fracamente acoplados podem ser divididos em sistemas operacionais de rede e sistemas distribuídos. Os sistemas operacionais de rede (SOR) permitem que uma estação compartilhe seus recursos, como uma impressora ou um diretório, com as demais estações da rede. Um exemplo são as redes locais, onde uma estação pode oferecer serviços de arquivos e impressão para as demais estações da rede, dentre outros serviços (Figura 10). Prof. Adão de Melo Neto 27 Figura 24 - Sistemas operacionais de rede. Enquanto nos sistemas operacionais de rede os usuários têm conhecimento das estações e seus serviços, nos sistemas distribuídos o sistema operacional esconde os detalhes das estações individuais e passa a tratá-los como um conjunto único, como se fosse um sistema fortemente acoplado. Os sistemas distribuídos permitem, por exemplo, que uma aplicação seja dividida em partes e que cada parte seja executada em estações diferentes da rede de computadores. Para o usuário e suas aplicações é como se não existisse a rede de computadores, mas um único sistema centralizado. Outro exemplo de sistema distribuído são os clusters. Em um cluster existem dois ou mais servidores ligados, normalmente, por algum tipo de conexão de alto desempenho. O usuário não conhece os nomes dos membros do cluster e não sabe quantos são. Quando ele precisa de algum serviço, basta solicitar ao cluster para obtê-lo. Atualmente, sistemas em cluster são utilizados para serviços de banco de dados e Web. Rede Usuário Figura 25 - Sistemas Operacionais Distribuídos. Prof. Adão de Melo Neto 28 5. Sistemas Multiprogramáveis 5.1 Introdução Sistemas operacionais podem ser vistos como um conjunto de rotinas que executam concorrentemente de uma forma ordenada. A possibilidade do processador executar instruções ao mesmo tempo que outras operações, como, por exemplo, operações de E/S, permite que diversas tarefas sejam executadas concorrentemente pelo sistema. O conceito de concorrência é o princípio básico para o projeto e implementação de sistemas multiprogramáveis. Neste capítulo serão apresentados mecanismos, técnicas e dispositivos que possibilitam a implementação de concorrência como interrupções e exceções, buffering, spooling e reentrância. 5.2 Sistemas Monoprogramáveis X Multiprogramáveis Nos sistemas monoprogramáveis, somente um programa pode estar residente em memória, e a CPU permanece dedicada, exclusivamente, à execução desse programa. Podemos observar que, nesse tipo de sistema, ocorre um desperdício na utilização da CPU, pois enquanto o programa está realizando, por exemplo, uma leitura em disco, o processador permanece sem realizar nenhuma tarefa (Figura 26(a)). O tempo de espera é consideravelmente grande, já que as operações com dispositivos de entrada e saída são muito lentas se comparadas com a velocidade da CPU. Outro aspecto que devemos considerar é a subutilização da memória. Um programa que não ocupe totalmente a memória principal 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 CPU. Dessa forma, quando um programa solicita uma operação de entrada/saída, outros programas poderão estar disponíveis para utilizar o processador (Figura 26(b)). Nesse caso, a CPU permanece menos tempo ociosa e a memória principal é utilizada de forma mais eficiente, pois existem vários programas residentes se revezando na utilização do processador. A utilização concorrente da CPU deve ser implementada de maneira que, quando um programa perde o uso do processador e depois retorna para continuar o processamento, seu estado deve ser idêntico ao do momento em que foi interrompido. O programa deverá continuar sua execução exatamente na instrução seguinte àquela em que havia parado, aparentando ao usuário que nada aconteceu. Em sistemas de tempo compartilhado, existe a impressão de que o computador está inteiramente dedicado ao usuário, ficando todo esse mecanismo transparente para ele. No caso de periféricos, é comum termos, em sistemas monoprogramáveis, impressoras paradas por um grande período de tempo e discos com acesso restrito a um único usuário. Esses problemas são solucionados em sistemas multiprogramáveis, onde é possível compartilhar impressoras entre vários usuários e realizar acesso concorrente a discos por diversos programas. UCP 1 E/S E/S UCP Livre 1 1 2 tempo tempo Sistema Nomoprogramável (a) Sistema Multiprogramável (b) Figura 26 - Sistema monoprogramável X multiprogramável. Prof. Adão de Melo Neto 29 5.3 Interrupção e Exceção Durante a execução de um programa, alguns eventos podem ocorrer durante seu processamento, obrigando a intervenção do sistema operacional. Este tipo de intervenção é chamado de interrupção ou exceção. Nestas situações o fluxo de execução do programa é desviado para uma rotina especial de tratamento. O que diferencia uma interrupção de uma exceção é o tipo de evento que gera esta condição. Uma interrupção é gerada pelo sistema operacional ou por algum dispositivo e, neste caso, independe do programa que está sendo executado. Um exemplo é quando um periférico avisa à CPU que está pronto para transmitir algum dado. Neste caso, a CPU deve interromper o programa para atender a solicitação do dispositivo. Programa Interrupção Salva os registradores . . . . . . . . . . . Identifica a origem da interrupção Obtém o endereço da rotina de tratamento Rotina de Tratamento : : : Restaura os registradores Figura 27 - Mecanismo de interrupção. Não existe apenas um único tipo de interrupção e sim diferentes tipos que devem ser atendidos por diversas rotinas de tratamento. No momento que uma interrupção acontece, a CPU deve saber para qual rotina de tratamento deverá ser desviado o fluxo de execução. Essa informação está em uma estrutura do sistema chamada vetor de interrupção, que contém a relação de todas as rotinas de tratamento existentes, associadas a cada tipo de interrupção. A interrupção é o mecanismo que tornou possível a implementação da concorrência nos computadores, sendo o fundamento básico dos sistemas multiprogramáveis. É em função desse mecanismo que o sistema operacional sincroniza a execução de todas as suas rotinas e dos programas dos usuários, além de controlar os periféricos e dispositivos do sistema. Uma interrupção é gerada por um evento assíncrono. Esses eventos, por serem imprevisíveis, podem ocorrer múltiplas vezes simultaneamente, como no caso de diversos dispositivos de E/S informarem à CPU que estão prontos para receber ou transmitir dados. Uma exceção é resultado direto da execução de uma instrução de um programa. Situações como a divisão de um número por zero ou a ocorrência de um overflow caracterizavam essa situação. Uma exceção é gerada por um evento síncrono que é o resultado direto da execução do programa corrente. Tais eventos são previsíveis e, por definição só podem ocorrer um de cada vez. Se um programa que causa esse tipo de evento for reexecutado, com a mesma entrada de dados, a exceção ocorrerá sempre na mesma instrução. 5.4 Operações de Entrada/Saída Em sistemas mais primitivos, a comunicação entre a CPU e os periféricos era controlada por um conjunto de instruções especiais, denominadas instruções de entrada/saída, executadas pela própria CPU. Prof. Adão de Melo Neto 30 Essas instruções continham detalhes específicos de cada periférico, como quais trilhas e setores de um disco deveriam ser lidos ou gravados em determinado bloco de dados. Esse tipo de instrução limitava a comunicação do processador a um grupo particular de dispositivos. A implementação de um dispositivo chamado controlador ou interface permitiu à CPU agir de maneira independente dos dispositivos de E/S. Com esse novo elemento, a CPU não se comunicava mais diretamente com os periféricos, mas sim através do controlador. Isso significa as instruções de E/S, por não ser mais preciso especificar detalhes de operação dos periféricos, tarefa esta realizada pelo controlador. UCP Memória Principal Controlador : : : : Figura 28 - Controlador. Com a implementação do mecanismo de interrupção no hardware dos computadores, as operações de E/S puderam ser realizadas de uma forma mais eficiente. Em vez de o sistema periodicamente verificar o estado de uma operação pendente, o próprio controlador interrompia a CPU para avisar do término da operação. Com esse mecanismo, denominado E/S controlada por interrupção, a CPU, após a execução de um comando de leitura ou gravação, fica livre para o processamento de outras tarefas. O controlador por sua vez, ao receber, por exemplo, um sinal de leitura, fica encarregado de ler os blocos dos disco e armazená-los em memória ou registradores próprios. Em seguida, o controlador, através de uma linha de controle, sinaliza uma interrupção ao processador. Quando a CPU atende a interrupção, a rotina responsável pelo tratamento desse tipo de interrupção transfere os dados dos registradores do controlador para a memória principal. Ao término da transferência, a CPU volta a executar o programa interrompido e o controlador fica novamente disponível para outra operação. 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 CPU esperar pelo término da operação, além de permitir que várias operações de E/S sejam executadas simultaneamente. Apesar disso, essa implementação ainda sobrecarregava a CPU, uma vez que toda transferência de dados entre memória e periféricos exigia a intervenção da CPU. A solução desse problema foi a implementação, por parte do controlador, de uma técnica de transferência de dados denominada DMA (Direct Memory Access). A técnica de DMA permite que bloco de dados seja transferido entre memória e periféricos, sem a intervenção da CPU, 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 CPU para o controlador informações como: onde o dado está localizado, qual o dispositivo de E/S envolvido na operação, posição inicial da memória de onde os dados serão lidos ou gravados e o tamanho do bloco de dados. Com estas informações, o controlador realiza a transferência entre o periférico e a memória principal, e a CPU é somente interrompida no final da operação. A área de memória utilizada pelo controlador na técnica de DMA é chamada buffer, sendo reservada exclusivamente para este propósito. No momento em que a transferência de DMA é realizada, o controlador deve assumir, momentaneamente, o controle do barramento. Como a utilização do barramento é exclusiva de um dispositivo, a CPU deve suspender o acesso ao bus, temporariamente, durante a operação de transferência. Este procedimento não gera uma interrupção, e a CPU pode realizar tarefas, desde que sem a utilização do barramento, como, por exemplo, um acesso à memória cache. A extensão do conceito do DMA possibilitou o surgimento dos canais de E/S, ou somente canais, introduzidos pela IBM no Sistema 7094. O canal de E/S é um processador com capacidade de executar programas de E/S, permitindo o controle total sobre operações de entrada e saída. As instruções de E/S são armazenadas na memória principal pela CPU, porém o canal é responsável pela sua execução. Assim, a CPU realiza uma operação de E/S, instruindo o canal para executar um programa localizado na memória (programa de canal). Este programa especifica os dispositivos para Prof. Adão de Melo Neto 31 transferência, buffers e ações a serem tomadas em caso de erros. O canal de E/S realiza a transferência e, ao final gera uma interrupção, avisando do término da operação. Um canal de E/S pode controlar múltiplos dispositivos através de diversos controladores. Cada dispositivo, ou conjunto de dispositivos, é manipulado por um único controlador. O canal atua como um elo de ligação entre a CPU e o controlador. Memória Principal UCP Cana de E/S Controlador Controlador ..... ..... Figura 29 - Canal de E/S 5.5 Buffering A técnica de buffering consiste na utilização de uma área de memória para a transferência de dados entre os dispositivos de E/S e a memória principal denominada buffer. O buffering veio permitir que, quando um dado fosse transferido para o buffer após uma operação de leitura, o dispositivo de entrada ficasse livre para iniciar uma nova leitura. Neste caso, enquanto a CPU manipula o dado localizado no buffer, o dispositivo de entrada inicia uma nova leitura. O mesmo raciocínio pode ser aplicado para operações de gravação, onde a CPU coloca o dado no buffer para um dispositivo de saída manipular. Memória Principal UCP Gravação Leitura Buffer Gravação Controlador de E/S Leitura Figura 30 - Operações utilizando buffer. O buffering é outra implementação para minimizar o problema da disparidade da velocidade de processamento existente entre a CPU e os dispositivos de E/S. O objetivo do buffering é manter, na maior parte do tempo, CPU e dispositivos de E/S ocupados. Prof. Adão de Melo Neto 32 5.6 Spooling A técnica de spooling (simultaneous peripheral operation on-line) foi introduzida no final dos anos 50 para aumentar a produtividade e a eficiência dos sistemas operacionais. Naquela época, os programas dos usuários eram submetidos um a um para processamento pelo operador. Como a velocidade de operação dos dispositivos de entrada/saída é muito lenta se comparada à do processador, era comum que a CPU ficasse ociosa à espera de programas e dados de entrada ou pelo término de uma impressão. A solução foi armazenar os vários programas e seus dados, também chamados de jobs, em uma fita magnética e, em seguida, submetê-los a processamento. Desta forma, a CPU poderia processar seqüencialmente cada job, diminuindo o tempo de execução dos jobs e o tempo de transição entre eles. Da mesma forma, em vez de um job gravar suas saídas diretamente na impressora, poderia direcioná-las para uma outra fita, que depois seria impressa integralmente. Esta forma de processamento é chamada de spooling e foi a base dos sistemas batch. 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. Um exemplo dessa técnica está presente quanto impressora são utilizadas. No momento em que um comando de impressão é executado por um programa, as informações que serão impressas são gravadas em um arquivo em disco (arquivo de spool), para ser impresso posteriormente pelo sistema Figura 31. Dessa forma, situações como a de um programa reservar a impressora, imprimir uma linha e ficar horas para continuar a impressão não acontecerão. Essa implementação permite maior grau de compartilhamento na utilização de impressoras. Sistema Operacional Programa Arquivo de Spool Impressão Figura 31 - Técnico de spooling. Atualmente, a técnica de spooling é implementada na maioria dos sistemas operacionais. Fazendo com que tanto a CPU quanto os dispositivos de E/S seja aproveitados de forma mais eficiente. 5.7 Reentrância É comum, em sistemas multiprogramáveis, vários usuários executarem os mesmos utilitários do sistema operacional simultaneamente, como, por exemplo, um editor de textos. Se cada usuário que utilizasse o editor trouxesse o código do utilitário para a memória, haveria diversas cópias de um mesmo programa na memória principal, o que ocasionaria um desperdício de espaço. 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. Utilitários do sistema como editores de texto. Compiladores e linkers, são exemplos de código reentrante que proporcionam uma utilização mais eficiente da memória principal. Prof. Adão de Melo Neto 33