Universidade do Sul de Santa Catarina - UNISUL - IME-USP

Propaganda
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
Download