Você está na página 1de 247

Infraestrutura de Hardware

Juliana Regueira Basto Diniz


Abner Corrêa Barros

Volume 1

Recife, 2009
Universidade Federal Rural de Pernambuco

Reitor: Prof. Valmar Corrêa de Andrade


Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski
Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire
Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos

Produção Gráfica e Editorial


Capa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim, Arlinda Torres e Heitor Barbosa
Revisão Ortográfica: Marcelo Melo
Ilustrações: Allyson Vila Nova, Diego Almeida e Moisés de Souza
Coordenação de Produção: Marizete Silva Santos
Sumário

Conhecendo o Volume 1..................................................................................4

Apresentação....................................................................................................5

Capítulo 1 – Modelo de um Sistema Computacional.....................................7

Capítulo 2 – Conhecendo Melhor as Operações Aritméticas.....................22

Capítulo 3 – Lógica Digital.............................................................................75

Considerações Finais.....................................................................................94

Conheça os Autores.......................................................................................96
Conhecendo o Volume 1

Neste primeiro volume, você irá encontrar os conteúdos referentes ao Módulo 1 da


disciplina Infraestrutura de Hardware. Para facilitar seus estudos, veja os conteúdos
encontrados neste primeiro volume.

Módulo 1 - Introdução aos Sistemas Computacionais

Carga horária: 15 h

Objetivo Principal do Módulo 1:

Apresentar um sistema computacional, separando todos os seus subsistemas


internos que serão estudados nos próximos módulos. Além disso, apresenta
um breve histórico da evolução dos computadores e os conceitos associados à
aritmética computacional e à operação dos circuitos lógicos digitais.

Conteúdo Programático do Módulo 1

» Modelo de um sistema de computação.

» Evolução dos Computadores

» Operações Aritméticas

» Circuitos Lógicos
Apresentação

Caro(a) Cursista,

Estamos, neste momento, iniciando uma viagem para conhecer a Organização


e a Arquitetura interna dos computadores, ou seja, conheceremos os principais
componentes eletrônicos que formam um computador, os circuitos integrados, e como
estes componentes se relacionam entre si. Todos os assuntos abordados neste livro
estarão, de certa forma, relacionados à estrutura e ao funcionamento de computadores,
sobretudo do ponto de vista de Hardware. Por meio desta disciplina, apresentaremos a
natureza e as características dos sistemas de computação modernos.

Nosso estudo será uma tarefa interessante e desafiadora, principalmente porque


contamos hoje não apenas com uma grande variedade de computadores, mas com uma
grande variedade de equipamentos eletrônicos que executam algum tipo de computação.
Essa variedade de produtos difere em custo, tamanho, desempenho e tipo de aplicação
a ser utilizado. Além disso, observamos uma rápida evolução na tecnologia, que se
estende desde circuitos integrados até a combinação desses componentes.

Mesmo diante de uma rápida evolução, certos conceitos aplicam-se a qualquer


projeto de computadores. O objetivo desta disciplina é oferecer uma discussão sobre
esses conceitos, relacionando-os com as questões de projetos modernos.

Bons estudos!

Juliana Regueira Basto Diniz


Abner Correa Barros

Professores Autores
Infraestrutura de Hardware

Capítulo 1

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Funções do Computador

» Componentes do Computador

» Evolução histórica dos Computadores

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Compreender que funções básicas são desempenhadas pelos


computadores;

» Identificar que componentes e subsistemas são necessários na


organização interna dos computadores para que os mesmos
possam desempenhar as suas funções básicas;

» Conhecer a evolução histórica da informática, desde o primeiro


computador eletrônico até as máquinas mais modernas da
atualidade.

6
Infraestrutura de Hardware

Capítulo 1 – Modelo de um
Sistema Computacional

Vamos conversar sobre o assunto?

Estamos, neste momento, iniciando o estudo de uma das áreas


mais importantes da computação, a infraestrutura de hardware. Sem
a evolução do hardware e dos seus componentes eletrônicos, toda a
disseminação da informática, como vemos hoje, não seria possível.
Talvez até este momento você nunca tenha parado para pensar o
quanto somos dependentes desta tecnologia. Você consegue imaginar
a sua vida, nos dias atuais, sem o uso dos computadores? Imagine
como seria este nosso curso sem o uso dos computadores. Seria, no
máximo, um curso por correspondência acompanhado por algum tipo
de programa televisivo, como acontecia com os cursos a distância no
passado, ou seja, não seria possível a sua interação com professores
nem colegas.

Todos somos testemunhas do quão rápido a informática evoluiu


e passou a fazer parte da nossa vida nestes últimos anos. Em
praticamente todos os recursos da vida moderna existe algum sistema
computadorizado. Toda esta evolução, entretanto, não seria possível
sem os avanços formidáveis ocorridos na arquitetura de hardware dos
computadores em geral.

Mas, por falar em evolução das arquiteturas, você sabe o que


vem a ser e como é constituída a arquitetura de hardware de um
computador?

A arquitetura de computadores é a área da ciência que se preocupa


em estudar os atributos dos Sistemas Computacionais que são visíveis
aos profissionais que irão programar estes equipamentos, ou seja, a
estrutura e o comportamento funcional da máquina. Esses atributos,
conforme veremos mais a frente, têm impacto direto sobre a lógica de
construção e execução dos programas.

Em paralelo à arquitetura de computadores, estudaremos também


a organização dos sistemas computacionais. A organização dos
computadores refere-se ao estudo dos aspectos não visíveis ao

7
Infraestrutura de Hardware

programador, ou seja, assuntos referentes à organização dos fluxos


de dados, projeto de controle lógico e a implementação física, que
irão atendem às especificações da arquitetura.

Em termos práticos, são considerados aspectos da arquitetura dos


computadores o conjunto de instruções de uma máquina, o número de
bits do processador, os mecanismos associados aos periféricos e as
técnicas de endereçamento da memória. São aspectos da organização
de computadores os Sinais de controle, a interface computador/
periférico, a tecnologia de memória utilizada, dentre outros.

Figura 1 – Como um computador trabalha?

Em síntese, muitos fabricantes oferecem uma família de modelos de


computadores, todos com a mesma arquitetura, mas com diferenças
na organização, com preços e características de desempenho
distintas. Tomemos como exemplo o Sistema 370 da IBM, uma
arquitetura introduzida em 1970, com grande número de modelos.
Um cliente modesto poderia comprar um modelo inferior e, caso sua
demanda aumentasse, poderia migrar para um modelo superior.
Como todos os computadores desta família adotavam uma mesma
arquitetura de hardware, uma eventual troca de um computador por
um outro maior não o obrigaria a abandonar as aplicações que já
tivessem sido desenvolvidas para o seu primeiro computador. Ao longo
dos anos, a IBM continuou introduzindo modelos novos, mantendo a
mesma arquitetura, preservando assim o investimento em software
dos clientes.

Um outro exemplo, mais próximo da realidade de cada um de


nós, são os nossos computadores pessoais, os famosos PCs. Você

8
Infraestrutura de Hardware

já percebeu que com o passar dos anos foi mantida uma certa
compatibilidade entre as diversas gerações deste tipo de computador?
Esta compatibilidade se deve ao fato de todos adotarem a arquitetura
Intel X86. É por esta razão que mesmo aquele seu programa antigo,
de dez ou quinze anos atrás, ainda poder ser executado sem muitos
transtornos nos computadores atuais. Como você pode perceber,
manter uma mesma arquitetura entre diversas gerações de uma
família de computadores permite manter a compatibilidade de código.

A organização interna de um computador, por outro lado, muda


de uma máquina para outra dentro da mesma família. É ela que em
grande parte define as características de tamanho, desempenho,
robustez e preço dos computadores. Ou seja, enquanto uma
arquitetura pode sobreviver por anos, a organização muda com a
evolução da tecnologia.

1.1 Funções do Computador

Se, por um lado, um computador pode ser considerado um sistema


complexo, com milhões de componentes eletrônicos, por outro lado,
também podemos considerá-lo um sistema hierárquico, constituído
por vários sub-sistemas interrelacionados. Em cada um desses
níveis da hierarquia, devemos considerar a Função e a Estrutura. A
função diz respeito à operação de cada componente como parte da
estrutura. A estrutura refere-se ao modo como os componentes estão
interrelacionados.

Dentre as funções básicas realizadas pelo computador podemos


citar:

► Processamento de dados: Um computador deve ser capaz de


processar dados. Dados estes com uma grande variedade de
tipos e amplos requisitos de processamento.

► Armazenamento de dados: É essencial que um computador


seja capaz de armazenar dados. Esse armazenamento pode
ser temporário ou por períodos longos, para subsequente
recuperação e modificação.

► Movimentação de dados: Um computador deve ser capaz


de transferir dados tanto internamente, quanto com o mundo
externo. Dados podem ser enviados ou recebido de dispositivos
diretamente conectados ao computador. Esse processo é

9
Infraestrutura de Hardware

conhecido como entrada e saída (E/S) e o dispositivo que


esta recebendo ou enviando estes dados é conhecido como
periférico.Quantos periféricos de computador você conhece?
Que tal o disco rígido, o pendrive e o leitor de DVD? Quando
essa transferência se dá entre o computador e um dispositivo
externo, que esteja a uma distância maior, este processo é
conhecido como comunicação de dados.

► Controle: Deve existir um controle das três funções abordadas.


Em última instância, o controle é exercido pelo indivíduo que
fornece instruções ao computador. Num sistema de computação,
uma unidade de controle gerencia os recursos do computador
e rege o desempenho de suas partes funcionais em resposta a
essas instruções.

Dessa forma, o computador pode funcionar como um dispositivo


de transferência de dados de um periférico para outro. Também
pode funcionar como um dispositivo de armazenamento de dados,
sendo os dados transferidos do ambiente externo para a memória
(leitura) e vice-versa (escrita). Podem ainda processar estes dados,
sendo capazes de transferir o resultado deste processamento para o
ambiente externo.

1.2 Componentes do Computador

Agora que você já conhece quais são as principais funções de


um computador, já está apto a compreender quais são os principais
componentes que permitem a viabilização de tais funcionalidades.

São eles:

► Central de Processamento, também conhecido como


processador ou CPU (do inglês Central Processing Unit), tem
a responsabilidade de controlar as operações do computador e
realizar as funções de processamento de dados.

► Subsistema de Memória, compreende todos os meios de


armazenamento para os programas e para os dados dos
programas existentes no computador.

► Subsistema de Entrada e Saída (E/S), tem a função de


transferir dados entre o computador e o ambiente externo.

► Subsistema de Interconexão, composto pelos Mecanismos

10
Infraestrutura de Hardware

que estabelecem a comunicação entre a CPU, memória


principal e dispositivos de E/S.

Tais componentes são observados na Figura 2. Neste livro,


estudaremos cada um dos subsistemas internos ao computador,
iniciando pela parte responsável pelo processamento de dados, ou
seja, a CPU.

Figura 2 – Componentes internos

Central de Processamento - CPU

A CPU pode ser considerado o cérebro do computador, sendo


responsável pela execução de todas as tarefas e pelo processamento
de dados. Todas as operações aritméticas e lógicas existentes em um
programa de computador são executadas por ela. Uma CPU pode
ser composta por um ou vários processadores, os quais podem estar
juntos em um mesmo componente, formando o que ficou conhecido
como processador multi-core, uma expressão inglesa que significa
literalmente multi-núcleo, neste caso cada processador é considerado
um núcleo de processamento, ou separados, cada processador
em um componente distinto. Em ambos os casos dizemos que o
sistema é multiprocessado. Como veremos mais a frente, nos dois
casos o objetivo é aumentar a capacidade de processamento do
computador permitindo que várias operações possam ser executadas
simultaneamente pelos diversos cores da CPU. A Figura 3 a seguir nos
traz uma foto do processador Athlon X2, que possui internamente dois

11
Infraestrutura de Hardware

processadores de 32 bits, sendo portanto da categoria dual-core.

Figura 3 – Processador Athlon X2

Os processadores possuem vários componentes internos,


conforme observado na Figura 4. Podemos subdividir a CPU nos
seguintes componentes internos:

► Unidade de controle: A unidade de Controle, como o próprio


nome sugere, controla cada operação da CPU e, portanto, do
computador. Ela é responsável por decodificar as instruções
presentes no programa em execução emitindo sinais de controle
para as demais partes do computador.

► Unidade lógica e aritmética (ULA): A ULA é responsável


por executar as funções de processamento de dados do
computador, realizando as operações aritméticas e lógicas
presentes no programa.

► Registradores: Os registradores fornecem espaço de


armazenamento interno para a CPU, servindo como uma
memória de acesso ultra-rápido.

► Interconexão da CPU: As interconexões da CPU são os


elementos que possibilitam a comunicação entre a unidade de
controle, a ULA e os registradores.

12
Infraestrutura de Hardware

Figura 4 – Componentes internos a CPU

Agora que você já foi apresentado(a) aos subsistemas do


computador, que tal conhecermos um pouco mais sobre a evolução
dos computadores? Para os computadores chegarem até os dias
atuais em termos de organização e arquitetura de hardware muita coisa
foi modificada. Nesse sentido, na próxima seção, a nossa proposta é
ampliar as discussões sobre a evolução dos computadores. Vamos
lá?

1.3 Evolução dos Computadores

As máquinas, sobretudo os computadores, foram criados para


auxiliar o trabalho humano. Muitas das suas tarefas se baseiam
na construção de algoritmos que visam simular ações do cérebro
humano. Podemos fazer uma rápida comparação para constatar que
os seres humanos são capazes de se adaptar a novas situações e
a aprenderem com os seus erros. Já as máquinas são capazes de
executar tarefas repetidamente, com rapidez, sem sofrer de monotonia
e com perfeição. As máquinas também têm capacidade de armazenar

13
Infraestrutura de Hardware

grandes volumes de dados e informações.

O primeiro computador eletrônico da história surgiu em 1946,


fabricado pela Universidade da Pensilvânia e chamava-se ENIAC
(Eletronic Numeric Integrator and Computer). Ele pesava 50 toneladas,
media 5,50 metros de altura e 25 metros de comprimento. Isso
equivale a ocupar uma área de um ginásio de esportes. A primeira
vez que o ENIAC foi ligado, ele consumiu tanta energia que as luzes
de Filadélfia piscaram. Seu funcionamento se assemelhava a das
calculadoras atuais, sendo operado manualmente, com circuitos
lógicos constituídos por milhares de válvulas. O ENIAC foi criado
para fins militares, na época da Segunda Guerra Mundial e pode ser
observado na Figura 5.

Hiperlink

Caso você deseje


visualizar a
fotografia original
do ENIAC acesse
o site: http://
www.arl.army.
mil/www/default. Figura 5 – Fotografia do ENIAC
cfm?Action
=20&Page307

Após o ENIAC, seguindo a primeira geração dos computadores,


surgiu o UNIVAC I. Esse computador teve 15 unidades vendidas e
um tamanho aproximado de 20m2. Seus circuitos eletrônicos também
eram baseados em válvulas e o seu armazenamento de dados era
realizado através de papel perfurado. Em geral, os computadores da
primeira geração esquentavam muito e ocupavam grandes espaços
físicos. Também apresentavam grande consumo de energia e
quebravam com muita frequência.

A partir de 1958, surgiu a segunda geração de computadores.


Sua principal inovação em relação aos computadores da primeira
geração foi a utilização de transistores em substituição às válvulas.
Um transistor é um dispositivo que controla a passagem da corrente
elétrica através de materiais semicondutores inteiramente sólidos.

14
Infraestrutura de Hardware

Os transistores são aproximadamente 100 vezes menores que as


válvulas, o que tem como consequência direta, a redução do tamanho
dos computadores. Os computadores da segunda geração, além
de menores também eram mais rápidos que a geração anterior e
possuíam capacidade para executar milhares de operações por
segundo, consumindo menos energia que a geração anterior.

A terceira geração dos computadores data de 1958 e teve como


principal inovação a utilização de circuitos integrados. Os transistores
e demais componentes eletrônicos foram miniaturizados, reduzindo
bastante o consumo de energia. Com o passar dos anos, a escala
de integração foi aumentando e cada vez mais tornava-se possível a
utilização de mais componentes em um mesmo chip ou pastilha. Os
mainframes foram os principais computadores desta geração. Como
exemplo, podemos citar a família de produtos IBM 360, conforme
apresentado na Figura 6.

Figura 6

A partir de 1975, iniciou a quarta geração de computadores, sendo


marcada pelo surgimento do microprocessador. O microprocessador
foi o principal marco desta geração e o ponto chave na larga
proliferação da informática. Ele ocasionou uma baixa espetacular
nos preços e uma escala de integração ainda mais acentuada, onde
milhões de circuitos integrados puderam ser colocados em um único
chip. A Figura 7 apresenta um computador desta geração.

Figura 7

15
Infraestrutura de Hardware

Alguns autores consideram o surgimento da quinta geração


de computadores, iniciando a partir de 1981 com o advento dos
microcomputadores. A partir desta geração, os computadores
puderam ser utilizados por usuários comuns, não se limitando ao uso
corporativo. A Figura 8 apresenta uma imagem de um PC IBM, muito
utilizado na década de 80.

Figura 8 – IBM PC

Seguindo a evolução na quinta geração, surgiram as máquinas com


processamento paralelo e a arquitetura RISC (Reduced Instruction
Set Architecture). Mas o que significa processamento paralelo?
Para compreender esse conceito, deveremos introduzir dois outros:
multiprogramação e multiprocessamento.

Multiprogramação é uma tentativa de manter o processador


sempre ocupado com a execução de um ou mais programas por
vez. Com a multiprogramação, diversos programas são carregados
para a memória e o processador comuta rapidamente de um para
o outro. Essa técnica permite que o processador não passe por
períodos de ociosidade, à espera de resposta oriunda de programas
em execução, permitindo otimizações e melhorias de desempenho de
processamento. O multiprocessamento, por sua vez, caracteriza-se
pelo uso de vários processadores que atuam em paralelo, cada um
executando as suas tarefas

Para garantir melhor desempenho, ainda é possível que


os processadores atuais utilizem multiprocessamento com
multiprogramação, que é a junção dos conceitos, onde mais
de um processador é utilizado e cada um deles implementa a
multiprogramação, permitindo efetivamente que programas sejam
executados paralelamente. Os computadores pessoais evoluíram com
processadores que implementam a multiprogramação e comportam o
multiprocessamento.

16
Infraestrutura de Hardware

Seguindo a evolução na quinta geração, surgiram as máquinas com


processamento paralelo, as máquinas de arquitetura RISC (Reduced
Atenção
Instruction Set Architecture), superescalares e superpipelines.

A quinta geração também é marcada pela miniaturização dos Os detalhes de


tais arquiteturas
computadores e pela computação ubíqua, ou seja, computação a serão
apresentados no
toda hora e em todo o lugar, utilizando uma grande diversidade de segundo volume
dispositivos. A disseminação da computação ubíqua foi impulsionada deste material
didático.
pela evolução das redes de comunicação, permitindo larguras
de banda superiores, comunicação sem fio e acesso através de
dispositivos de menores dimensões, como celulares, tablet PC
e Personal Digital Assistant (PDA). O conceito de Computação
Ubíqua foi introduzido por Mark Weiser e colegas (Weiser M.; Gold
e Brown, 1999) que afirmavam que o usuário poderia ter acesso ao
seu ambiente computacional a partir de qualquer lugar, em qualquer
momento, de várias formas, através de diferentes dispositivos e Saiba Mais
tecnologias de comunicação. Com a computação ubíqua, a relação
entre usuários e dispositivos computacionais muda em relação aos Mark D. Weiser
nasceu em 1952
computadores pessoais, o que era de um para um, passa a ser de um em Chicago.
Estudou Ciência
para muitos (um usuário para vários dispositivos). da Computação e
Comunicação na
Weiser e colegas (Weiser M.; Gold e Brown, 1999) argumentam Universidade de
Michigan, tendo
que computadores de pequenas dimensões estarão embutidos em recebido seu
objetos do cotidiano do usuário, tais como livros, roupas e objetos Ph.D. em 1979.
Weiser foi
pessoais em geral. A figura 9 apresenta uma série de dispositivos cientista chefe da
Xerox PARC e é
computacionais que estão presentes na quinta geração. considerado o pai
da computação
ubíqua. Para
saber mais sobre
a sua trajetória
de vida consulte
http://www-sul.
stanford.edu/
weiser/

Figura 9 – Dispositivos Computacionais

Existem diversas aplicações atualmente que compõem o universo


da computação ubíqua. Desde soluções para o cenário residencial,
comercial, hospitalar, dente outros. Um exemplo interessante de
uma solução proposta para computação ubíqua dentro do cenário
hospitalar é o Ubiquitous Health Service (UHS), que é representado
na Figura 10. O UHS constitui uma rede de serviços de saúde, da qual
fazem parte um conjunto de hospitais geograficamente distribuídos e
médicos associados que podem ter acesso aos serviços desta rede

17
Infraestrutura de Hardware

de qualquer lugar, usando um conjunto de diferentes dispositivos


e redes de acesso. Esta rede favorece o relacionamento entre os
médicos associados, sendo, portanto, o médico o usuário alvo do
cenário. Os médicos, por sua vez, são colaboradores de alguns dos
hospitais credenciados e podem acessar os serviços disponibilizados
pelos hospitais, podendo fazê-lo também de sua residência, local de
lazer, em trânsito ou do seu consultório.

Além de serviços específicos de cada hospital credenciado,


também é possível ao médico realizar acesso ao Prontuário Eletrônico
de Pacientes, a qualquer hora e de qualquer lugar, usando algum
dispositivo disponível. Os hospitais, por sua vez, podem oferecer
serviços específicos, como por exemplo, serviço de reserva de salas,
marcação de consultas no ambulatório, localização de médicos,
etc. Para estes serviços serão necessárias algumas validações de
segurança e algoritmos de autenticação que são gerenciados pelo
próprio hospital que disponibiliza os serviços. O cenário possibilita
ao médico iniciar uma sessão de acesso ao Prontuário Eletrônico de
Pacientes usando um dispositivo e transferi-la para outro dispositivo
durante a sua execução.

Figura 10 – Ambiente UHS

18
Infraestrutura de Hardware

O cenário UHS é apenas um exemplo de como a computação


ubíqua pode ser inserida nas nossas atividades rotineiras. Hoje somos
completamente dependentes de computadores, internet, telefones
celulares. A tendência é que esses dispositivos tenham cada vez mais
recursos de processamento e que possam estar presentes em nossas
atividades do dia a dia.

Conheça Mais

Você poderá pesquisar mais sobre arquitetura e organização de


computadores em alguns websites. Seguem alguns sites para você
explorar essa temática:

Computer Architecture Page: http://www.cs.wisc.edu/arch/www/

MIT Computer Architecture Group: http://groups.csail.mit.edu/cag/

Clube do Hardware: http://www.clubedohardware.com.br/

CPU Info Center: http://bwrc.eecs.berkeley.edu/CIC/

Se possível, leia também:

“Arquitetura e Organização de Computadores“ do


autor William Stallings e “Organização Estruturada de
Computadores“ do autor Andrew S. Tanenbaum.

Atividades e Orientações de Estudo

Dedique, pelo menos, 2 horas de estudo para o Capítulo 1. Você


deve organizar uma metodologia de estudo que envolva a leitura dos
conceitos que serão apresentados neste volume e pesquisas sobre o
tema, usando a Internet e livros de referência.

Os fóruns temáticos desta disciplina podem ser utilizados para


troca de informações sobre o conteúdo no ambiente virtual, pois a
interação com colegas, tutores e o professor da disciplina irá ajudá-lo
a refletir sobre aspectos fundamentais tratados aqui. Os chats também
serão muito importantes para a interação em tempo real com o seu
tutor virtual, seu professor e seus colegas.

19
Infraestrutura de Hardware

Também é importante que você leia atentamente o guia de estudo


da disciplina, pois nele você encontrará a divisão de conteúdo
semanal, ajudando-o a dividir e administrar o seu tempo de estudo
semanal. Procure responder as atividades propostas como atividades
somativas para este capítulo, dentro dos prazos estabelecidos pelo
seu professor, pois você não será avaliado apenas pelas atividades
presenciais, mas também pelas virtuais. Muitos alunos não acessam
o ambiente e isso poderá comprometer a nota final. Não deixe que
isso aconteça com você!

Vamos Revisar?

Neste capítulo, você estudou as funções do computador e os


seus componentes principais. Foram apresentados os subsistemas
internos ao computador: Central de Processamento ou subsistema de
processamento, Subsistema de Memória, Subsistema de Entrada e
Saída (E/S) e Subsistema de Interconexão.

Aprendemos que a CPU possui o papel de controlar as


operações do computador e processar dados. O Subsistema de
Memória armazena dados e o Subsistema de Entrada e Saída (E/S)
transfere dados entre o computador e o ambiente externo. Por fim,
o Subsistema de Interconexão, responsabiliza-se pela comunicação
entre a CPU, memória principal e dispositivos de E/S. Nos demais
volumes deste material didático estudaremos com detalhes cada um
desses subsistemas.

Em seguida, você pôde observar a evolução histórica dos


computadores, partindo do primeiro computador eletrônico até
a miniaturização dos computadores e da computação ubíqua.
Aprendemos que esse conceito baseia-se na computação a toda hora
e em todo o lugar, utilizando uma grande diversidade de dispositivos.

Nos próximos capítulos desse volume iremos aprender um pouco


mais sobre a CPU ou subsistema de processamento iniciando com
um estudo sobre operações aritméticas e lógicas.

20
Infraestrutura de Hardware

Capítulo 2

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Sistemas de numeração

» Bases numéricas e conversões entre bases

» Operações aritméticas em diferentes sistemas de numeração

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Conhecer os principais sistemas de numeração;

» Realizar operações de conversões entre bases distintas;

» Aprender as operações aritméticas básicas em sistemas de


numeração binário, octal e hexadecimal.

21
Infraestrutura de Hardware

Capítulo 2 – Conhecendo Melhor


as Operações Aritméticas

Vamos conversar sobre o assunto?

2.1 Sistemas de Numeração

Desde muito cedo em sua história, a humanidade se deparou


com a necessidade de contar, enumerar e ordenar as coisas, os
animais e até mesmo os outros seres humanos que o cercavam. E
não apenas contar, enumerar e ordenar, mas também registrar estas
informações de forma clara e precisa. O sucesso tanto no comércio
quanto nas atividades produtivas exigia que se pudesse tomar nota
das quantidades e valores envolvidos em suas transações.

No início, enquanto os volumes eram pequenos, podia-se adotar um


registro simples e direto destas informações, normalmente utilizando
coisas do cotidiano para representar as quantidades envolvidas. Veja
alguns exemplos destes registros na Figura 1 a seguir.

Naquela época, era comum ver pastores de ovelhas carregando


consigo uma pequena bolsa de couro com tantas pedrinhas quantas
fossem as ovelhas aos seus cuidados. Não existia ainda a associação
de um símbolo fonético ou gráfico para as quantidades representadas,
mas apenas uma associação de um para um entre as ovelhas e as
pedras.

Figura 1 – Exemplos de registros de contagens feitos pelas antigas civilizações

22
Infraestrutura de Hardware

Este recurso, por mais simples que possa parecer, permitia a estes
homens controlar seus rebanhos, descobrindo, ao fim de um dia, se
alguma ovelha havia se desgarrado, ou ainda se uma operação de
troca de ovelhas por outras mercadorias seria ou não vantajosa para
ele.

Com o passar do tempo, entretanto, o avanço natural nos volumes


dos negócios e, por conseguinte das quantidades de animais e objetos
envolvidos, obrigou que se elaborasse um sistema mais eficiente para
registrar e contabilizar estas transações. Já não era mais possível
associar convenientemente uma pedra em uma sacola ou um nó em
uma corda para cada um dos elementos envolvidos nas transações. Saiba Mais

Os egípcios foram os primeiros que se tem notícia a adotar um Conheça um


pouco mais
sistema gráfico estruturado de tal forma a permitir o registro simples e sobre a história
claro de grandes quantidades de elementos através de um pequeno dos números
visitando estes
número de símbolos. sites:

http://br.geocities.
com/superbetorpf/
evolnum.htm

http://pessoal.
sercomtel.com.
br/matematica/
fundam/numeros/
numeros.htm

Figura 2- Símbolos adotados no sistema de numeração egípcio

Em sua representação, conforme podemos ver na Figura 2, os


egípcios utilizavam dez símbolos distinto para representar valores
entre 1 e 9 e, a partir daí, mais seis símbolos para representar valores
da forma 10n, com n≥1.

No sistema egípcio, de igual modo ao que fazemos hoje em dia, o


valor total representado era calculado a partir do somatório dos valores
atribuídos aos símbolos utilizados. E isto, por si só já simplificava
em muito a forma de registrar e manipular com as informações
numéricas.

23
Infraestrutura de Hardware

Foi no norte da Índia, por volta do século V da era cristã, que


provavelmente surgiu o sistema de representação que utilizamos
atualmente.

Por ter sido largamente empregado pelos árabes, os quais o


introduziram na Europa, este ficou conhecido como sistema de
numeração Hindo-Arábico. A Figura 3 a seguir nos traz um exemplo
dos símbolos gráficos utilizados no sistema Hindo-Arábico e a sua
evolução até os nossos dias.

Figura 3 – Evolução da grafia dos símbolos do sistema Hindo-Arábico até os nossos dias

Diferente dos demais sistemas numéricos existentes à época, o


sistema Hindo-Arábico já lançava mão de um recurso matemático
conhecido hoje como base numérica, exatamente nos mesmos
moldes que adotamos hoje em dia.

No sistema Hindo-Arábico, todo e qualquer valor numérico


podia ser representado utilizando apenas 10 símbolos elementares,
utilizando um outro recurso matemático que depois ficou conhecido
como notação posicional.

Você sabe o que é uma base numérica? E a notação posicional,


você sabe já ouviu falar dela? Sabe como ela funciona? Pois bem, é
isto o que vamos descobrir na continuação deste capítulo.

2.2 Base Numérica

Denominamos como base numérica ao conjunto de símbolos


utilizados para representar valores numéricos.

24
Infraestrutura de Hardware

De um modo geral podemos dizer que as bases numéricas mais


importantes são:

► Base decimal, com dez símbolos {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},

► Base binária, com dois símbolos {0, 1},

► Base octal, com oito símbolos {0, 1, 2, 3, 4, 5, 6, 7},

► Base hexadecimal, com dezesseis símbolos {0, 1, 2, 3, 4, 5, 6,


7, 8, 9, A, B, C, D, E, F}.

Destas, a mais importante, sem dúvida nenhuma, é a base decimal.


Sua importância é tamanha que desde pequenos aprendemos a
associar os seus elementos com os dedos de nossas próprias mãos.
Experimente perguntar a uma criança na pré escola qual a sua idade,
e de pronto ela lhe estenderá as mãozinhas mostrando nos dedos
quantos aninhos já tem.

Figura 4 – Associação dos números com os dedos da mão

Mas, o que define uma base numérica? Será que nós mesmos
podemos definir a nossa própria base numérica? Que regras devemos
seguir para definir uma base numérica?

Para que um conjunto de símbolos possa ser considerado uma


base numérica, ele deve ser formado de modo a atender algumas
regras básicas de construção:

» Cada elemento do conjunto deve estar associado a um valor


numérico, numa relação de um para um. Ou seja, cada símbolo
deve estar associado a um único valor numérico e vice-versa.

» O conjunto deve possuir no mínimo dois símbolos, um para


representar o zero e outro para representar o um.

» Não devem existir lacunas na representação, ou seja, se um


conjunto possuir representações para os valores n e n+2, então
este mesmo conjunto também deve possuir uma representação
para o valor n+1.

25
Infraestrutura de Hardware

Respeitadas estas regras, podem-se construir bases numéricas


com tantos símbolos quantos se façam necessárias. Mas, pensemos
Atenção um pouco, “porque se dar ao trabalho de definir outras bases
numéricas se a base decimal, aparentemente, já resolve todos os
Você pode estar
se perguntando nossos problemas?”
por que nos
referimos A verdade é que as bases numéricas são definidas para simplificar
aos números
presentes o dia a dia de quem às utiliza. Mesmo sem perceber, constantemente
nas bases estamos lançando mão de outras bases numéricas. Por exemplo,
numéricas como
símbolos e não imagine as horas do dia, você já percebeu que normalmente nós
como números
simplesmente. contamos as horas utilizando uma base com apenas 12 elementos?
Como você deve Pois é, mesmo sabendo que o dia tem 24 horas, parece-nos bem
ter percebido,
a base hexa melhor pensar em termos de duas séries de 12 horas, uma começando
decimal utiliza
tanto números a meia noite e indo até o meio dia, e outra começando ao meio dia e
como letras indo até a meia noite.
para representar
os valores
numéricos, Como você irá perceber um pouco mais à frente, foi o
desta forma,
para não causar
desenvolvimento do estudo das bases numéricas que permitiu o
confusão aos desenvolvimento dos computadores digitais como nós os conhecemos
nos referirmos às
letras A,B,C,D,E hoje em dia.
e F como sendo
números, nos Agora, pense um pouco, que outras bases numéricas você pode
referiremos
aos números e identificar em suas atividades cotidianas? Que tal uma base com 60
letras utilizados,
indistintamente,
elementos, só para começar?
como sendo
apenas símbolos. Mas, como será que funciona uma base numérica? Será que
existe alguma relação entre as diversas bases numéricas existentes?
Isto e muito mais é o que vamos descobrir a partir de agora com a
continuação do nosso estudo.

2.3 Bases Numéricas e a Notação Posicional

Para entender como funciona uma base numérica e a notação


posicional, vamos tomar como exemplo a base decimal. Uma vez que
temos dez símbolos nesta base, podemos facilmente utilizá-los para
representar conjuntos com até nove elementos. Observe a Figura 5 a
seguir.

26
Infraestrutura de Hardware

Figura 5 – Associação entre os elementos da base decimal e valores de contagem

Observe, entretanto, que um problema surge quando precisamos


registrar valores para os quais não temos um símbolo associado na
base, como, por exemplo, o que vemos na Figura 6 a seguir.

Figura 6 – Como registraremos esta quantia com a base decimal?

Como faremos para registrar os doze elementos desta figura


utilizando estritamente os símbolos contidos na base decimal?

Ah, você pode estar pensando - Esta é fácil, basta utilizar os


símbolos 1 e 2, exatamente nesta sequência e pronto, teremos a
representação da quantidade de elementos constante nesta figura.

27
Infraestrutura de Hardware

Se você pensou assim, é claro que a sua resposta está correta.

Entretanto, pense um pouco mais.

Se olharmos para a base decimal, veremos que os símbolos que


estamos utilizando representam literalmente uma unidade seguido
de duas unidades. Isto em nada se parece com as doze unidades
que estamos querendo representar. De onde então tiramos a idéia
que se utilizarmos estes dois símbolos em conjunto, exatamente da
forma como fizemos, estaremos criando uma representação para a
quantidade de elementos constantes naquela figura?

A resposta é ao mesmo tempo simples e complexa. Mesmo sem


Atenção perceber, para expressar valores que não se encontram representados
diretamente na base, lançamos mão de um recurso matemático
Notação inventado pelos indianos denominado Notação Posicional.
Posicional nada
mais é que
um recurso de É o uso da notação posicional que nos permite dizer que o 1 do
representação número 12 vale uma dezena e não uma unidade, o qual somado às
que nos permite
alterar o valor duas unidades representadas pelo 2 nos dá como resultado os doze
atribuído aos
símbolos de uma elementos que estávamos querendo representar.
determinada
base numérica, A ideia por trás da notação posicional é extremamente simples e
de forma a poder
utilizá-los para pode ser facilmente ilustrada pela observação do que ocorre quando
representar
valores que
contamos as horas em um relógio com ponteiros.
não existam na
referida base. Observe que um dia tem vinte e quatro horas e um relógio com
ponteiros possui apenas doze marcações, indo do 1 ao 12. Desta
forma, após contarmos as 12 primeiras horas do dia, acabamos
retornando ao nosso ponto de partida, em um processo conhecido
como estouro da base. Nesta situação, se continuarmos contando,
simplesmente perderemos a referência de que horas realmente
Saiba Mais
estamos registrando.
A expressão
Estouro da
Base indica que
estamos tentado
representar um Curiosidade...
valor maior que
o maior valor
representável Você conhece algum relógio com ponteiros com alguma
diretamente pela indicação para 13 horas?
base numérica
adotada.
No caso do relógio, isto se resolve associando à informação
indicada nos ponteiros com uma informação adicional que indica
se esta é a primeira ou a segunda volta que este executa no dia.
Normalmente, quando os ponteiros retornam ao ponto de partida nós,

28
Infraestrutura de Hardware

ou adicionamos 12 ao valor indicado, como podemos ver na Figura 7


a seguir, ou simplesmente adicionamos uma informação de que são
tantas horas da manhã, da tarde ou da noite.

Figura 7 – Que horas são neste relógio? 10 horas e dez minutos ou 22 horas e 10 minutos?

Ainda que extremamente simples, esta observação adicional


indicando quantas voltas o ponteiro do relógio já efetuou é o elemento
chave para a compreensão do como funciona uma base numérica e o
mecanismo da notação posicional.

Vamos agora tentar estender esta ideia para a base decimal.

2.4 Base Decimal

Considere a Figura 8 a seguir.

Nela temos uma representação da base decimal imitando as horas


de um relógio.

Figura 8 – Representação esquemática da base decimal

Tentemos agora utilizar este nosso disco para contar de zero até
cem.

Comecemos no zero e, a cada número que contarmos avancemos


o nosso ponteiro de uma posição. Perceba que podemos contar de
zero a nove sem problemas, mas ao chegarmos ao dez, à semelhança
do que ocorre com os ponteiros de um relógio ao indicar o meio dia

29
Infraestrutura de Hardware

ou a meia noite, ocorre um estouro da base, e retornamos ao nosso


ponto inicial, perdendo assim a nossa referência de contagem. Se
continuarmos contando, não haverá nenhuma forma de indicarmos
claramente a que número estamos nos referindo simplesmente pelo
que estamos apontando em nosso disco.

Desta forma, a fim de evitar esta confusão, incluiremos um segundo


disco numerado, semelhante ao primeiro, no qual contaremos quantas
voltas o primeiro disco já efetuou.

Uma vez que este disco adicional contará quantas vezes o primeiro
disco contou até dez, chamar-lhe-emos de disco das dezenas. Ao
primeiro disco chamaremos de disco das unidades. Por convenção, o
disco das unidades ficará a direita do disco das dezenas.

O nosso novo esquema ficará conforme indicado na Figura 9 a


seguir.

Figura 9 – Novo esquema de representação para contagem de dezenas e unidades,


indicando a contagem de dez elementos

Podemos assim continuar nossa contagem, de tal forma que a


Fique cada volta completa do disco das unidades, avançaremos o disco das
por Dentro
dezenas de uma posição. Ou seja, sempre que ocorre um estouro da
O termo “vai base no disco das unidades, dizemos que ocorre um “vai um” para o
um” indica que disco das dezenas.
precisamos somar
um na contagem
do segundo disco. Este esquema funciona muito bem até chegarmos à contagem
noventa e nove. Neste ponto percebemos que o disco de dezenas
também está preste a completar uma volta completa, de tal forma que
corremos o risco novamente de perder nossa referência.

Por sorte, podemos adotar o mesmo artifício já utilizado


anteriormente com o disco das unidades, e incluir um novo disco para
contar quantas voltas o disco das dezenas completou. A este novo
disco chamaremos de disco das centenas. Nosso esquema ficará

30
Infraestrutura de Hardware

como representado na Figura 10 a seguir.

Figura 10 – Esquema com discos para as centenas, dezenas e unidades, indicando a


contagem de cem elementos

Perceba que este artifício de incluir um novo disco para


contar quantas voltas o disco anterior completou pode continuar
indefinidamente, de forma que podemos incluir tantos discos quantos
sejam necessários, à medida que formos precisando.

A contagem total representado pelos nossos discos poderá ser


facilmente verificada somando as indicações de cada um dos ponteiros
multiplicadas pelos números de voltas que cada disco representa.

Uma vez compreendida esta estratégia, podemos deixar de lado o


esquema com discos, substituindo cada um destes diretamente pelo
seu valor, conforme estamos acostumados a fazer, com um algarismo
para as unidades, um para as dezenas, um para as centenas e assim
por diante. A Figura 11 a seguir nos dá um exemplo do que estamos
dizendo.

Este processo todo que acabamos de descrever é a base da


notação posicional. Ou seja, é ele que nos permite utilizar uma
base numérica para representar todo e qualquer número inteiro que
possamos imaginar.

Como pudemos ver, com exceção do primeiro dígito, o que conta


as unidades, todos os demais contam quantas vezes o seu antecessor
já contou até o limite da base adotada, ou seja, quantas vezes ocorreu
um estouro da base no dígito que o antecede. No caso específico da
base decimal, isto indica quantas vezes o dígito a sua direita contou
até dez.

Desta forma, como podemos ver pela Figura 11, o valor total da
contagem é obtido somando-se o valor registrado em cada um dos
dígitos, multiplicado pela contagem que a sua posição representa.
Muito fácil não é mesmo?

31
Infraestrutura de Hardware

Figura 11 – Exemplo de relação entre os valores indicados nos disco e o valor que
representam

Nos livros em geral, você encontrará este procedimento


normalmente expresso na forma de um somatório ponderado de
termos, no caso, dos dígitos utilizados, a semelhança do que vemos
na Figura 12 a seguir.

Figura 12 – Expressão matemática equivalente à notação posicional

Esta expressão indica que o valor representado por uma sequência


numérica é dado pelo somatório dos símbolos que a compõem, aqui
indicados por di, ponderados pela posição que ocupam na sequência
dada, aqui indicado pelo índice i à direita do d. Em resumo, nesta
expressão, β é a base numérica adotada, d é o valor atribuído ao
símbolo e i é a posição que o símbolo ocupa na sequência.

Um detalhe importante a ser observado, e que pode não ficar claro


pela expressão, é que os símbolos devem sempre ser ponderados
da direita para a esquerda. Ou seja, o primeiro dígito, ou o dígito
mais a esquerda, será ponderado pela base elevada a zero, o que
significa que o seu valor será multiplicado por 1. O segundo dígito
será ponderado pela base elevada a um, o que significa para a base
decimal que este será multiplicado por dez, e assim por diante.

32
Infraestrutura de Hardware

Curiosidade...

Você sabia que no inicio da sua utilização os números em notação


posicional eram escritos da esquerda para a direita, ao contrário do
que escrevemos hoje? Os Hindus, inventores da notação posicional,
escreviam os números da mesma forma como nós escrevemos as
letras em um texto, da esquerda para a direita. Por que será que
hoje nós escrevemos os números ao contrário? Descubra mais
nestes links:

http://pessoal.sercomtel.com.br/matematica/fundam/numeros/numeros.htm
http://professorjairojr.blogspot.com/

Para fixar o que aprendemos, tentemos analisar como a notação


posicional foi utilizada na formação dos números a seguir:

a)

b)

c)

d)

Você consegue perceber que o que temos aqui nada mais é que a
aplicação direta da expressão matemática apresentada na Figura 12?
É muito importante que isto fique bem claro para você. Caso esteja
sentindo alguma dificuldade, pesa ajuda ao seu monitor.

Esta análise, por simples que pareça, é essencial para que


compreendamos o funcionamento da notação posicional e será de
suma importância para entendermos também como funcionam as
outras bases numéricas.

Agora que já sabemos como expressar os números inteiros


utilizando a notação posicional, podemos buscar entender como
podemos utilizar esta mesma notação posicional para representar
também os números fracionários.

2.5 Números Fracionários

Observe os exemplos a seguir:

a)

33
Infraestrutura de Hardware

b)

c)

d)

e)

Você conseguiu notar algo de familiar com o que acabamos de


estudar?

Ao analisarmos estes exemplos, a primeira coisa que percebemos


é a inclusão da vírgula como elemento separador entre a parte inteira
e a parte fracionária dos números.

Outro ponto muito importante é que os dígitos colocados à direita


Atenção da virgula, que representam a parte fracionária do número, são
ponderados pela base com o expoente negativo, o que significa
Um número
elevado a que em vez se estarem sendo multiplicados estão sendo divididos por
um expoente
negativo é igual
ela.
ao inverso do
próprio número Observe novamente os exemplos d e e. Veja que da mesma
elevado ao
expoente positivo. forma como ocorre com os números inteiros, o valor expresso por um
número fracionário na notação posicional também é obtido como o
somatório de todos os termos que o compõem.

Em resumo, para representar um número fracionário na notação


posicional, basta incluir a vírgula para separar a parte inteira da parte
fracionária, ponderando os dígitos que ficam à esquerda desta pela
base elevada a um expoente positivo e os que ficam à direita com a
base elevada ao expoente negativo.

Para finalizar, podemos agora reescrever a expressão apresentada


na Figura 12, de forma que esta contemple também os números
fracionários. A Figura 13 a seguir mostra como ficará nossa nova
expressão.

Figura 13 – Expressão Matemática para a Notação Posicional incluindo os números


fracionários

Esta nova expressão difere da anterior pela inclusão do k o qual


indica quantos dígitos existem à direita da vírgula, ou seja, quantos

34
Infraestrutura de Hardware

dígitos foram reservados para a representação da parte fracionária do


número.

Que tal agora exercitarmos um pouco tudo o que aprendemos


fazendo uma analise aprofundada dos números a seguir. Utilize a
expressão apresentada na Figura 13. Repita o que foi feito nos três
exercícios seguintes.

a) 12,41

n = 4 (Quantidade de dígitos do número)

k = 2 (Quantidade de dígitos da parte decimal do número)

Valor Representado =

b) 73,5309

n=6

k=4

Valor Representado =

c) 1025

n=4

k=0

Valor Representado =

d) 832,0

n=

k=

Valor Representado =

e) 0,322

n=

k=

Valor Representado =

f) 10,005

n=

k=

35
Infraestrutura de Hardware

Agora que já sabemos tudo o que precisamos sobre o que é uma


base numérica e como funciona a notação posicional, podemos nos
aventurar a trabalhar com as outras bases numéricas anteriormente
citadas.

A primeira base que estudaremos será a base binária.

2.6 Base Binária

Como vimos no início deste capítulo, a base binária é formada por


Atenção um conjunto com apenas dois símbolos: o zero e o um, {0, 1}. Mesmo
assim, acredite, lançando mão da notação posicional podemos
Como veremos
mais a frente,
representar com a base binária praticamente todos os números que
nem todos você possa imaginar.
os números
fracionários
podem ser
Por ser a base numérica adotada nas Unidades Lógicas e
representados na Aritméticas (ULA) de todos os processadores, esta base numérica é
base binária.
extremamente importante.

Compreender como representar e operar com números na base


binária é essencial a compreensão de como um computador funciona.
Por isto, vamos tentar ser bem minuciosos em nosso estudo.

Devido a sua importância, alguns termos foram definidos para


melhor retratar alguns elementos presentes nos números expressos
na base binária, são eles:

► Bit – Nome dado aos dígitos de um número expresso na base


binária. Desta forma, é comum utilizar-se expressões como 8
bits, 16 bits e 32 bits para se referir a quantidade de dígitos de
um número expresso na base binária.

► MSB – Sigla inglesa derivada da expressão Most Significant Bit


que significa literalmente Bit Mais Significativo. Este é o nome
dado ao bit com maior peso associado, ou seja, ao bit localizado
mais a esquerda do número.

► LSB – Sigla inglesa derivada da expressão Least Significant


Bit que significa literalmente Bit Menos Significativo. Este é o
nome dado ao bit com menor peso associado, ou seja, ao bit
localizado mais a direita do número.

► Palavra – Nome dado ao conjunto de bits utilizados para


representar um número. Esta expressão é normalmente
utilizada para indicar a quantidade de bits que um processador

36
Infraestrutura de Hardware

utiliza internamente para representar suas informações, em


expressões do tipo: Os processadores Core Duo utilizam
palavras de 32 bits. Atenção

A Figura 14 a seguir demonstra como estes elementos estão A Unidade Lógica


e aritmética é
presentes na representação dos números representados na base uma das partes
binária. mais importantes
da Unidade
Central de
Processamento
dos
computadores.
Ela é responsável
por todas as
operações lógicas
e aritméticas dos
Figura 14 – Elementos presentes nos números expressos na base binária programas que
são executados.

Agora que já conhecemos alguns detalhes dos números expressos


na base binária, podemos começar o nosso estudo de como esta
base realmente funciona. Para começar, vamos fazer uma análise
semelhante a que fizemos com a base decimal.

Primeiramente, tomemos um disco com a representação da base


binária.

Figura 15 – Disco com a representação da base binária

Agora, utilizando este nosso disco binário, vamos tentar contar até
dez.

Acompanhe a contagem na Figura 16 a seguir.

Começamos contando: zero, um, mas quando vamos tentar contar


o dois percebemos que já estamos chegando ao zero novamente, ou
seja, se continuarmos contando estouraremos a base e perderemos a
nossa referência.

Figura 16 – Configuração do disco binário ao contarmos do zero ao dois

37
Infraestrutura de Hardware

O que fazer então? Vamos adotar a mesma estratégia que já


utilizamos na base decimal. Vamos incluir um segundo disco para
contar quantas voltas o primeiro disco já deu. Veja como ficará nossa
configuração na Figura 17 a seguir.

Figura 17 – Posição dos discos binários indicando que já contamos até dois

Como não temos um nome especial para dar aos discos, como
tínhamos na base decimal, vamos apenas identificá-los pelo valor
que cada um representa. Como o segundo disco conta quantas vezes
o primeiro disco deu uma volta completa, o que ocorre a cada duas
contagens, vamos identificá-lo pelo 21.

Podemos, então, continuar a nossa contagem do ponto aonde


paramos: Dois, três, mas quando chegamos ao quatro, vemos que o
primeiro disco completa mais uma volta, o que força o segundo disco
a avançar mais um passo, levando-o a completar uma volta também,
voltando ao zero novamente, como podemos ver pela Figura 18 a
seguir.

Figura 18 – Configuração dos discos binários ao contarmos dois, tres e quatro

Como sabemos, podemos simplesmente incluir mais um disco


e continuar nossa contagem, conforme fizemos a pouco quando
chegamos à contagem do dois. Nossa nova configuração ficará

38
Infraestrutura de Hardware

conforme podemos ver na Figura 19 a seguir.

Figura 19 – Posição dos discos binários indicando que já contamos até quatro

Com mais um disco binário, podemos continuar contando.


Acompanhe a nossa contagem na Figura 20 a seguir.

Devemos lembrar que sempre que o primeiro disco completa uma


volta o ponteiro do segundo disco avança uma posição. E sempre
que o segundo disco completa uma volta, o ponteiro do terceiro disco
também avança uma posição.

Continuando a nossa contagem de onde paramos, temos: quatro,


cinco, seis, sete, e quando chegamos a oito o ponteiro do terceiro
disco, o que registra 22, avança uma posição e também completa uma
volta, retornando ao zero.

39
Infraestrutura de Hardware

Figura 20 – Configurações dos discos binários aos contarmos de cinco até oito

Como nosso objetivo é contar até dez, vamos incluir mais um disco
e continuar a nossa contagem.

Figura 21 – Configuração dos discos binários ao contarmos oito

Agora sim, com quatro discos binários podemos concluir nossa


contagem indo do oito até o dez, conforme podemos ver na Figura 22
a seguir.

40
Infraestrutura de Hardware

Figura 22 – Configuração dos discos binários na contagem de oito a dez

Da mesma forma que fizemos com a base decimal, uma vez que já
entendemos como funciona a base binária, podemos agora deixar de
lado os discos binários e passar a trabalhar diretamente com símbolos
apontados em cada um dos discos. Desta forma, a nossa contagem
de zero a dez em binário ficará da seguinte forma:

0 = 00002 4 = 01002 8 = 10002

1 = 00012 5 = 01012 9 = 10012

2 = 00102 6 = 01102 10 = 10102

3 = 00112 7 = 01112

Figura 23 – Representação da contagem de zero a dez em binário

Observe que podemos aplicar a notação posicional a cada uma


destas representações, conforme vimos na Figura 12, exatamente
como fizemos com a base decimal, apenas substituindo a base 10
pela base 2 (β = 2). A Figura 24 a seguir demonstra como ficaria a
aplicação da notação posicional a cada um dos valores encontrados:

41
Infraestrutura de Hardware

010 = 00002 = 0 × 23 + 0 × 22 + 0 × 21 + 0 × 20 = 0

110 = 00012 = 0 × 23 + 0 × 22 + 0 × 21 + 1 × 20 = 1

210 = 00102 = 0 × 23 + 0 × 22 + 1 × 21 + 0 × 20 = 2

310 = 00112 = 0 × 23 + 0 × 22 + 1 × 21 + 1 × 20 = 2 + 1

410 = 01002 = 0 × 23 + 1 × 22 + 0 × 21 + 0 × 20 = 4

510 = 01012 = 0 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 4 + 1

610 = 01102 = 0 × 23 + 1 × 22 + 1 × 21 + 0 × 20 = 4 + 2

710 = 01112 = 0 × 23 + 1 × 22 + 1 × 21 + 1 × 20 = 4 + 2 + 1

810 = 10002 = 1 × 23 + 0 × 22 + 0 × 21 + 0 × 20 = 8

910 = 10012 = 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 = 8 + 1

1010 = 10102 = 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 = 8 + 2

Figura 24 – Aplicação da Notação Posicional para verificar os valores gerados


na contagem de zero a dez em binário

Observe que uma vez que a base binária possui apenas dois
valores, o zero e o um, nosso somatório se reduziu a computar apenas
as posições aonde encontramos o um, uma vez que zero vezes
qualquer outro número é igual a zero. Se pensarmos bem isto simplifica
muito as coisas, uma vez que no nosso somatório aparecerão apenas
termos na forma 2n, tais como 20, 21, 22, 23 e assim por diante.

De fato, o processo de conversão de um número qualquer da base


decimal para a base binária consiste em encontrar esta sequência
de termos da forma 2n que quando somados resultem no valor que
estamos querendo converter.

Observe os resultados obtidos nos exemplos apresentados na


Figura 24. Para cada número expresso na base decimal, encontramos
uma sequência equivalente de números da forma 2n. Baseados nesta
observação, vamos agora aprender duas técnicas de conversão de
números da base decimal para a base binária. Nas duas abordagens
nosso objetivo é o mesmo, ou seja, encontrar este conjunto de termos
da forma 2n que quando somados resulte no valor que estamos
querendo converter.

42
Infraestrutura de Hardware

2.7 Técnica de Conversão por Divisões


Sucessivas

Esta técnica parte do princípio que podemos expressar qualquer


número em função do resultado obtido da sua divisão inteira por outro
número qualquer mais o resto encontrado. Neste caso, estaremos
sempre dividindo pelo dois, uma vez que queremos expressar o
número como um somatório de termos da forma 2n, ou seja, na base
binária. Veja os exemplos a seguir:

Veja que com esta técnica não precisamos de muito esforço para
converter os números 3, 5 e 9 da base decimal para a base binária.
Bastou uma única divisão para encontrarmos o que queríamos. Muito
simples não é mesmo?

Mas nem sempre é tão simples assim. Veja o exemplo a seguir:

Observe que o resultado obtido não pode ser expresso diretamente


em função da base 2, uma vez que o 3 nem é da base e nem é
potencia desta.

Quando isto acontece, precisamos reaplicar o processo no termo


que não pode ser expresso, neste caso no 3, de forma a poder
expressá-lo diretamente em função da base desejada.

43
Infraestrutura de Hardware

Por sorte, como nós acabamos de decompor o 3 em função da


base 2, no exemplo a, , podemos simplesmente substituir o 3 do nosso
resultado por 2+1. Desta forma, o nosso exemplo ficaria:

Agora, para concluir nosso processo, precisamos apenas eliminar


todas as multiplicações presentes no resultado, uma vez que, na
notação posicional os números devem ser expressos exclusivamente
como um somatório de termos. Faremos isto aplicando a propriedade
distributiva da multiplicação em todas as multiplicações presentes.
Vejamos a seguir como proceder:

Observe que na expressão final nós incluímos um zero como


primeiro dígito. Isto foi feito porque precisamos preencher todos os
dígitos em nossa representação, exatamente como fazemos na base
decimal. Este procedimento, como podemos constatar, não altera o
resultado obtido.

Desta forma, ao fim deste processo concluímos que o 6 pode


ser expresso na base binária através da sequência 1102, ou seja
1×22 + 1×21 + 0×20.

Um pouco mais trabalhoso, não é mesmo?

Ainda bem que existe uma forma bem mais prática e rápida de
efetuarmos esta conversão, sem ter que fazer todos estas contas, de
tal modo a obter o mesmo resultado com muito menos esforço.

Com este novo método, precisaremos apenas ir dividindo


sucessivamente o número a ser convertido por dois, anotando sempre
o resto obtido na divisão, até que o quociente obtido seja igual a 1.
Terminado o processo, para encontrar a representação do número na
base binária precisamos apenas escrever do último quociente obtido,
seguido dos restos encontrados nas etapas de conversão na ordem
inversa em que foram obtidos. Veja nos exemplos a seguir como esta
técnica é rápida e prática:

44
Infraestrutura de Hardware

Aplique agora esta técnica para verificar como ficariam os números


a seguir quando expressos na base binária. Depois, aproveite para
verificar se os valores encontrados em binário estão corretos aplicando
a notação posicional a cada um deles, faça como demonstramos na
Figura 24.

a) 25 =

b) 83 =

c) 142 =

d) 65 =

e) 17 =

f) 39 =

Bem prático, não é mesmo?

Para finalizar, vamos ver uma segunda técnica de conversão que


podemos utilizar para converter números pequenos, menores que
128, que podemos utilizar tanto para converter da base decimal para
a base binária como da base binária para a base decimal. A esta
técnica chamaremos de conversão direta.

45
Infraestrutura de Hardware

2.8 Técnica de Conversão Direta

A ideia por trás da conversão direta é decorar os pesos a serem


atribuídos a cada um dos oito primeiros dígitos dos números expressos
na base binária. Por difícil que possa parecer, esta tarefa é até bem
simples, uma vez que começando do bit menos significativo, o LSB,
o qual é ponderado com 20, a cada dígito que andarmos à esquerda
simplesmente multiplicamos o valor do ultimo dígito por dois. A Figura
25 a seguir nos traz os valores a serem utilizados.

Figura 25 – Pesos a serem atribuídos aos primeiros 8 dígitos de um número


escrito na base decimal

Desta forma, para convertermos um número de binário para


decimal, basta observar pela figura em quanto devemos ponderar
cada dígito do número dado, somado os valores obtidos, exatamente
como faríamos com um número expresso na base decimal.

Com um pouco de prática, ao longo do tempo, mesmo sem


perceber acabamos decorando os pesos a serem atribuídos a cada
um dos dígitos, de tal forma que ao ver um número, instintivamente,
ponderaremos o primeiro dígito por um, o segundo por dois, o terceiro
por quatro e assim por diante.

Desta forma, a tarefa de converter um número da base binária para


a base decimal será quase tão simples como trabalhar diretamente
com números da base decimal.

Que tal fazermos um teste? Utilizando os valores indicados na


Figura 25, tente converter os números a seguir da base binária para a
base decimal. Veja na letra a um exemplo de como proceder.

a) 101010102 = 2 + 8 + 32 + 128 = 170

b) 010101012

c) 100100112

d) 111100112

46
Infraestrutura de Hardware

e) 110001112

Muito fácil, não é mesmo?

Vejamos agora como podemos utilizar esta mesma técnica para


converter um número da base decimal para a base binária.

Partindo do princípio que todo e qualquer valor deve ser expresso na


forma de um somatório de termos, ou seja, na forma de um somatório
dos valores apresentados na Figura 25, podemos simplesmente fazer a
operação inversa, e passarmos a efetuar subtrações sucessivas entre
o número a ser convertido e os valores apresentados, assinalando os
termos que estamos utilizando.

Os únicos cuidados que devemos tomar é sempre começar nossas


subtrações pelo maior número que for possível subtrair, de forma a
obter o menor resto possível, e ir assinalando os números que forem
sendo utilizados.

Ao fim do processo, quando obtivermos o resto zero em nossas


subtrações, basta simplesmente formar a nossa representação em
binário substituindo os números que foram utilizados por 1 e os que
não foram utilizados por 0.

Tomemos como exemplo o número 26, vamos tentar convertê-lo


para a base binária utilizando a técnica da conversão direta.

Figura 26 – Exemplo de conversão para a base binária utilizando a conversão direta

Agora tente você mesmo, converta os números a seguir para a


base binária utilizando a conversão direta.

a) 35

b) 24

47
Infraestrutura de Hardware

c) 72

d) 47

Muito fácil, não é mesmo?

Para finalizar esta primeira parte do nosso estudo, vamos ver como
podemos converter os números fracionários da base decimal para a
base binária.

2.9 Números Fracionários na Base Binária

A representação dos números fracionários na base binária se dá


exatamente da mesma forma como aprendemos na base decimal.

Para começar, vamos relembrar como ponderamos os dígitos


utilizados para representar a parte fracionária de um numero na base
decimal. Por exemplo, qual a diferença dos pesos atribuídos aos
dígitos de 10,0 e 0,1? Observe a Figura 27 a seguir.

Figura 27 – Exemplo de pesos atribuídos aos dígitos de um número fracionário

Veja que, no primeiro caso, o 1 antes da vírgula foi ponderado com


101, ou seja, por dez mesmo. Já no segundo caso, o 1 após a vírgula

foi ponderado com 10-1, ou seja, por . Nos dois casos, o número

1 estava uma posição distante da posição das unidades, que é a


primeira posição a esquerda da vírgula. Ambos foram ponderados
de acordo com a sua posição, só que no primeiro número, como o 1
estava à esquerda da vírgula, este foi ponderado positivamente e o
que estava a direita negativamente.

Desta forma, dizemos que os dígitos reservados à representação


da parte fracionária, os quais são colocados à direita da vírgula,
são ponderados negativamente, enquanto que os reservados à
parte inteira, os que ficam à esquerda da vírgula são ponderados
positivamente.

48
Infraestrutura de Hardware

Esta é também a estratégia adotada para a representação dos


números fracionários na base binária. Da mesma forma que na base
decimal, dividem-se os dígitos por uma vírgula, ficando os da esquerda
reservados para a representação da parte inteira e os da direita para
a parte fracionária.

Vejamos alguns exemplos:

Para efetuarmos a conversão de um número fracionário da base


decimal para a base binária, podemos ou utilizar o processo de
conversão direta, conforme acabamos de ver, apenas incluindo os
valores a serem atribuídos aos dígitos à direita da vírgula, ou podemos
utilizar um algoritmo muito semelhante ao adotado para conversão
por divisões sucessivas, só que em vez de divisões efetuaremos
multiplicações sucessivas.

2.10 Algoritmo de Conversão por


Multiplicações Sucessivas

O processo de conversão de um número fracionário da base


decimal para a base binária pode ser efetuado de maneira simples e
direta a partir do seguinte algoritmo.

Dado um número a ser convertido, separe a parte inteira da parte


fracionária. Primeiramente converta a parte inteira através de uma das
técnicas já apresentadas. Feito isto, podemos passar a conversão da
parte fracionária da seguinte forma:

1. Verifique se a parte fracionária do número a ser convertido


é igual a zero. Em caso afirmativo, o processo de conversão
se encerra e a sequência de dígitos obtida é a representação
desejada.

2. Caso a parte fracionária seja diferente de zero, multiplique esta

49
Infraestrutura de Hardware

por dois. Anote e subtraia o primeiro dígito da parte inteira do


resultado obtido. Este dígito deverá ser colocado á direita dos
dígitos já obtidos durante o processo de conversão da parte
inteira.

3. Retorne ao primeiro passo do algoritmo.

O exemplo a seguir demonstra como devemos aplicar este


algoritmo.

Figura 28 – Demonstração do algoritmo de conversão de Números Fracionários da Base


Decimal para a Base Binária

Tente agora converter os seguintes números fracionários para a


base binária:

a) 0,125

b) 7,750

c) 0,1875

2.11 Operações Aritméticas na Base Binária

Agora que já conhecemos a base binária e como podemos


utilizá-la para representar valores numéricos inteiros e fracionários,
podemos passar a estudar como efetuar as duas principais operações
aritméticas nesta base.

50
Infraestrutura de Hardware

Lembre-se, como comentamos a princípio, nosso principal objetivo


ao estudarmos a base binária é buscar entender como as Unidades
Lógicas e Aritméticas dos processadores funcionam, e como estas
conseguem operar com os números representados na base binária.

Operação de Adição

De um modo geral podemos dizer que não existem grandes


diferenças entre as operações de adição que nós efetuamos utilizando
a base decimal, e as operações de adição que as Unidades Lógicas
e Aritméticas dos processadores efetuam utilizando a base binária.
Na verdade, a única coisa que muda é o valor no qual ocorre o nosso
conhecido “vai um”.

Nas Figuras 28, 29, 30 e 31 a seguir, temos alguns exemplos de


operações de adição efetuadas tanto na base decimal quanto na base
binária.

Vamos primeiro analisar o que ocorre em uma operação de adição


na base decimal. Acompanhe nosso raciocínio na Figura 29 a seguir.

Figura 29 – Exemplos de ocorrência de “vai um” na base decimal

Como sabemos, a soma de dois números quaisquer é sempre


efetuada a partir de somas parciais efetuadas par a par sobre cada um
dos seus algarismos. Somamos primeiro as unidades, em seguida as
dezenas, as centenas e assim por diante. E, sempre que o resultado
de uma destas somas parciais for maior que nove, o que caracteriza
um estouro da base, efetuamos um “vai um”, correspondente ao
dígito das dezenas do resultado obtido, ficando apenas o dígito
correspondente a parte das unidades para ser registrado na posição
onde ocorreu a adição.

Eu tenho certeza que você já está cansado(a) de saber disto, não


é mesmo?

Pois bem, para nossa felicidade a operação de adição na base


binária é até bem mais simples do que isto. Lembre-se que a base
binária possui apenas dois símbolos, o zero e o um, e isto por si só
já simplifica muito as coisas. Uma operação de adição entre dois

51
Infraestrutura de Hardware

algarismos da base binária só pode assumir uma das seguintes


configurações: 0 + 0, 0 + 1, 1 + 0 e 1 + 1. Não podia ser mais fácil,
não é mesmo?

Vamos começar com algo bem simples, acompanhe a operação


do exemplo da Figura 30 a seguir.

Figura 30 – Exemplo de ocorrência de “vai um” na base binária

Observe os passos 1 e 2 de nossa operação. Como você deve


ter, notado sempre que um resultado parcial for maior que 1, o que
indica um estouro da base binária, a exemplo do que ocorre com
a base decimal quando um resultado parcial é maior que nove,
precisamos fazer um vai um para o dígito seguinte. Como em ambos
os casos os resultados parciais são iguais a dois, e como dois em
binário é representado como 102, efetuaremos um vai um e fica zero.
Exatamente como fizemos no exemplo a da Figura 29 quando o
resultado de uma soma parcial foi igual a onze.

Observemos agora o nosso próximo exemplo:

Figura 31 – Mais um exemplo de ocorrência de “vai um” na base binária

Aqui, além do vai um e fica zero ocorrido na operação anterior,

52
Infraestrutura de Hardware

temos também um vai um e fica um, resultante da operação 1+1+1


ocorrido no passo dois. Como todos sabemos, 1+1+1 é igual a 3
e como 3 em binário é igual a 11, à semelhança do que vimos no
exemplo b da Figura 29, precisamos fazer um “vai um e fica um” a fim
de propagar o estouro da base observado no resultado obtido.

Muito simples, não é mesmo? Nosso único cuidado deve ser


observar corretamente quando efetuar o “vai um”, que em binário
ocorre sempre que o resultado for maior que “1”. O restante da
operação ocorre exatamente como estávamos acostumados operando
com a base decimal.

Agora, para terminar, observemos na Figura 32 a seguir o que


pode ocorrer quando somamos mais de dois números de uma vez só
em binário.

Figura 32 – Exemplo de “vai um e zero e fica um” em binário

Neste exemplo, temos uma situação bem peculiar, que dificilmente


observaríamos na base decimal. No segundo passo da nossa
operação, quando somamos 1 + 1 + 1 + 1 temos um “vai um e zero e
fica zero”, ou seja, temos a propagação de um vai um para a mais de
uma casa à esquerda da posição que estamos operando. Isto ocorre
porque, em decimal, 1 + 1 + 1 + 1 é igual a 4 e 4 em binário é “100”,

53
Infraestrutura de Hardware

desta forma, como sempre ficamos apenas com o primeiro dígito


passando os restantes para as casas seguintes, temos que fazer
Fique um “vai um e zero e fica zero”.
por Dentro
Muito estranho, não é mesmo? Mas você não tem com o que se
É comum nos
referirmos às
assustar, a regra é sempre a mesma, primeiramente some os dígitos
posições que da operação parcial, exatamente como se estivesse operando na base
os dígitos de
um número decimal, em seguida converta o resultado obtido para binário, por
ocupam como
casas. Como, por
fim preserve apenas o dígito menos significativo do resultado obtido,
exemplo, a casa propagando os demais dígitos em uma operação do tipo vai n.
das unidades
ou a casa das
centenas.
Operação de Subtração

Por questões de economia, a fim de reduzir o tamanho e a


complexidade do hardware empregado, as Unidades lógicas e
Aritméticas dos processadores convertem as operações de subtração
em operações de adição entre o primeiro operando (minuendo) e o
inverso do segundo operando (subtraendo).

Como era de se esperar, e como podemos ver pela expressão a


seguir, apesar de reduzir enormemente o hardware necessário nas
Unidades Lógicas e Aritméticas, isto em nada altera o resultado
obtido.

Desta forma, uma vez que já sabemos como se processa uma


operação de adição na base binária, a única coisa que precisamos
aprender para efetuar uma operação de subtração na base binária é
aprender como podemos representar o inverso de um número nesta
base.

Antes disto, entretanto, precisamos definir claramente o que


é o inverso de um número. Isto será muito importante para que
compreendamos o que iremos fazer para representar os números
negativos na base binária.

Em qualquer sistema numérico, o inverso de um número é aquele


que somado ao primeiro, tem zero como resultado.

Na base decimal, por convenção, representamos um número


negativo da mesma forma que representamos um número positivo,
com a única diferença que o número negativo será precedido pelo

54
Infraestrutura de Hardware

sinal “-”. Este padrão de representação que simplesmente associa um


sinal de “-” para formar a representação de um número negativo, é
conhecido como representação de Magnitude e Sinal. Saiba Mais

Na base binária além da representação de Magnitude e Sinal temos O termo


Magnitude e
também uma outra, conhecida como representação de Complemento Sinal indica
a Dois. que temos uma
representação
baseada na
Como já dissemos, dentro da Unidade Lógica e Aritmética de um magnitude
processador todos os números são representados utilizando apenas do número
representado,
as base binária. Nem mesmo os sinais de “+” e “-” existem. De um ou seja, o
seu módulo,
modo geral, tanto na representação de Magnitude e Sinal quanto na associada a um
representação de Complemento a Dois, adota-se reservar o dígito sinal algébrico
que indica
mais significativo ou MSB (Most Signficant Bit), para sinalizar se um se este é um
número positivo
número é positivo ou negativo. Normalmente utiliza-se o “0” para ou negativo.
indicar que o número é positivo e o “1” para indicar que o número é Normalmente
não se exige o
negativo. uso do sinal “+”
para indicar que
um número é
No sistema de Magnitude e Sinal, a semelhança do que ocorre
positivo.
na base decimal, simplesmente ajustamos o MSB para indicar se o
número é positivo ou negativo, deixando o restante da representação
inalterada. A Figura 33 a seguir demonstra como ficaria a representação
de alguns números positivos e negativos neste sistema.
Saiba Mais

Apesar de
também possuir
uma indicação
do sinal
algébrico, ou
Figura 33 – Representação no sistema Magnitude e Sinal seja, de sinalizar
claramente se um
número é positivo
Observe que este sistema apresenta duas incoerências: ou negativo, a
representação
em complemento
Em primeiro lugar, permite duas representações distintas para o a dois, como
zero, uma positiva e outra negativa. iremos ver um
pouco mais a
frente, adota
E, em segundo lugar, se tentarmos operar a soma de um número estratégias
diferentes
com o seu inverso, nos moldes do que aprendemos até agora para
para registrar
a base binária, não obteremos zero como resultado. Ou seja, a a magnitude
ou o tamanho
representação de Magnitude e Sinal é muito útil e interessante para de números
negativos e
nós seres humanos, mas para os computadores é um verdadeiro
positivos.
desastre. Por este motivo, os sistemas computacionais normalmente
adotam a representação de Complemento a Dois como representação
padrão para os números dentro das Unidades Lógicas e Aritméticas.

55
Infraestrutura de Hardware

Notação de Complemento a Dois

A Notação de Complemento a Dois não apenas corrige o problema


da indicação de zero negativo e positivo como também permite
expressar convenientemente o inverso de um número, de tal forma
que a adição deste com o seu inverso, em binário, resulte em zero
binário.

Considere um número N2 qualquer expresso na base binária. Se


existe uma representação para em (-N2 ) em binário, esta representação
deve ser tal que:

Figura 34 – Definição do inverso de um número em binario

Ou seja, se (-N2) existir, este certamente pode ser obtido pela


operação subtração do próprio N2 da representação do zero em
binário (02).

Sendo assim, só para começar tentemos encontrar uma


representação para o inverso do número 1 em binário, ou seja, uma
representação para (-1), de tal forma que quando somarmos esta
representação ao próprio 1 em binário obtenhamos o zero binário
como resultado.

Antes de qualquer coisa, precisamos primeiramente definir


quantos dígitos a nossa representação terá. Isto é importante porque,
conforme dissemos a princípio, o MSB de um número em binário deve
ser reservado para indicar se este é positivo ou negativo. Desta forma,
apenas por convenção, vamos adotar uma representação baseada
em uma palavra de 8 bits. Feito isto, acompanhemos agora os demais
passos apresentados na Figura 35 a seguir.

Observe que começamos definindo uma representação para o


zero e outra para o um. Observe também que o MSB de ambos os
números é zero, o que indica que ambos são números positivos.

No passo 1, exatamente como faríamos na base decimal,


começamos nossa operação subtraindo os primeiros algarismos
da representação do um e do zero, que, por coincidência são
respectivamente 1 e 0.

Como 1 é maior que 0, precisamos pedir algo emprestado para

56
Infraestrutura de Hardware

que possamos continuar a nossa operação. Esta operação de pedir


emprestado, em binário é também conhecida como “vem um”.
Entretanto, como podemos ver, o segundo dígito da representação
também é zero, ou seja, não pode emprestar nada ao primeiro. O
terceiro, o quarto, o quinto, o sexto,o sétimo e até o oitavo dígitos
são todos iguais a zero. Ou seja, aparentemente nossa operação
não pode continuar. Lembre-se, se estivéssemos operando na base
decimal, nós simplesmente inverteríamos a operação e o sinal do
seu resultado. Aqui em vez disto, como podemos ver no passo dois,
faremos um “vem um externo” que, como veremos, não apenas
“inverterá o sinal do nosso número” como também nos permitirá
concluir convenientemente nossa operação de subtração.

Um detalhe importante aqui, como podemos ver pelo passo 3,


é que, diferente do que ocorre na base decimal aonde um vem um
significa somar dez ao dígito anterior, na base binária o vem um
significa somar dois ao dígito anterior. Desta forma, ao se propagar, o
nosso “vem um” vai fazendo com que todos os dígitos menos o LSB
da representação do zero fiquem igual a 1, conforme podemos ver
pelo passo quatro da nossa operação. Como o LSB não vai emprestar
para ninguém, este fica com valor igual a dois ou “10” na base binária,
conforme podemos ver no passo 5 da nossa operação.

Figura 35 – Estratégia para encontrar uma representação para -1 na base binária

Agora sim, feita a propagação do “vem um externo”, podemos


completar nossa operação subtração, tendo como resultado 111111112,

57
Infraestrutura de Hardware

que é a nossa representação para (-1) na notação de complemento


a dois.

Como você pode perceber, ainda que um pouco trabalho, o


processo todo é até bem simples.

Vamos agora verificar se o valor que encontramos para representar


o (-1), atende a prerrogativa estabelecida, ou seja, se a sua adição
com a representação do 1 utilizada para obtê-la resulta em zero.

Para tanto, vamos somar a representação encontrada com a


representação para o número 1 anteriormente utilizada.

Figura 36 – Verificando se a representação de -1 encontrada está correta

Como podemos ver, com exceção do “vai um” para o nono dígito,
todos os demais resultaram igual a zero, o que é uma representação
válida para o zero no formato de número binário adotado.

O “vai um” do nono dígito será considerado apenas como o inverso


do “vem um externo” ocorrido na operação de obtenção do (-1), sendo
desta forma apenas uma indicação da inversão do sinal do resultado.

Observe que este processo não apenas atendeu à prerrogativa


estabelecida, como indica corretamente o sinal do número
representado. Observe que o MSB da representação para o (-1) é
igual a 1, indicando que este é um número negativo. Ao passo que o
MSB da representação para o (1) é igual a zero, indicando que este é
um número positivo.

Muito interessante, não é mesmo?

Vamos agora ver um processo bem mais simples e prático de obter


este mesmo resultado.

Na verdade, a representação em “Complemento a Dois” recebe


este nome devido ao algoritmo que iremos apresentar agora.

58
Infraestrutura de Hardware

Dado um número qualquer, inverta o valor de todos os seus dígitos,


ou seja, aonde tiver “1” coloque “0” e aonde tiver “0” coloque “1”. Este
processo recebe o nome de complemento a um, ou simplesmente
complemento.

Adicione “1” ao resultado obtido e, como num passe de mágica


obtenha o inverso do número que estava procurando.

Na Figura 37 a seguir, temos uma demonstração deste algoritmo


aplicado para obter o inverso de 1.

Figura 37 – Aplicação do algoritmo de conversão de números para complemento a dois

Muito interessante, não é mesmo?

Este algoritmo pode ser aplicado a qualquer número expresso


na base binária. Mesmo um número negativo pode ser “invertido” e
transformado em um número positivo por este processo. No exemplo
a seguir temos este processo aplicado para encontrar o inverso da
representação de (-1) em complemento a dois.

Figura 38 – Aplicação do algoritmo e conversão para complemento a dois aplicado a um


número negativo

Para finalizar nosso estudo das operações aritméticas na base


binária, que tal verificar o que aprendemos fazendo alguns exercícios?

59
Infraestrutura de Hardware

A seguir tem alguns exemplos já resolvidos. Tente fazê-los por si


mesmo, e no final compare os resultados obtidos. Em todos eles nós
iremos adotar o padrão binário de 8 bits em complemento a dois. Para
os números negativos, primeiramente vamos representá-los como
números positivos e em seguida convertê-los para números negativos
no padrão de complemento a dois.

a) 7 – 5 = 00000111 – (00000101) = 00000111 + 11111011 =


00000010 (2)

b) 13 – 45 = 000011012 – (001011012) = 000011012 + 110100112 =


111000002 (-32)

c) -21 – 43 = -(000101012)-(001010112) = 111010112 + 110101012


= 1110000002 (-64)

d) -35 + 102 = -(001000112) + 11001102 = 110111012 + 011001102 =


010000112 (67)

2.12 Poder de Representação da Base Binária

Nesta última parte do nosso estudo, vamos dar uma paradinha


e considerar o poder de representação desta base numérica tão
importante. Para tanto, comecemos tentando respondendo algumas
perguntas, que até certo ponto podem parecer meio confusas, mas
que ao respondermos nos dará uma visão mais clara deste ponto tão
importante.

1. Quantos números podemos representar na base binária,


adotando uma representação sem sinal, com uma palavra
de N bits? E ainda, quais seriam o maior e o menor número
representáveis para uma palavra deste tamanho?

2. E, se adotássemos uma representação com sinal, digamos em


complemento a dois, o que mudaria em nossos valores? Nesta
condição, quantos números poderíamos representar e qual
seria o maior e o menor deles?

3. Quantos bits, ou dígitos, seriam necessários para representar


um número R qualquer, dado originalmente na base decimal,
se adotássemos uma representação utilizando a base binária
em uma notação com e sem sinal?

Para responder estas perguntas, pensemos um pouco... Vamos


começar com a base numérica que estamos mais acostumados.

60
Infraestrutura de Hardware

Vamos primeiramente analisar a base decimal e depois vamos aplicar


as nossas conclusões à base binária.

Quantos números podemos representar na base decimal se


adotarmos um formato N dígitos? Acompanhe nosso raciocínio pela
Figura 39 a seguir.

Figura 39 – Quantidade de números representáveis na base decimal com N dígitos

Observe que cada dígito que incluímos em nossa representação nos


permite multiplicar por dez a quantidade de números representáveis.
Com 1 dígito, se representarmos apenas números positivos podemos
representar até 10 números, entre 0 e 9. Com 2 dígitos podemos
representar até 100 números, entre 0 e 99. Com 3 dígitos até 1000
números, 0 e 999 e assim por diante.

Vamos agora aplicar a mesma análise para a base binária.


Acompanhe na Figura 40 a seguir:

Figura 40 – Quantidade de números representáveis na base binária com N dígitos

Você percebeu que com a base binária ocorre algo semelhante ao


que tínhamos observado na base decimal?

A cada novo dígito que incluímos multiplicamos o total de números


representáveis por 2, ou seja, da mesma forma que na base decimal,
a cada novo dígito que incluímos multiplicamos o total de números
representáveis pela quantidade de símbolos da base adotada.

61
Infraestrutura de Hardware

Observe ainda que, tanto na base decimal quanto na base binária,


como estamos representado apenas números sem sinal, ou seja,
apenas números positivos, o menor número representável foi sempre
o zero e o maior foi sempre igual a βN-1, onde β = base numérica
adotada e N é a quantidade de dígitos utilizados.

Verifique por você mesmo... Quantos números você pode formar


na base decimal com 5 dígitos? E na base binária, quantos números
você poderia formar com os mesmos 5 dígitos?

Por fim, vamos agora observar o que acontece quando utilizamos


a base binária para representar números com sinal, ou seja, números
positivos e negativos.

Como você deve estar lembrado, tanto no padrão de Magnitude e


Sinal quanto no padrão de Complemento a Dois, o bit mais significativo,
o MSB, deve ser reservado para representação do sinal do número.
Ou seja, dos N bits que temos apenas N-1 são efetivamente utilizados
para representar a magnitude ou o valor do número.

Observe as Figuras 41 e 42 a seguir.

Figura 41 – Quantidade de números representáveis com N dígitos no padrão de Magnitude


e Sinal
62
Infraestrutura de Hardware

Figura 42 – Quantidade de números representáveis com N dígitos no padrão de


Complemento a Dois

Você conseguiu perceber que tanto no padrão de Magnitude


e Sinal como de Complemento a Dois o total de números gerados
continua sempre igual a βN?

Observe com bastante atenção, este não é um detalhe fácil de ser


percebido. Veja por exemplo no padrão de Complemento a Dois, na
última parte da Figura 42. Se somarmos a quantidade de números
positivos, a quantidade de números negativos e o zero teremos:

Agora tente fazer o mesmo para o padrão de Magnitude e Sinal e


veja se você consegue confirmar este mesmo resultado.

Para finalizar a nossa análise, temos na tabela da Figura 43 a


seguir um comparativo entre as representações de números com
sinal e sem sinal para uma palavra de 4 bits.

63
Infraestrutura de Hardware

Representação com Sinal Representação sem Sinal

Notação de
Notação de
Complemento a Binário sem Sinal
Magnitude e Sinal
Dois

0111 7 0111 7 1111 15

Números Positivos

Números Positivos
0110 6 0110 6 1110 14

0101 5 0101 5 1101 13


2(N-1)-1

2(N-1)-1
0100 4 0100 4 1100 12

0011 3 0011 3 1011 11

Números Positivos
0010 2 0010 2 1010 10
0001 1 0001 1 1001 9

2(N)-1
Zero 0000 0 Zero 0000 0 1000 8
1111 -1 - Zero 1000 -0 0111 7
1110 -2 1001 -1 0110 6
Números Negativos

Número Negativos

1101 -3 1010 -2 0101 5


1100 -4 1011 -3 0100 4
2(N-1)

2(N-1)-1

1011 -5 1100 -4 0011 3


1010 -6 1101 -5 0010 2
1001 -7 1110 -6 0001 1
1000 -8 1111 -7 Zero 0000 0

Figura 43 – Comparativo entre o poder de representação para números representados em


Complemento a Dois, Magnitude e Sinal e Binário sem Sinal, para uma palavra binária com
4 bits

Para concluir nosso estudo da base binária, que tal aprendermos


mais um método para encontrar o inverso de um número no padrão de
Complemento a Dois? Este método que iremos aprender agora tem
a vantagem de ser extremamente simples para nós, seres humanos,
ainda que extremamente complexo para a Unidade Lógica e Aritmética
executar, motivo pelo qual não é muito utilizado na prática.

Para converter um número em seu inverso, simplesmente execute


os seguintes passos:

1. Dado um número qualquer, expresso no padrão de Complemento


a Dois, comece a percorrer todos os seus bits da direita para a
esquerda, parando no primeiro bit igual a 1 que encontrar.

2. Inverta o valor de todos os bits que estiverem a esquerda deste


primeiro bit encontrado.

64
Infraestrutura de Hardware

3. O resultado obtido será o inverso do número dado no padrão


de Complemento a Dois. Ou seja, se o número dado for positivo
o resultado será a sua representação negativa, e se este for
negativo o resultado será a sua representação positiva.

Os exemplos das Figuras 44 e 45 a seguir nos demonstram como


podemos aplicar este método tanto para números positivos como
negativos.

Figura 44 – Exemplos de conversão de números positivos para negativos no padrão de


Complemento a Dois pelo método simplificado

Figura 45 – Exemplos de conversão de números negativos para positivos no padrão de


Complemento a Dois pelo método simplificado

65
Infraestrutura de Hardware

Para concluir nosso estudo da base binária, nos falta ainda


responder nossa terceira e última questão: “Quantos dígitos, ou bits,
precisamos para representar um número R qualquer?”

A resposta desta questão está intimamente ligada ao que acabamos


de estudar, no tocante ao poder de representação da base binária.

Como acabamos de aprender, se adotarmos uma palavra com N


bits poderemos representar números entre 0 e 2N-1 no padrão binário
sem sinal e entre -2N-1 e 2N-1-1 no padrão de Complemento a Dois.

Desta forma, para definir quantos bits, ou qual o N que precisamos


adotar para representar um numero R qualquer na base binária
precisamos simplesmente resolver a seguinte equação.

, ou seja:

Acompanhe os exemplos a seguir:

1. Quantos bits, no mínimo, seriam necessários para representar


o número 237 na base binária sem sinal?

Como teremos que utilizar uma palavra com 8 bits

2. Quantos bits, no mínimo, seriam necessários para representar


o número 87 na base binária sem sinal?

Como teremos que utilizar no mínimo 7 bits

3. Quantos bits, no mínimo, seriam necessários para representar


o número 87 na base binária no padrão de Complemento a
Dois?

Lembrete

Lembre-se que, no padrão de Complemento a dois e de Magnitude e Sinal


além dos bits normalmente utilizados, nós precisamos incluir um bit a mais
para representar o sinal do número. Desta forma, como já havíamos calculado
que seriam necessários 7 bits para representá-lo sem sinal, precisaremos,
então, de 8 bits para representá-lo no padrão de Complemento a Dois.

4. Quantos bits, no mínimo, seriam necessários para representar


o número -35 na base binária no padrão de Complemento a
Dois?

Como , e como temos que incluir um bit a mais para

66
Infraestrutura de Hardware

representar o sinal do número, teríamos que utilizar no mínimo


7 bits.

Com isto concluímos nosso estudo da base binária. Acompanhe


agora os exercícios propostos no seu Caderno de Exercícios para
fixar o que você aprendeu.

2.13 Bases Octal e Hexadecimal

Conforme dissemos no início do nosso estudo, as bases numéricas


são definidas a fim de simplificar o dia a dia de quem as utiliza.

A base binária, por exemplo, é extremamente prática para ser


empregada na Unidade Lógica a Aritmética dos computadores, pois
permite implementar circuitos simples e eficazes.

Por outro lado, esta mesma base binária é extremamente confusa


para nós, seres humanos. Nossa mente está melhor adaptada a
trabalhar com a informação em um grau maior de abstração.

Desta forma, a fim de simplificar o trabalho com valores


originalmente expressos na base binária, foram definidas duas outras
bases numéricas, as bases octal e hexadecimal.

Estas bases oferecem a vantagem de permitir o mapeamento, ou


conversão, direta dos valores expressos na base binária. Desta forma,
a conversão entre a base binária e as bases octal e hexadecimal, e
vice versa, ocorre de maneira simples e natural.

Conforme vimos, a base octal possui apenas oito símbolos,


{0, 1, 2, 3, 4, 5, 6, 7}. E, como vimos no nosso estudo da base binária,
para representar valores entre zero e sete precisamos exatamente de
3 bits, ou dígitos, binários. Ou seja, para fazermos a conversão entre
a base binária e a base octal basta que agrupemos os bits utilizados
em palavras de 3 bits, susbtituíndo-os pelo seu valor equivalente pela
notação posicional. A conversão da base octal para a base binária
se dá exatamente pelo caminho inverso, ou seja, simplesmente
substituímos cada símbolo da base octal pelo seu equivalente na
base binária. O único cuidado que precisamos ter nesta conversão
é que cada símbolo da base octal equivale a 3 bits da base binária e
vice-versa.

Observe os exemplos de conversão apresentados na Figura 46 a


seguir:

67
Infraestrutura de Hardware

Figura 46 – Exemplos de conversões entre a base binária e a base octal e vice-versa

Muito simples, não é mesmo?

Com a base hexadecimal não é diferente. Como esta base possui


Atenção exatamente 16 símbolos, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D. E, F},
podemos associar cada um dos seus símbolos a 4 bits, ou um nibble,
O termo Nibble
significa da base binária.
literalmente meio
byte, ou seja 4
bits.
A conversão entre a base binária e a base hexadecimal se dá
exatamente da mesma forma que acabamos de ver com a base octal.
Veja alguns exemplos na Figura 46 a seguir:

Figura 47 – Exemplos de conversões entre a base binária e a base hexadecimal a vice-


versa

Atualmente, a base octal se encontra praticamente em desuso,


havendo quase uma hegemonia da base hexadecimal. Mesmo assim,
devido ao seu valor histórico, é muito importante que aprendamos
a operar com números tanto na base octal quanto na base
hexadecimal.

A fim de evitar ambiguidades, todas as linguagens de programação


utilizam algum tipo de indicação para identificar a base numérica
adotada em determinado número. Normalmente utiliza-se um prefixo
ou um sufixo no lugar do subscrito que temos adotado em nosso texto.
Os padrões mais utilizados são:

» Base Hexadecimal: utiliza-se o prefixo “0x” antes do número.


Por exemplo: 0xA3, 0x37, 0xAA35, e assim por diante.

» Base Octal: utilizam-se apenas a letra “O” como prefixo. Por


exemplo: O35, O71, O11, e assim por diante.

» Base Binária: A maioria das linguagens existentes atualmente


não dá suporte direto a dados expressos na base binária. Desta
forma, o artifício mais comum, quando necessário, é lançar mão

68
Infraestrutura de Hardware

do mapeamento existente entre esta base e as bases octal a


hexadecimal.

Conversão das bases Octal e Hexadecimal para


Decimal

A conversão de números escritos tanto da base octal quanto


da base hexadecimal para a base decimal se dá exatamente da
mesma forma como fizemos na base binária, ou seja, pela aplicação
da notação posicional. Para tanto, utilizamos o somatório visto na
Figura 12, apenas lembrando que devemos substituir o β pelo valor
correspondente a base adotada. Devemos lembrar também que as
letras utilizadas como símbolos da base hexadecimal possuem valor
numérico, ou seja, devemos lembrar que na base hexadecimal o
símbolo A equivale a 10, o B equivale a 11, o C equivale a 12, o D
equivale a 13, o E equivale a 14 e o F equivale a 15.

Vejamos os exemplos a seguir:

a) 0x36 = 3x161 + 6x160 -= 54

b) 0xAA = 10x161 + 10x160 160+10 = 170

c) 0x378 = 3x162 + 7x161 + 8x100 = 888

d) O35 = 3x81 + 5x80 = 64

e) O77 = 7x81 + 7x80 = 31

f) O121 = 1x82 2x81 + 1x80 = 81

Conversão da base Decimal para as bases Octal e


Hexadecimal

As conversões da base decimal para as bases octal e hexadecimal


podem ser efetuadas de duas maneiras. A primeira é através de uma
variação do algoritmo apresentado para a conversão da base decimal
para a binária, que denominamos de técnica por divisões sucessivas.
A segunda é convertendo o número primeiramente para binário e
depois fazendo a conversão direta para a base desejada, octal ou
hexadecimal.

Como todos já sabemos converter da base decimal para a base


binária, vamos demonstrar apenas como converter utilizando a
variação do algoritmo de divisões sucessivas. Vamos começar pela
base octal. Observe os exemplos da Figura 48 a seguir.
69
Infraestrutura de Hardware

Figura 48 – Exemplos de conversão da base decimal para a base octal

Agora vamos ver como fica a conversão para a base hexadecimal.


Observe a Figura 49 a seguir.

Figura 49 – Exemplos de conversão da base decimal para a base hexadecimal

Muito simples, não é mesmo?

Agora que já sabemos como converter e representar números


nas bases octal e hexadecimal, nos falta apenas ver como ficam as
operações de adição e subtração nestas bases.

70
Infraestrutura de Hardware

A primeira coisa que devemos ter em mente ao pensar na execução


das operações aritméticas nas bases octal e hexadecimal é que estas
bases nada mais são do que uma outra forma de ver a base binária.
Ou seja, que estas bases na verdade apenas apresentam os valores
obtidos na base binária de uma forma mais agradável para o ser
humano.

A operação de adição permanece exatamente como fazemos na


base decimal, com a única diferença com o valor no qual ocorre o “vai
um”, que em octal ocorre quando o resultado parcial for maior que 7 e
em hexadecimal quando o resultado parcial for maior que 15.

Para a operação de subtração, por sua vez, devemos levar em


conta todas as considerações feitas para a base binária, ou seja,
que na Unidade Lógica e Aritmética dos computadores todas as
operações de subtração são substituídas por operações de adição
entre o primeiro operando e o inverso do segundo operando.

Pelos motivos já expostos, mesmo nas bases octal e hexadecimal


adotamos o formato de Complemento a Dois para representar o
inverso de um número.

Assim sendo, a estratégia mais interessante para as operações de


subtração nas bases octal e hexadecimal, quando os operandos já
não estiverem expressos no formato de Complemento a Dois, deverá
ser:

» Primeiramente converter os operandos para a base binária;

» Transformar o subtrator para o seu inverso, em Complemento a Dois, por uma


das técnicas apresentadas;

» Efetuar a operação diretamente na base binária;

» Converter os resultados obtidos para a base desejada.

Observe os exemplos da Figura 50 a seguir. No exemplo a


temos uma operação entre operandos expressos na base octal. No
exemplo b, temos uma operação com operandos expressos na base
hexadecimal.

Preste atenção ao exemplo b. Perceba que ao operarmos com a


base hexadecimal temos que tomar cuidado não apenas com o valor
no qual ocorre o “vai um”, mas também nas conversões entre os
resultados parciais encontrados e os símbolos a serem utilizados.

71
Infraestrutura de Hardware

Figura 50 – Exemplos de operações nas bases octal a hexadecimal

Com isto, encerramos nosso estudo sobre bases numéricas.

Esperamos que tenham gostado. Este é um conhecimento


extremamente útil para todos aqueles que pretendem entender um
pouco mais como um computador realmente funciona.

Para os que se desejarem se aprofundar um pouco mais neste


assunto, recomendamos a leitura dos seguintes trabalhos científicos:
“What every computer scientist should know about floating-point
arithmetic.pdf ” disponível em <http://dlc.sun.com/pdf/800-7895/800-7895.
pdf> e “Where did all my decimals go.pdf” disponível em <http://jetlib.
com/mirrors/test/uvu.freshsources.com/page1/page2/page5/files/decimals.
pdf>,além de acompanharem o conteúdo disponível na bibliografia
recomendada.

72
Infraestrutura de Hardware

Vamos Revisar?

Neste capítulo aprendemos sobre as Bases Numéricas e sobre o


Notação Posicional e a sua importância para o desenvolvimento dos
computadores digitais.

Aprendemos também que as duas bases numéricas mais


importantes são:

» A Base Decimal, formada por dez símbolos {0,1,2,3,4,5,6,7,8,9},


utilizada por nós, seres humanos.

» A Base Binária, formada apenas pelos símbolos 0 e 1, utilizada


pela Unidade Lógica e Aritmética dos Computadores.

Além destas bases, conhecemos também as bases Octal e


Hexadecimal, que foram criadas com o intuito de facilitar a visualização
e a operação de valores expressos na base binária.

Também pudemos aprender diversas técnicas e métodos que


podem ser empregados na conversão de valores expressos em
diferentes bases numéricas. Com isto pudemos constatar que todos
os valores inteiros podem ser expresso em qualquer das bases
numéricas estudadas, e que, por outro lado, nem todo valor decimal
pode ser livremente convertido, uma vez que alguns destes tornam-
se dízimas periódicas quando passados de uma base para outra.

Um outro ponto muito importante que aprendermos foi que as


operações aritméticas são integralmente preservadas em todas as
bases estudadas.

73
Infraestrutura de Hardware

Capítulo 3

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Portas lógicas e funções lógicas

» Álgebra booleana

» Circuitos digitais

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Conhecer as principais portas lógicas utilizadas na construção


dos circuitos digitais básicos.

» Construir circuitos digitais combinatórios utilizando tabela


verdade e vice versa.

74
Infraestrutura de Hardware

Capítulo 3 – Lógica Digital

Vamos conversar sobre o assunto?

Você já parou para pensar como são projetados e construídos os


componentes básicos que dão inteligência a um computador? Como
são projetados os circuitos integrados digitais?

Esta é uma ciência fascinante e em franca expansão, e que está


na base de todo o desenvolvimento tecnológico que vivenciamos em
nosso dia a dia. Desde um simples relógio de pulso até ao computador
mais avançado, tudo o que nos rodeia está repleto de lógica digital.

A expressão “Lógica Digital” traz consigo duas definições


carregadas de significado:

► Lógica: O temo Lógica é comumente definido como sendo a


ciência das leis do pensamento, ou ainda, a disciplina que se
dedica ao estudo das regras que permitem tornar o pensamento
válido.

► Digital: O termo digital se refere a representação da informação


através de dois estados ou símbolos lógicos básicos, o falso
e o verdadeiro, o zero e o um. Quando dizemos que um
determinado sistema é digital, em outras palavras estamos
dizendo que seu funcionamento é baseado nestes dois estados
ou símbolos lógicos básicos: o zero e o um.

Desta forma, podemos entender a lógica digital como sendo a


tecnologia que nos permite modelar a informação e o raciocínio lógico
através de zeros e uns.
Saiba Mais
A lógica digital que iremos trabalhar é baseada em uma área
especial da matemática conhecida como álgebra de Boole, ou George Boole
Álgebra Booleana. foi um Cientista
Alemão do século
19 considerado
A álgebra booleana é muito parecida com a álgebra que aprendemos o pai da lógica
na escola, a qual está baseada em operadores e/ou funções com a matemática.

única diferença que na álgebra booleana, independente da função que


você esteja utilizando, tanto os valores de entrada como o resultado
obtido serão sempre zeros e uns.

75
Infraestrutura de Hardware

Na lógica digital, a informação é processada através de equações


ou funções booleanas, as quais são implementadas através de
circuitos especiais conhecidos como portas lógicas.

Uma porta lógica nada mais é que um circuito eletrônico que


implementa a funcionalidade definida por uma função booleana.
Desta forma, cada porta lógica recebe o nome da função lógica que
implementa.

Interessante, não é mesmo? Pois se prepare, a nossa aventura


está só começando. Vamos começar estudando as principais portas
lógicas e suas funcionalidades, em seguida, vamos aprender como
utilizar estas portas lógicas para construir nossos próprios circuitos
lógicos mais complexos.

3.1 Portas Lógicas e Funções Lógicas


Básicas

Quando o famoso matemático inglês George Boole, publicou


as bases de sua teoria em 1854, em um trabalho intitulado “An
Investigation of the Laws of Thought on Which to Found the
Mathematical Theories of Logic and Probabilities”, os computadores
digitais ainda nem pensavam em existir. Entretanto, foi o trabalho
deste matemático brilhante que serviu de alicerce de tudo o que hoje
conhecemos como lógica digital.

Em seu trabalho, Boole definiu 3 funções lógicas essenciais, a


partir das quais derivaram-se todas as outras. São elas:
Lembrete
» A função And, que define que uma resposta só será verdadeira
Lembre-se que,
por convenção, se, e somente se, todas as suas entradas forem verdadeiras.
em lógica digital
a informação » A função Or, que define que uma resposta só será verdadeira
verdadeira está
associada ao se ao menos uma das sua entradas for verdadeira
nível 1 e a falsa ao
nível 0. » A função Not, que possui apenas uma entrada e uma saída, e
que define que a resposta só será verdadeira se e somente se
a sua entrada for falsa.

A partir destas três funções lógicas, foram definidas mais


três funções lógicas básicas as quais também são utilizadas
como elementos básicos para a criação de circuitos lógicos mais
complexos:

» A função lógica XOR, que possui duas entradas e uma saída e

76
Infraestrutura de Hardware

que em português poderia ser traduzida como “ou exclusivo”, a


qual define que uma resposta só será verdadeira se, e somente
se, uma das entradas for verdadeira e a outra falsa.

» A função lógica Nand, formada a partir da associação da função


lógica And seguida da função lógica Not, que define que uma
resposta só será verdadeira se e somente se todas as suas
entradas forem falsas

» A função lógica Nor, formada a partir da associação da função


lógica Or seguida da função lógica Not, que define que uma
resposta só será verdadeira se ao menos uma das suas
entradas for falsa.

A fim de permitir a representação da funcionalidade esperada de


um circuito baseado em lógica digital, cada função/porta lógica possui
um símbolo esquemático, ou diagrama, e um símbolo matemático,
também conhecido como equação booleana, associado.

Apesar de utilizar operadores semelhantes aos utilizados nas


equações aritméticas, as operações descritas pelas equações
booleanas são em essência operações lógicas. Por este motivo,
devemos tomar muito cuidado para não nos confundir no momento de
avaliar uma equação booleana.

Além do símbolo esquemático e do símbolo matemático, cada porta


lógica possui também uma tabela que descreve a sua funcionalidade,
conhecida como Tabela Verdade. A Tabela Verdade é uma tabela na
qual estão listadas todas as possíveis configurações para os sinais
de entrada e a saída produzida para cada uma destas configurações
pela porta lógica associada.

A Figura 1 a seguir nos traz os símbolos matemático e gráfico e os


nomes associados às seis principais funções lógicas que acabamos
de apresentar.

77
Infraestrutura de Hardware

Figura 1 – Portas Lógicas básicas e seus símbolos graficos e matemáticos

Agora que já fomos apresentados às principais portas lógicas,


seus símbolos gráficos e equações booleanas, que tal estudarmos
um pouco mais detalhadamente cada uma destas portas e entender
como elas funcionam a partir da análise das suas Tabelas Verdades.

3.2 Portas Lógicas

Porta Lógica And

Nas Figuras 2 e 3 a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associada a porta lógica And.

Figura 2 – Símbolo gráfico e equação booleana associados à porta lógica And

78
Infraestrutura de Hardware

Entradas Saída

A B X

0 0 0

0 1 0

1 0 0

1 1 1

Figura 3 – Tabela Verdade associada a porta lógica And

Observe a tabela verdade, veja que esta reflete o que dissemos


a princípio, que a porta ógica And fornece uma resposta verdadeira,
ou “1”, se e somente se, todas as suas entradas forem verdadeiras.
Muito Simples não é mesmo?

Lembre-se que nós podemos tanto utilizar a equação booleana,


o diagrama esquemático ou a própria função lógica para definir que
estamos querendo utilizar esta função lógica em nosso sistema,
conforme podemos ver pela Figura 4 a seguir.

Figura 4 – Três formas equivalentes de representar a função lógica AND

Porta Lógica Or

Nas Figuras 5 e 6, a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associadas a porta lógica Or.

Figura 5 – Símbolo gráfico associado à porta lógica Or

79
Infraestrutura de Hardware

Entradas Saída

A B X

0 0 0

0 1 1

1 0 1

1 1 1

Figura 6 – Tabela Verdade associada a porta lógica Or

Observe agora a tabela verdade da função Or. Veja que, conforme


dissemos a princípio, que a porta lógica Or fornece uma resposta
verdadeira, ou “1”, se ao menos uma das suas entradas forem
verdadeiras.

Novamente, lembre-se que nós podemos tanto utilizar a equação


booleana, o diagrama esquemático ou a própria função lógica para
definir que estamos querendo utilizar esta função lógica em nosso
sistema, conforme podemos ver pela Figura 7 a seguir.

Figura 7 – Três formas equivalentes de representar a função lógica OR

Porta Lógica Not

Nas Figuras 8 e 9, a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associada a porta lógica Not. Observe
a “bolinha” utilizada a saída da porta lógica para indicar a inversão
ou “negação” do sinal de entrada. Esta “bolinha” é sempre utilizada
quando queremos indicar que vai ocorrer uma inversão no sinal,
transformando um em zero e vice-versa.

Figura 8 – Símbolo gráfico associado à porta lógica Not, com destaque para o símbolo
utilizado para indicar a inversão ou “negação” do sinal de entrada.

80
Infraestrutura de Hardware

Entrada Saída

A X

0 1

1 0

Figura 9 – Tabela Verdade associada a porta lógica Not

Esta é, sem dúvida, a função lógica mais simples de todas. Se


entra um sai zero e se entra zero sai um. Fácil demais, você não
acha?

Diferentemente das outras funções lógicas, a função Not possui 4


formas de ser representada. Acompanhe na Figura 10 a seguir.

Figura 10 – Quatro formas equivalentes de representar a função lógica Not

Lembrete

Conforme dissemos a princípio, as três outras portas lógicas que


apresentaremos agora foram formadas a partir de associações das
três primeiras portas lógicas apresentadas. Desta forma, é importante
lembrar que as suas funcionalidades são expressão da sobreposição das
funcionalidades das outras portas lógicas utilizadas.

Porta Lógica Nand

Nas Figuras 11 e 12, a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associada a porta lógica Nand.

Figura 11 – Símbolo gráfico e equação booleana associados à porta lógica Nand

81
Infraestrutura de Hardware

Entradas Saída

A B X

0 0 1

0 1 1

1 0 1

1 1 0

Figura 12 – Tabela Verdade associada a porta lógica Nand

É importante que percebamos que a porta Nand foi construída


a partir de uma porta And associada a uma porta Not, conforme
podemos ver na Figura 13 a seguir.

Figura 13 – Modelo esquemático de construção da Porta Nand e da sua Tabela Verdade

Observe que a tabela verdade associada a uma porta lógica indica


apenas as suas entradas e saídas “visíveis”, ou seja, seguindo o
exemplo da porta Nand, resultados intermediários obtidos por portas
lógicas utilizadas internamente não são listados, conforme ocorreu
com o sinal X´.

Lembre-se que nós podemos tanto utilizar a equação booleana,


o diagrama esquemático ou a própria função lógica para definir que
estamos querendo utilizar esta função lógica em nosso sistema,
conforme podemos ver pela Figura 14 a seguir.

Figura 14 – Três formas equivalentes de representar a função lógica NAND

82
Infraestrutura de Hardware

Porta Lógica Nor

Nas Figuras 15 e 16, a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associada a porta lógica Or.

Figura 15 – Símbolo gráfico e equação booleana associados à porta lógica Nor

Entradas Saída

A B X

0 0 1

0 1 0

1 0 0

1 1 0

Figura 16 – Tabela Verdade associada a porta lógica Nor

Novamente, conforme fizemos com a porta Nand, vamos agora


apresentar o esquema interno da porta Nor.

Figura 17 – Modelo esquemático de construção da Porta Nor e da sua Tabela Verdade

Por fim, temos as três formas pelas quais podemos representar


uma porta lógica Nor.

83
Infraestrutura de Hardware

Figura 18 – Três formas equivalentes de representar a função lógica Nor

Porta Lógica Xor

Nas Figuras 19 e 20, a seguir, temos o símbolo gráfico, a equação


booleana e a tabela verdade associada a porta lógica Xor.

Figura 19 – Símbolo gráfico e equação booleana associados à porta lógica Xor

Entradas Saída

A B X

0 0 0

0 1 1

1 0 1

1 1 0

Figura 20 – Tabela Verdade associada a porta lógica Xor

Devido à sua funcionalidade, a porta Xor possui um esquema


interno um pouco mais complexo que os das portas Nand e Nor.
Observe a Figura 21 a seguir.

Como você pode perceber, a construção de uma porta Xor exige


2 portas Not, 2 portas And e uma porta Or. A tabela verdade destaca
do seu lado esquerdo todos os possíveis valores de entrada e na
sua última coluna, à direta, todos os valores de saída. Nas colunas
marcadas como etapas intermediárias temos as possíveis entradas e
saídas das portas utilizadas internamente na construção da porta Xor.
Observe que, segundo a tabela verdade tanto da Figura 12 quanto da
Figura 13, a porta Xor só fornece um a sua saída se, e somente se,
uma das entradas for um e a outra zero.

84
Infraestrutura de Hardware

Figura 21 – Modelo esquemático de construção da Porta Xor e da sua Tabela Verdade

Por fim, temos as três formas pelas quais podemos representar


uma porta lógica Xor.

Figura 22 – Três formas equivalentes de representar a função lógica Xor

Agora que já conhecemos as portas lógicas básicas, suas


funcionalidades, seus diagramas esquemáticos e suas equações
booleanas, podemos nos aventurar e ir um pouco mais longe,
podemos começar a pensar em projetar nossos próprios circuitos
lógicos digitais.

3.3 Circuitos Digitais

Assim como as portas lógicas, os circuitos digitais são circuitos


eletrônicos projetados com o intuito de efetuar uma função, ou
equação, booleana específica. Desta forma, os circuitos digitais
também possuem um diagrama esquemático, uma equação booleana

85
Infraestrutura de Hardware

e uma tabela verdade associada.

Como qualquer projeto de engenharia, o projeto de um circuito


digital exige que se adote uma metodologia pré-definida de forma a
poder garantir o melhor resultado dispendendo o mínimo de recursos
e esforços possíveis.

Desta forma, a fim de atingir estes objetivos, em cada um dos


nossos projetos, seguiremos o passo a passo listado a seguir:

1. Analisar atentamente as funcionalidades esperadas do circuito a ser


implementado, buscando identificar e eliminar possíveis redundâncias que, se
removidas, possam simplificar o circuito a ser implementado.

2. Identificar e listar de maneira agrupada todos os sinais de entrada e saída do


circuito

3. Definir a tabela verdade equivalente a funcionalidade esperada.

4. A partir da tabela verdade, deduzir a equação booleana geral do circuito.

5. Implementar um circuito digital que atenda a equação booleana encontrada,


substituindo as expressões presentes na equação booleana por suas portas
lógicas equivalentes.

Vamos começar com um pequeno exemplo. Vamos projetar um


circuito com uma entrada binária com 3 bit e uma saída com 1 bit.
De tal forma que este seja capaz de identificar se o valor aplicado
a entrada é par, ou seja, que sinalize esta ocorrência colocando 1 a
saída quando o valor aplicado à entrada for par e 0 quando for ímpar.

Aplicando a metodologia proposta temos:

1. Analisando a funcionalidade esperada do circuito, podemos


constatar que não existem redundâncias e inconsistências ou
incoerências.

2. Como determinado em sua especificação, nosso circuito terá 3


bits de entrada que denominaremos de B0, B1 e B2 e um bit de
saída que denominaremos simplesmente de Y.

3. Na Figura 24 temos a tabela verdade do nosso circuito. Observe


que nossa tabela é exatamente igual as das portas lógicas
que estudamos. Temos um grupo de colunas representado os
sinais de entrada e uma coluna representando o sinal de saída.
Nesta tabela verdade, apenas para facilitar o acompanhamento
das funcionalidades esperadas, foi incluída uma coluna a mais,
a coluna N, com o valor decimal representado pelos 3 bits de

86
Infraestrutura de Hardware

entrada(B2,B1 e B0). Verifique que, conforme definido nas


funcionalidades do circuito, a coluna Y é 1 sempre que o valor
indicado na coluna N é par. Como estamos querendo identificar
quando o valor da entrada é par, nosso sinal Y é válido, ou seja,
é 1, justamente quando o valor aplicado à entrada for 0, 2, 4
ou 6.

Figura 23 – Diagrama esquemático e tabela verdade do circuito digital que sinaliza quando o
valor aplicado ás entradas é par

Continuando, precisamos agora deduzir a equação booleana


correspondente a funcionalidade esperada. Observe a Figura 24 a
seguir.

Figura 24 – Levantamento das Equações booleanas parciais, por linhas, do circuito dado

Veja que primeiramente construímos as equações booleanas


parciais, uma para cada linha da tabela verdade onde Y =1. Nosso
objetivo ao descrever estas equações booleanas parciais é identificar
as condições de entrada que tornam a nossa saída válida.

87
Infraestrutura de Hardware

Observe ainda que, como cada equação booleana parcial é


baseada apenas nos sinais de entrada e nos funções booleanas
básicas, precisamos adotar algum artifício para sinalizar quando
o sinal da entrada é válido em um ou zero, uma vez que queremos
indicar claramente a condição encontrada na tabela verdade que nos
gerou uma saída válida.

Desta forma, a fim de fazer esta distinção, sempre que um sinal


é válido em um, ou seja, sempre que este deve ter seu valor igual a
um para gerar uma saída válida, simplesmente anotamos o nome do
próprio sinal na equação booleana, caso contrário, ou seja, quando
este deve ter o valor igual a zero para gerar uma saída válida,
anotamos o sinal com uma barra sobre o seu nome.

Observe a primeira linha da nossa tabela verdade. Veja que temos


Y=1 quando B2=0, B1=0 e B0=0. Ou seja, que Y é igual a um quando
a entrada B2 e a entrada B1 e a entrada B0 forem zero. Observe que
as conjunções e que utilizamos podem ser substituídas por funções
booleanas and, a qual nos dá uma resposta verdadeira, igual a 1,
quando todas as suas entradas forem verdadeiras. Desta forma,
a nossa equação booleana parcial fica conforme podemos ver na
primeira linha da nossa tabela verdade.

As demais linhas válidas da tabela verdade seguem o mesmo


raciocínio.

Terminado o levantamento das equações parciais, precisamos


definir a equação booleana geral do nosso circuito. Para tanto, basta
observarmos que o nosso circuito deve fazer Y=1se ocorrer qualquer
uma das quatro condições que foram identificadas. Em outras
palavras, Y será igual a um se ocorrer a primeira ou a segunda ou a
terceira ou a quarta condição identificada. Como as expressões ou
aqui utilizadas equivalem a função booleana Or, podemos construir
nossa equação booleana geral simplesmente contectando todas
as nossa equações parciais já encontradas através destas funções
booleanas Or. Observe a Figura 25 a seguir.

Por fim, nos falta apenas construir um circuito que implemente a


equação que acabamos de levantar.

88
Infraestrutura de Hardware

Figura 25 – Construção da Equação Booleana Geral do Circuito

Figura 26 – Conversão da Equação Booleana Geral em portas lógicas equivalentes

Como podemos ver pela Figura 26, analisando a equação geral


do circuito, fica fácil perceber que podemos converter cada parte da
nossa equação geral em portas lógicas básicas. Primeiramente, cada
equação parcial deve ser convertida em uma porta And com tantas
entradas quantas forem as entradas do circuito, em seguida, deve-se
interligar as saídas de cada uma destas portas And através de uma
porta Or com tantas entradas quantas forem as equações parciais do
circuito. A Figura 27, a seguir, nos traz o esquema elétrico final do
circuito digital proposto.

Um pouco trabalhoso mais muito interessante não é mesmo? Saiba


que por simples que possa parecer esta ainda é uma das técnicas
mais utilizadas para o desenvolvimento de circuitos digitais simples.

Existem técnicas mais avançadas de projeto, que permitem a partir


do resultado obtido com a técnica aqui apresentada otimizar tanto a

89
Infraestrutura de Hardware

equação booleana quanto o circuito elétrico final obtido, mas estas


técnicas fogem ao escopo de nossa disciplina.

Figura 27 – Circuito digital que implementa a função de identificar se um valor binário


aplicado às entradas B2, B1 e B0 é par

Que tal exercitar um pouco mais implementando um outro circuito?


Desta vez vamos projetar um circuito que identifique quando o valor
aplicado à entrada é divisível por 3.

Para não tomar muito tempo, vamos apenas apresentar as fases


do projeto, cabe a você chegar às conclusões já apresentadas.

Figura 28 – Tabela Verdade, equações parciais e equação geral do circuito que identifica
quando a entrada é divisível por 3

90
Infraestrutura de Hardware

Figura 29 – Circuito digital que identifica quando a entrada é divisível por 3

Muito fácil, não é mesmo?

Estes circuitos que acabamos de implementar são conhecidos


como circuitos combinacionais, uma vez que sua resposta depende
exclusivamente de uma combinação adequada de valores de entrada
e nada mais.

Por outro lado, existe também outra classe de circuitos conhecidos


como circuitos sequenciais.

Os circuitos sequenciais são aqueles que alteram a sua resposta


aos valores de entrada a depender do momento em que estes valores
ocorrem.

Como sua resposta depende não apenas dos valores de entrada,


mas também do momento em que estes ocorrem, estes circuitos
possuem alguns sinais extras que servem para sincronizar sua
operação com os outros circuitos que o cercam. Dentre estes sinais
temos o sinal de Reset, que serve para inicializar a lógica interna do
circuito, e o sinal de clock, ou sinal de relógio,que permite ao circuito
contar o tempo decorrido entre a ocorrência de padrões de sinais de
entrada de tal forma a permitir a sua correta identificação.

Podemos ver os circuitos sequenciais como uma “evolução” dos


circuitos combinacionais, uma vez que estes devem não apenas
responder corretamente a determinados padrões de sinais de entrada,

91
Infraestrutura de Hardware

mas também avaliar corretamente o momento em que estes sinais


ocorrem.

Os sistemas computacionais, sejam eles complexos como um


computador de grande porte, ou simples, como um chip de celular,
todos eles podem ser descritos como circuitos sequenciais.

Mais tarde quando estudarmos os diversos circuitos presentes na


arquitetura de um computador voltaremos a nos referir aos circuitos
sequenciais e sua aplicações.

Por enquanto, ficaremos por aqui.

Não deixe de verificar os exercícios resolvidos e tentar resolver os


exercícios propostos no seu caderno de exercícios.

Aprenda Praticando

Agora que você já aprendeu a teoria e já viu como resolver os


exercícios com os exemplos apresentados, chegou a hora de praticar
resolvendo os exercícios da seção 3 do caderno de exercícios.

Lembre-se, é de suma importância que você tente resolver sozinho


todos os exercícios apresentados. Se tiver alguma dúvida, volte e
refaça os exemplos apresentados neste capítulo. Se ainda assim você
não conseguir resolver algum exercício, peça ajuda ao tutor.

Atividades e Orientações de Estudo

Dedique, pelo menos, 5 horas de estudo para o Capítulo 3. Você


precisa praticar bastante esse conteúdo apresentado no último
capítulo, pois requer bastante treino. Organize uma metodologia de
estudo que inicie com a leitura dos conceitos e seja seguida pela
resolução de exercícios.

Você poderá esclarecer suas dúvidas com o professor e os tutores


utilizando os chats e os fóruns tira-dúvidas no ambiente virtual de seu
curso.

Não esqueça de ler atentamente o guia de estudo da disciplina,

92
Infraestrutura de Hardware

pois nele você encontrará a divisão de conteúdo semanal, ajudando-o


a dividir e administrar o seu tempo de estudo semanal. Lembre-se
que as atividades somativas propostas pelo professor no ambiente
virtual são importantes para o aprendizado e para a composição da
sua nota. Observe os prazos estabelecidos pelo seu professor para
essas atividades virtuais.

Vamos Revisar?

Neste capítulo nós aprendemos um pouco sobre Lógica Digital.


Descobrimos que a Lógica Digital está baseada na Álgebra de Boole,
a qual possui três Funções Lógicas Essenciais, as funções And, Or e
Not e que a partir destas foram definidas mais três Funções Lógicas
Básicas, as funções Nand, Nor, e Xor. Descobrimos também que as
portas lógicas são circuitos eletrônicos que implementam as funções
lógicas, e que cada porta lógica possui um símbolo esquemático, uma
equação booleana e uma Tabela Verdade associada.

Neste capítulo nós aprendemos ainda também uma metodologia


de projeto que nos permite construir Circuitos Lógicos Combinacionais
utilizando apenas as seis portas lógicas básicas. Segundo a
metodologia apresentada nosso projeto se divide em três etapas
básicas: construir uma Tabela Verdade que expresse a funcionalidade
esperada do circuito, deduzir as equações booleanas parciais e a
equação booleana geral do circuito e por fim transformar a equação
booleana geral encontrada em um circuito lógico combinacional
substituindo os operadores lógicos utilizados por portas lógicas
equivalentes.

93
Infraestrutura de Hardware

Considerações Finais

Olá, Cursista!

Esperamos que você tenha aproveitado este primeiro módulo


da disciplina Infraestrutura de Hardware. No próximo módulo,
continuaremos estudando o subsistema de processamento e daremos
início ao estudo das estruturas de interconexão, popularmente
conhecidos por barramentos.

Aguardamos sua participação no próximo módulo.

Até lá e bons estudos!

Juliana Regueira Basto Diniz


Abner Correa Barros

Professores Autores

94
Infraestrutura de Hardware

Referências

STALLINGS, William. Arquitetura e Organização de


Computadores. 5. ed.

PATTERSON, D. A. e Hennessy, John L. Organização e


Projeto de Computadores. LTC, 2000.

TANENBAUM, Andrew S. Organização Estruturada de


Computadores. 4. ed. Tradução Helio Sobrinho. Rio de Janeiro:
Prentice-Hall, 2001.

95
Infraestrutura de Hardware

Conheça os Autores

Juliana Regueira Basto Diniz

Possui graduação em engenharia eletrônica pela Universidade


Federal de Pernambuco, mestrado e doutorado em Ciência
da Computação pela Universidade Federal de Pernambuco.
Atualmente é professora da Universidade Federal Rural de
Pernambuco (UFRPE), desenvolvendo trabalhos no grupo
de Educação a Distância desta universidade. Seus temas de
interesse em pesquisa são: Sistemas Distribuídos, Computação
Ubíqua e Ensino a Distância.

Abner Corrêa Barros

É mestre em Ciência da Computação com foco em Engenharia


de Hardware pelo Centro de Informática da Universidade Federal
de Pernambuco. Possui graduação em Ciência da Computação
pela mesma universidade. Atualmente é professor da disciplina
de Organização e Arquitetura de Computadores da Faculdade
Maurício de Nassau e Engenheiro de Hardware da Fundação
de Apoio ao Desenvolvimento da UFPE (FADE), atuando
em um projeto de convênio entre o Centro de Informática da
UFPE e a Petrobrás. Suas áreas de interesse e pesquisa são:
Hardware Reconfigurável, Arquitetura de Cores Aritméticos e
Computação de Alto Desempenho em Field-Programmable
Gate Array (FPGA).

96
Infraestrutura de Hardware

Juliana Regueira Basto Diniz


Abner Corrêa Barros

Volume 2

Recife, 2009
Universidade Federal Rural de Pernambuco

Reitor: Prof. Valmar Corrêa de Andrade


Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski
Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire
Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos

Produção Gráfica e Editorial


Capa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim, Gláucia Micaele
Revisão Ortográfica: Marcelo Melo
Ilustrações: Abner Barros, Allyson Vila Nova, Diego Almeida e Moisés de Souza
Coordenação de Produção: Marizete Silva Santos
Sumário

Apresentação....................................................................................................4

Conhecendo o Volume 2..................................................................................5

Capítulo 1 – Evolução das Arquiteturas.........................................................7

Capítulo 2 – Unidade de Controle e Caminho de Dados.............................15

Capítulo 3 – Ciclo de Execução e Interrupções...........................................69

Capítulo 4 – Estruturas de Interconexão......................................................82

Considerações Finais...................................................................................102

Conheça os Autores.....................................................................................104
Apresentação

Caro(a) Cursista,

Estamos, neste momento, iniciando o segundo volume do livro da disciplina de


Infraestrutura de Hardware. Neste volume, iremos discutir um pouco sobre a evolução
das arquiteturas dos processadores, bem como aspectos referentes ao processamento
de dados e de controle. Também discutiremos sobre o ciclo de execução com e sem o
uso de interrupções.

Por fim, apresentaremos os barramentos ou as estruturas de interconexão que


servem para interligar todos os dispositivos periféricos às partes básicas do computador,
tais como memória e CPU. Estudaremos os princípios básicos de funcionamento,
os métodos de arbitragem, as hierarquias e alguns principais padrões comerciais de
barramentos.

Bons estudos!

Juliana Regueira Basto Diniz


Abner Barros

Professores Autores
Conhecendo o Volume 2

Neste segundo volume, você irá encontrar os conteúdos referentes ao módulo 02 da


disciplina Infraestrutura de Hardware. Para facilitar seus estudos, veja os conteúdos
encontrados neste volume.

Módulo 2 – Subsistema de Processamento Central

Carga horária: 15h

Objetivo Principal do Módulo 2:

» Apresentar a evolução das arquiteturas dos processadores, bem como aspectos


referentes ao processamento de dados e de controle. Em seguida, iremos discutir
sobre o ciclo de execução com e sem o uso de interrupções e apresentar os
barramentos ou as estruturas de interconexão que servem para interligar todos
os dispositivos periféricos às partes básicas do computador, tais como memória e
CPU.

Conteúdo Programático do Módulo 02:

» Evolução das Arquiteturas.

» Processador: Controle e Dados.

» Interrupções

» Estruturas de Interconexão: Barramentos


Infraestrutura de Hardware

Capítulo 1

O que vamos estudar?

Neste capítulo, vamos estudar o seguinte tema:

» Evolução das arquiteturas dos processadores

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Compreender as diferenças entre arquiteturas RISC e CISC;

» Compreender a evolução das arquiteturas sob o ponto de vista


tecnológico;

» Entender conceitos fundamentais associados às arquiteturas


dos processadores.

6
Infraestrutura de Hardware

Capítulo 1 – Evolução das


Arquiteturas

Vamos conversar sobre o assunto?

Você sabe o que é multiprogramação? Mesmo que você nunca


tenha ouvido falar em multiprogramação, você certamente perceberia
se o seu sistema operacional não empregasse essa técnica, pois
você nunca poderia abrir várias janelas de aplicativos numa mesma
sessão. Multiprogramação é uma tentativa de manter o processador
sempre ocupado com a execução de um ou mais programas por vez.
Com a multiprogramação, diversos programas são carregados para
a memória e o processador comuta rapidamente de um para o outro.
Essa técnica permite que o processador não passe por períodos
de ociosidade, à espera de respostas oriundas de programas em
execução, permitindo otimizações e melhorias de desempenho de
processamento. O multiprocessamento, por sua vez, caracteriza-se
pelo uso de vários processadores que atuam em paralelo, cada um
executando as suas tarefas

Para garantir melhor desempenho, ainda é possível que


os processadores atuais utilizem multiprocessamento com
multiprogramação, que é a junção dos conceitos, onde mais
de um processador é utilizado e cada um deles implementa a
multiprogramação, permitindo efetivamente que programas sejam
executados paralelarmente. Os computadores pessoais evoluíram com
processadores que implementam a multiprogramação e comportam o
multiprocessamento.

Neste capítulo, vamos conversar sobre a evolução das arquiteturas


de processadores e para tal, falaremos de alguns conceitos
que favorecem melhoria de desempenho aos processadores. A
multiprogramação, como citamos, é um exemplo disso.

1.1 RISC versus CISC

As primeiras máquinas eram extremamente simples com poucas


instruções, até que surgiu a microprogramação, favorecendo o uso de

7
Infraestrutura de Hardware

um conjunto complexo de instruções, conhecidas como instruções de


máquina.

Daí surgiram as primeiras máquinas que seguiam a arquitetura


CISC (Complex Instruction Set Computer), que traduzindo para o
português seria Computador com Conjunto Complexo de Instruções.

Mas você sabe o que significa microprogramação? É um recurso


que permite que um conjunto de códigos de instruções sejam
gravados no processador, possibilitando-o a receber as instruções
dos programas e executá-las utilizando as instruções gravadas na
sua microprogramação.

No início da década de 80, havia uma tendência em construir


processadores com conjuntos de instruções cada vez mais complexos,
entretanto nem todos os fabricantes seguiram essa tendência,
tomando o caminho inverso no sentido de produção de processadores
de alta performance. A filosofia RISC (Reduced Instruction Set
Computer) vai de encontro à maneira de pensar sobre arquiteturas
de computadores. Segundo seus defensores, os processadores CISC
estavam ficando complicados. Assim, surgiu a arquitetura RISC, que
traduzindo para o português, significa Computador com Conjunto
Reduzido de Instruções.

A arquitetura RISC surgiu com o objetivo de otimizar a performance


dos computadores e foi construída com base em alguns princípios
fundamentais que permitiram otimizações de desempenho. São elas:
execução de uma instrução por ciclo, conjunto reduzido de instruções,
grande número de registradores, instruções com formato fixo, poucos
modos de endereçamentos e implementação similar a uma linha de
montagem (pipeline).

Mas o que vem a ser um Pipeline? Um pipeline é composto por


uma série de estágios (operando possivelmente em paralelo) onde
uma parte do trabalho é feito em cada estágio, com funcionamento
similar a uma linha de montagem. Sendo assim, o trabalho não está
concluído até que tenha passado por todos os estágios.

A Figura 1 apresenta uma operação simples e rotineira como lavar


roupas para exemplificar o funcionamento de um pipeline. Existem 4
estágios na lavagem de roupas representados por 4 diferentes ícones
na figura.

O primeiro estágio refere-se à lavagem propriamente dita. O

8
Infraestrutura de Hardware

segundo estágio é a centrifugação, enquanto que o terceiro é a


secagem. O último estágio refere-se às ações de engomar e guardar
a roupa.

Na parte superior da figura, observa-se 4 tarefas (A, B, C e D).


Cada tarefa envolve a operação de lavar roupas e acontecem de forma
sequencial, sem a execução no pipeline. A parte inferior da figura se
observa a execução das mesmas tarefas, se utilizando um pipeline.

Na escala temporal (eixo horizontal superior), observa-se que as


mesmas tarefas quando executadas em um pipeline, terminam muito
antes do que elas terminariam caso não fosse utilizado o pipeline. Isso
acontece porque enquanto uma tarefa está na fase da lavagem, a
outra está na fase da centrifugação, outra na fase da secagem e assim
sucessivamente. A cada instante, cada estágio do pipeline executa
uma determinada tarefa dando a ideia de paralelismo das ações e
garantindo que o tempo de execução seja reduzido, permitindo ganhos
em termos de desempenho.

Figura 1 – Exemplo de um Pipeline para Lavar Roupas

Agora que você já tem ideia do que é um pipeline sobre o contexto


simplificado de uma atividade rotineira, como lavar roupas, vamos
trazê-lo para o contexto computacional. Suponha que o pipeline
possua 5 estágios: busca instrução, execução, decodifica instrução,

9
Infraestrutura de Hardware

acesso a dados externos e escrita de resultados. O fluxo de dados


nesse pipeline está representado na Figura 2.

Figura 2 – Estágios do Pipeline

Um programa contendo 10 instruções, por exemplo, será executado


por esta CPU e entrará nesse pipeline. Vamos numerar as instruções
do programa de 1 a 10 e considerar que apenas as instruções de
número 3 e 7 fazem referência à memória. As demais instruções
passam apenas pelos 2 primeiros estágios do pipeline. Vamos
considerar que a primeira linha da tabela 1 refere-se ao número de
ciclos. Um ciclo é um período de tempo que uma instrução leva em
um determinado estágio do pipeline.

Observando a Tabela 1, podemos dizer que no ciclo 1, a Instrução


1 é buscada. No ciclo 2, a Instrução 2 é buscada e a Instrução 1 é
executada. No ciclo 3, a Instrução 3 (representada pela letra L) é
buscada, a Instrução 2 é executada e a Instrução 1 finalizou. No
ciclo 4, a Instrução 3 (L) é executada, mas não pode ser completada
em um ciclo, pois faz referência à memória. No ciclo 5, a Instrução
4 é executada, embora o LOAD iniciado no ciclo anterior não tenha
terminado. Isso pode acontecer, desde que a instrução 4 não tente
utilizar o registrador no processo de ser carregado.

É de responsabilidade do compilador garantir que a instrução


depois de um LOAD não utilize o item que está sendo buscado na
memória. Se o compilador não puder encontrar nenhuma instrução
para colocar depois do LOAD, ele sempre pode inserir uma instrução

10
Infraestrutura de Hardware

NO-OP e desperdiçar um ciclo. Vale a pena ressaltar que LOAD/


STORE são as únicas instruções que podem ser atrasadas.

Tabela 1 – Execução de um Programa com 10 instruções

Os processadores RISC, ao contrário dos CISC (possuem muitos


modos de endereçamento), apresentam apenas o endereçamento por
registrador. A consequência imediata é que as instruções não fazem
acessos à memória, sendo, portanto, executadas em um único ciclo.
Assim, apenas duas instruções, LOAD e STORE, acessam a memória.
Tais instruções, em geral, não podem ser completadas em um ciclo
conforme observamos com a inserção de recursos como pipeline.

Outro aspecto que diferencia os processadores CISC dos RISC é


o número de registradores. Os registradores são memórias internas à
CPU e por esse motivo possuem acesso mais rápido. Aumentando-
se o número de registradores disponíveis no processador, aumenta-
se o desempenho, já que mais dados estarão disponibilizados em
memórias internas à CPU.

A arquitetura RISC foi amplamente difundida em estações de


trabalho SPARC lançadas pela SUN Microsystems no final da década
de 80. A arquitetura CISC foi empregada nos primeiros chips x86. Com
o passar do tempo e com a evolução dos processadores a distinção
entre CISC e RISC foi se tornando menos notável. Os processadores
da Intel a partir do Pentium Pro passaram a executar um conjunto
de instruções simples, tal como a filosofia RISC e novas instruções
foram surgindo tornando esse conjunto de instrução não tão reduzido,
aproximando alguns processadores RISC da filosofia CISC.

Essa tendência de aumento na complexidade também levou os


processadores Power PC, que foram concebidos na arquitetura RISC,
a agregar um número maior de instruções, aproximando-se, portanto,
da arquitetura CISC.

11
Infraestrutura de Hardware

Atividades e Orientações de Estudo

Dedique, pelo menos, 1 hora de estudo para este primeiro capítulo.


Você deve organizar uma metodologia de estudo que envolva a leitura
dos conceitos que serão ditos apresentados neste volume e pesquisas
sobre o tema, usando a Internet e livros de referência.

Utilize os fóruns temáticos e os chats desta disciplina para troca


de informações sobre o conteúdo no ambiente virtual, pois a interação
com colegas, tutores e o professor da disciplina irá ajudá-lo a refletir
sobre aspectos fundamentais tratados aqui.

Também é importante que você leia atentamente o guia de estudo


da disciplina, pois nele você encontrará a divisão de conteúdo
semanal, ajudando-o a dividir e administrar o seu tempo de estudo
semanal. Procure responder as atividades propostas como atividades
somativas para este capítulo, dentro dos prazos estabelecidos pelo
seu professor, pois você não será avaliado apenas pelas atividades
presenciais, mas também pelas virtuais.

Vamos Revisar?

Observamos neste capítulo a evolução das arquiteturas de


computadores. Você pôde notar que inicialmente os processadores
eram bastante simples com poucas instruções e modos de
endereçamento. O acesso à memória principal era bastante demorado,
o que levava os programas a gastarem mais tempo para a sua
execução. A arquitetura RISC minimizou este problema diminuindo
o número de acessos à memória principal através do uso de apenas
duas instruções que fazem acesso à memória (LOAD e STORE) e
do aumento na quantidade de registradores. Na arquitetura RISC,
o programa é compilado diretamente pelo hardware, o que também
possibilita uma melhoria de desempenho.

Com o passar dos anos, recursos que outrora foram introduzidos


pelo padrão RISC passaram a ser introduzidos nas máquinas CISC
e vice-versa, de modo que ambas as tecnologias passaram a se
aproximar adotando estratégias de sucesso da sua antiga rival.

12
Infraestrutura de Hardware

Aprendemos os fatores que diferenciam as duas arquiteturas e


falamos de recursos empregados pelas arquiteturas modernas como
multiprogramação e pipeline.

No próximo capítulo deste volume, você estudará a unidade de


controle e o caminho de dados, ambos internos à CPU. No capítulo
3, estudaremos o ciclo de execução e as interrupções e no capítulo 4
estudaremos a interconexão da CPU com os demais subsistemas do
computador através da análise dos sistemas de barramentos.

13
Infraestrutura de Hardware

Capítulo 2

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» A arquitetura interna de um processador

» Principais componentes e funcionalidades do processador

» Caminho de Dados

» Estrutura da linguagem de máquina

» Hardware interno do processador MIPS.

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Compreender como um processador funciona, e como ele


é capaz de decodificar e executar as instruções de um
programa.

» Entender também como se dá a conversão de um programa de


uma linguagem de alto-nível para a linguagem de montagem e
desta para a linguagem de máquina do processador.

» Descrever como o processador MIPS executa algumas de suas


principais instruções utilizando os componentes de hardware
presentes na sua arquitetura interna.

14
Infraestrutura de Hardware

Capítulo 2 – Unidade de
Controle e Caminho de Dados

Vamos conversar sobre o assunto?

No início da década de 70 do século passado, um filme de ficção


científica fez história ao prever que em 2001 existiriam computadores
capazes de pensar, agir e interagir com o ser humano por vontade
própria. O filme a que me refiro no Brasil teve o título de 2001: Uma Dica
de Filme
Odisseia no Espaço, e o computador em questão tinha o nome de
HAL 9000. Saiba mais
sobre este
Pois bem, passados aproximadamente 40 anos do lançamento filme em http://
pt.wikipedia.org/
do referido filme, e mais de 70 anos após a construção do primeiro wiki/2001_-_Uma_
odisséia_no_
computador digital, mesmo com todo os avanços que estamos Espaço
vivenciando, com os computadores cada vez mais presentes no dia a
dia de cada um de nós, os computadores ainda não são capazes de
agir e pensar por si mesmo e nem mesmo de se comunicar diretamente
com qualquer um de nós. Ainda dependemos das linguagens de
programação para instruí-los sobre qualquer coisa que queremos que
eles façam. E mais que isto, em essência, em todos estes anos muito
pouca coisa mudou na forma como os computadores “pensam“, em
como as informações são representadas e em como os computadores
processam estas informações. Mesmo assim, para a grande maioria
das pessoas, e por que não dizer para muitos de nós, o funcionamento
de um computador ainda permanece como um dos grandes mistérios
da vida moderna.

Estamos agora começando mais um capítulo desta nossa viagem


pelo interior dos computadores. Neste Capítulo vamos fazer um
passeio pelo que poderíamos chamar de cérebro dos computadores,
pelo interior do seu processador. Vamos buscar entender como um
processador decodifica e executa as instruções contidas em um
programa e como funciona a famosa “linguagem de máquina“, a
língua dos computadores. Você verá que não existe nenhum mistério
por trás de tudo isto, que tudo não passa de uma grande obra de
engenharia de algumas mentes brilhantes do nosso século.

Você já está preparado?

15
Infraestrutura de Hardware

Então, se acomode bem na cadeira, e nos acompanhe em mais


esta viagem.

2.1 O processador, este ilustre desconhecido

Quando pensamos em tudo quanto um computador é capaz de


fazer, em sua capacidade de processar imagens, sons, textos, jogos,
planilhas eletrônicas, navegar na internet e coisas assim, ou ainda na
sua capacidade quase inesgotável de efetuar cálculos de engenharia
e modelar sistemas complexos através da conhecida realidade virtual,
as vezes perdemos de vista que tudo isto não passa de programas
sendo executados pelo processador deste computador.

Por este motivo, o processador é muitas vezes considerado o


cérebro do computador, pois é ele quem decodifica e executa as
instruções presentes nos programas.

De nada adianta termos um computador com uma grande


quantidade de memória, ou com muito espaço de disco, ou ainda com
uma placa mãe de última geração se não tivermos um processador
de qualidade para processar e controlar tudo isto.

Mas como podemos identificar um processador de boa qualidade?


O que diferencia um processador do outro?

Para que possamos responder esta pergunta, precisamos


primeiramente relembrar os principais componentes da arquitetura
interna de um processador. A Figura 1, a seguir, nos traz um modelo
da estrutura interna dos processadores em geral.

Figura 1 – Estrutura interna de um processador

16
Infraestrutura de Hardware

Vejamos para que serve cada uma das partes indicadas na figura.

» Unidade de Controle: É responsável por buscar e decodificar


cada instrução a ser executada. É esta unidade que determina
quando e como as demais unidades funcionais do processador
serão ativadas. É a unidade de controle que, a partir da
decodificação da instrução a ser executada, programa a
operação a ser efetuada pela Unidade Lógica e Aritmética e
acessa os registradores onde estão armazenados os operandos
a serem utilizados.

» Unidade Lógica e Aritmética: A Unidade Lógica e Aritmética,


como o próprio nome sugere, é a unidade responsável por
executar todas as operações lógicas e aritméticas existentes
no programa em execução.

» Banco de Registradores: O Banco de Registradores serve


como uma memória auxiliar de acesso rápido onde devem
ficar armazenadas entre outras coisas as variáveis locais e os
ponteiros do programa em execução.

Observe que não é a Unidade de Controle quem executa as


operações, ela é responsável apenas por buscar e decodificar as
instruções e, a partir daí, gerar os sinais de controle que ativarão as
demais partes dor processador. Ou seja, o processamento de dados
propriamente dito é feito exclusivamente pela Unidade Lógica e
Aritmética (ULA) a qual processa os dados normalmente armazenados
nos registradores.

Esta associação entre o banco de registradores e a Unidade


Lógica e Aritmética, por onde passam todos os dados para serem
processados, é tão importante para o desempenho de um processador
que recebe o nome de Caminho de Dados. E, o tempo necessário
para que os dados sejam acessados nos registradores, aplicados à
ULA, processados por esta e retornados para o banco de registradores
recebe o nome de Ciclo do Caminho de Dados.

17
Infraestrutura de Hardware

Figura 2 – Caminho de Dados (Data Path)

Figura 3 – Visão mais detalhada dos elementos que compõem o caminho de dados

Observe que o tempo do ciclo do caminho de dados é uma


excelente medida para avaliar a eficiência do processador do ponto
de vista da sua capacidade de processar informações. Mas como
podemos avaliar a eficiência do processador quando inserido em uma
determinada placa mãe ou em conjunto com um determinado chip de
memória? Para este fim foi definido o Ciclo de Buscar Decodificar e
Executar.

18
Infraestrutura de Hardware

O Ciclo de Buscar Decodificar e Executar mede, portanto, o tempo


total necessário para buscar uma instrução na memória principal,
decodificá-la e executá-la através do ciclo do caminho de dados.

Existem diversas técnicas desenvolvidas especificamente com o


objetivo de reduzir o tempo do ciclo de Buscar Decodificar e Executar,
as quais estão presentes na maioria dos processadores atuais e são
estas técnicas que em grande parte determinam a eficiência e o preço
dos processadores. Quanto mais apurada a técnica empregada,
quando mais eficiente o hardware utilizado, tanto mais caro e eficiente
será o processador.

Um outro ponto que exerce grande impacto no uso e desempenho


de um processador é o seu conjunto de instruções.

Em nosso contexto, o conjunto de instruções de um processador


pode ser visto com um dicionário contendo todos os comandos
existentes na sua linguagem de máquina os quais estão diretamente
associados às operações que este processador consegue executar.

Mas por falar em linguagem de máquina, você sabe dizer o que


vem a ser isto e qual a sua importância para o nosso estudo?

É isto o que vamos descobrir na próxima seção.

2.2 Comunicando com um computador: A


Linguagem de Máquina

Todo processo de comunicação, de troca de informações, seja


entre dois seres humanos, entre um ser humano e uma máquina, ou
ainda entre duas máquinas, é sempre baseado na troca de símbolos e
regido por regras sintáticas e semânticas que determinam o significado
que cada símbolo assume no contexto em que é utilizado.

Algum dia você já precisou se comunicar com alguém que


não falava a sua língua? Como foi a sua experiência? Foi fácil ou
difícil? De qualquer forma você deve ter percebido que para que
haja comunicação é necessário que todas as partes envolvidas
conheçam os símbolos, neste caso as palavras, e as regras sintáticas
e semânticas que regem o seu significado, ou seja, que além de
conhecer as palavras, saiba-se também como utilizá-las corretamente
a fim de poder formar frases que exprimam realmente o que se deseja
comunicar.

19
Infraestrutura de Hardware

No mundo virtual não é diferente. Para que possamos nos


comunicar com um computador a fim de instruí-lo a respeito das
tarefas a serem executadas, ou seja, para que possamos programá-
lo, devemos conhecer algum tipo de linguagem de programação, seu
vocabulário e suas regras sintáticas e semânticas.

No inicio da história dos computadores não existia o que nós


conhecemos como linguagem de programação de alto nível, ou
seja, aquele tipo de linguagem que nos permite descrever as tarefas
a serem executadas através de expressões próprias da nossa
linguagem coloquial. Desta forma, os programadores eram obrigados
a conhecer e utilizar exclusivamente a linguagem de máquina. Isto
equivale a dizer que os programas eram inteiramente escritos como
sequências de zeros e uns. Sim, isto mesmo, você não leu errado,
os programas eram inteiramente escritos como sequências de zeros
e uns, isto porque, conforme já dissemos, os computadores são
máquinas inteiramente baseadas em lógica digital, ou seja, toda e
qualquer informação no interior de um computador deve ser expressa
apenas como sequências de zeros e uns.

Com a evolução natural dos computadores e, por conseguinte


dos programas de computador, logo percebeu-se que não era viável
continuar a programar diretamente em linguagem de máquina. Assim
surgiu a primeira linguagem de programação. Que na verdade não era
bem uma linguagem de programação, nos moldes como conhecemos
hoje, utilizando expressões da linguagem natural dos seres humanos.
Era antes uma tradução direta das instruções existentes na linguagem
de máquina para palavras de comando que podiam ser mais facilmente
compreendidos e manipulados pelos seres humanos. Esta forma

20
Infraestrutura de Hardware

de linguagem ficou conhecida como linguagem de montagem, ou


simplesmente linguagem assembly, e os comandos desta linguagem
ficaram conhecidos como mnemônicos, por serem abreviações e/ou
siglas que representavam as operações que se queria executar. A
Figura 4 a seguir nos permite ter uma pequena amostra da diferença
entre programar em linguagem de montagem e diretamente em
linguagem de máquina.

Figura 4 – Exemplo de trecho de programa em linguagem de montagem e o seu equivalente


em linguagem de máquina

Observe que nada havia mudado no processador em si, este


continuava compreendendo exclusivamente a linguagem de máquina.
Apenas havia sido desenvolvida uma forma de tornar a atividade de
programar os computadores um pouco mais natural e eficiente. Com
esta nova abordagem, os programas eram primeiramente escritos em
linguagem de montagem e em seguida passavam por um processo de
tradução automática, normalmente efetuado por um outro programa
de computador, denominado processo de montagem, daí o nome da
linguagem ser linguagem de montagem. Neste processo todas as
instruções mnemônicas utilizadas eram convertidas em comandos da
linguagem de máquina, ou seja, em sequências de zeros e uns, para
que se tornassem inteligíveis ao computador.

Com o passar do tempo, percebeu-se que seria possível construir


programas melhores e em menor tempo se, em vez de se programar
diretamente em linguagem de montagem, fosse possível programar
em uma linguagem com comandos e tipos de dados mais expressivos,
que estivessem mais perto do raciocínio humano, ou seja, com um
maior grau de abstração. Surgia assim a primeira linguagem de
programação de alto nível. Com ela, um programa podia ser escrito

21
Infraestrutura de Hardware

utilizando expressões idiomáticas e estruturas textuais mais próximas


as que nós utilizaríamos para descrever um algoritmo qualquer, o
que tornava o processo de criação de um programa algo bem mais
cômodo e natural. Esta facilidade entretanto tinha um custo, pois o
processo de conversão de um programa escrito nesta linguagem para
a linguagem de máquina tinha agora que ser feito em duas etapas.
Primeiro o programa era traduzido da linguagem de alto nível para a
linguagem de montagem, e deste para a linguagem de máquina. Este
processo de tradução da linguagem de alto nível para a linguagem
de montagem ficou conhecido como compilação e o programa que
executa esta tarefa ficou conhecido como Compilador. A Figura 5 a
seguir nos traz um exemplo do processo de conversão de um trecho
de código escrito em linguagem de alto nível para linguagem de
máquina, passando pela linguagem de montagem.

Figura 5 – Processo de conversão de um programa escrito em linguagem de alto nível


para linguagem de máquina

Com o passar dos anos foram surgindo muitas linguagens e


compiladores novos, entretanto, o processo conversão entre um
programa escrito em alguma linguagem de alto nível e a linguagem de
máquina continua praticamente o mesmo. A Figura 6, a seguir, nos traz
o fluxo completo de Compilação e execução de um programa escrito
em uma linguagem de alto nível para a linguagem de máquina.

22
Infraestrutura de Hardware

Figura 6 – Fluxo completo de Compilação de um programa qualquer

Isto tudo é muito interessante, não é mesmo?

Bem, agora que já temos uma visão de como se dá de fato


a nossa comunicação com os computadores, ou seja, de como
nossos programas passam da linguagem na qual foram escritos
para a linguagem de máquina, que tal nos aprofundarmos um pouco
mais e estudarmos como o processador decodifica e executa estas
instruções? Que tal conhecer por dentro um dos processadores mais
estudados e comercializados em todos os tempos?

Na próxima seção, vamos conhecer o processador MIPS, sua


arquitetura interna, algumas instruções da sua linguagem de máquina
e ver em detalhes como este processador decodifica e executa as
instruções da sua linguagem de máquina.

Arquitetura básica de um processador

Existem atualmente diversos tipos de processadores, indo desde


os processadores mais simples, dedicados a executar pequenas
funções em aparelhos eletro/eletrônicos, até aos processadores mais
complexos, projetados para aplicações em que se precise de um alto
poder de processamento, como em supercomputadores por exemplo.
Todos estes processadores podem ser agrupados na forma de classes
ou famílias conforme podemos ver na Tabela 1 a seguir:

23
Infraestrutura de Hardware

Tabela 1 - Tipos de Processadores

Família Aplicação

Processadores de Computadores pessoais


propósito geral (Desktop, Notebooks, etc)

Sistemas Embarcados (TVs, DVDs, GPS, Celular,


Microcontroladores
Micro-ondas, Relógios, Console de Jogos, etc)

Processamento de Alto desempenho,


Processadores Vetoriais
super computadores

Processadores
Computadores de médio e grande porte
Super-Escalar

Placas gráficas, processamento


Processadores Gráficos
de realidade virtual

Processadores Digitais Equipamentos médicos, processamento de sinal de


de Sinal (DSP) satélite, telecomunicações, etc.

Entretanto, de um modo geral, podemos dizer que todos os


processadores compartilham de uma mesma arquitetura básica, ainda
que diferindo no modo como esta arquitetura é implementada.

Ou seja, ainda que cada uma destas famílias de processadores


possua características bem específicas, o que as torna especialmente
aplicáveis a um ou outro tipo de aplicação, ainda assim podemos
traçar um paralelo entre as suas unidades internas, de tal forma que
possamos tratá-las apenas como processadores e nada mais.

Como vimos na Figura 1, todos os processadores possuem


internamente no mínimo uma unidade de controle, um banco de
registradores e uma unidade lógica e aritmética. Este seria um
modelo mínimo razoável se o processador não precisasse acessar
a memória principal e os dispositivos de entrada e saída durante o
processamento normal das informações. A Figura 7, a seguir, nos
traz o que poderíamos considerar um modelo mais completo de um
processador.

24
Infraestrutura de Hardware

Figura 7 - Arquitetura interna de um processador incluindo o barramento do sistema

Existe ainda uma outra visão da arquitetura interna do processador


que é muito útil quando se deseja ter uma visão mais funcional do
mesmo. A Figura 8 nos traz esta visão. Nela em vez de destacar-se
as unidades funcionais, destacam-se as funções associadas a alguns
registradores de controle do processador.

Figura 8 – Visão interna do processador destacando os registradores de controle

Os registradores de controle apresentados na Figura 8 normalmente

25
Infraestrutura de Hardware

não estão acessíveis ao programador, sendo o seu conteúdo


controlado pela unidade de controle do processador. Entretanto, ainda
assim é muito importante conhecer as suas funcionalidades para se
ter uma visão de como o processador funciona.

» O registrador PC, do inglês Program Counter, que em


português significa Contador de Programa, armazena sempre
o endereço de memória da próxima instrução a ser executada.
Seu conteúdo é atualizado sempre que uma nova instrução é
trazida da memória para ser executada.

» O registrador IR, do inglês Instruction Register, que em


português significa Registrador de Instrução, armazena a
instrução que foi trazida da memória para ser executada.

» O registrador MAR, do inglês Memory Address Register, que


em português significa Registrador de Endereço de Memória.
Este registrador armazena o endereço de memória a ser
acessado quando algum operando da operação em execução
se encontra armazenado na memória.

» O registrador MBR, do inglês Memory Buffer Register, que em


português significa Registrador do Buffer de Memória. Este
registrador é utilizado como buffer de dados entre o processador
e a memória principal. Sempre que um operando é lido da
memória este é primeiramente armazenado neste registrador
antes que possa ser utilizado internamente pelo processador.
E, sempre que o processador precisa gravar algum dado na
memória principal, este é primeiramente armazenado neste
registrador, permanecendo nele até que o processo de gravação
na memória seja concluído.

» O registrador I/O AR, do inglês Input/Output Address Register,


que em português significa Registrador de Endereço de
Entrada e Saida. Este registrador armazena o endereço
do dispositivo de entrada e saída a ser acessado quando o
processador vai executar alguma operação de escrita ou leitura
nos dispositivos de entrada e saída.

» O registrador I/O BR, do inglês Input/Output Buffer Register,


que em português significa Registrador do Buffer de Entrada
e Saída. Este registrador é utilizado como buffer de dados entre
o processador e os dispositivos de entrada e saída. Sempre que
um dado é lido de algum dispositivo de entrada e saúda, este é

26
Infraestrutura de Hardware

primeiramente armazenado neste registrador antes que possa


ser utilizado internamente pelo processador. E, sempre que o
processador precisa gravar algum dado em algum dispositivo
de entrada e saída, este é primeiramente armazenado neste
registrador, permanecendo nele até que o processo de gravação
seja concluído.

Bem, agora que já conhecemos as principais famílias de


processadores existentes no mercado, e que pudemos ter uma
visão geral dos elementos presentes na arquitetura interna de todos
os processadores, podemos dar uma olhadinha em como esta
arquitetura interna funciona, ou seja, como é o fluxo de execução de
uma instrução qualquer no interior de um processador.

Do ponto de vista de execução das instruções contidas em um


programa, podemos dizer que todos os processadores seguem o fluxo
apresentado na Figura 9 a seguir.

Figura 9 – Fluxo de execução de uma instrução de computador

Este fluxo pode ser dividido em:

► Ciclo de Busca:

» O registrador Contador de Programa (PC) é carregado com


o endereço da instrução a ser executada.

» O endereço da instrução é inserido no barramento de


endereços do sistema juntamente com a ativação dos sinais
de controle que indicam que é uma operação de leitura de
memória. Em resposta a memória fornece OP-CODE da
instrução (palavra binária que representa a instrução a ser

27
Infraestrutura de Hardware

executada).

» O OP-CODE da instrução é carregado no Registrador de


Instruções para ser decodificado pela Unidade de Controle
do Processador.

» A Unidade de Controle decodifica a instrução e desencadeia


a sequência de operações necessárias à ativação dos
módulos que serão utilizados na execução da referida
instrução.

► Ciclo de Execução - o ciclo de execução dependerá do tipo de


instrução a ser executada, a qual pode ser:

» Instrução de transferência de dados envolvendo a memória


principal (Leitura ou escrita na memória):

▪ Neste caso a primeira coisa a ser feita é calcular as


posições de memória a serem acessadas, que podem
estar direta ou indiretamente indicados no corpo da
instrução. Em ambos os casos é a unidade de controle
que calcula e/ou define o endereço da posição de
memória a ser acessado.

▪ O endereço calculado é então armazenado no


registrador MAR, e deste é inserido no barramento de
endereços do sistema juntamente com os sinais de
controle que indicam que é uma operação de leitura
ou escrita de memória.

▪ Sendo uma operação de leitura, em resposta aos


sinais de controle inseridos no barramento do
sistema, a memória fornece no barramento de dados
do sistema o conteúdo da posição de memória
acessada. Ao perceber que o dado está disponível no
barramento, a unidade de controle providencia que
o mesmo seja armazenado no registrador MBR para
que fique disponível para ser processado.

▪ Sendo uma operação de escrita, a unidade de


controle providencia que o dado a ser escrito seja
primeiramente armazena no registrador MBR, o qual
fica então disponível no barramento de dados do
sistema para ser gravado pela memória principal.

28
Infraestrutura de Hardware

» Instrução de transferência de dados envolvendo dispositivos


de entrada e saída (Instrução de Escrita ou Leitura em
algum dispositivo de Entrada e Saída, também conhecida
como operação de I/O)

▪ Da mesma forma que na operação de transferência


de dados envolvendo a memória principal, neste caso
a primeira coisa a ser feita é calcular o endereço do
dispositivo a ser acessado, o qual pode estar direta
ou indiretamente indicado no corpo da instrução. Em
ambos os casos a unidade de controle calcula e/ou
define o endereço do dispositivo a ser acessado.

▪ O endereço calculado é então armazenado no


registrador I/O AR, e deste é inserido no barramento
de endereços do sistema juntamente com os sinais de
controle que indicam que é uma operação de leitura
ou escrita de I/O.

▪ Sendo uma operação de leitura, em resposta aos


sinais de controle inseridos no barramento do
sistema, o dispositivo acessado devolve o dado
requerido diretamente no barramento de dados do
sistema. A unidade de controle ao perceber que o
dado está disponível se encarrega de armazená-lo
no registrador I/O BR ficando então o dado disponível
para ser processado.

▪ Sendo uma operação de escrita, a unidade de controle


se encarrega de armazenar o dado a ser escrito no
registrador I/O BR após o que este fica disponível
no barramento de dados do sistema para que fique
acessível ao dispositivo endereçado.

» Instruções Lógicas e Aritméticas:

▪ A unidade de controle programa a Unidade Lógica e


Aritmética com a operação a ser efetuada.

▪ A unidade de controle identifica o tipo e a localização


dos operandos.

▪ Se estes estiverem armazenados na memória, a


unidade de controle calcula o endereço das posições
de memória a serem acessados, colocando um a um

29
Infraestrutura de Hardware

os endereços no registrador MAR a partir do que estes


são conectados ao barramento de endereço do sistema
juntamente com os sinais de controle que indicam que
é uma operação de leitura de memória. Em resposta
aos sinais de controle inseridos no barramento do
sistema, a memória insere no barramento de dados
do sistema, um a um, todos os dados armazenados
nas posições indicadas os quais são carregados no
registrador MBR e só então podem ser lidos pelo
processador para carga nos registradores de trabalho
da Unidade Lógica e Aritmética.

▪ Se estiverem armazenados nos registradores, a


unidade de controle gera os sinais de controle
necessários para acessá-los, conectando-os
diretamente à entrada da Unidade Lógica e
Aritmética.

▪ A Unidade Lógica e Aritmética efetua a operação


programada, deixando o resultado disponível à saída
do seu registrador de trabalho.

▪ A unidade de controle identifica o tipo e a localização


dos operandos que receberão os resultados da
operação. Observe que a quantidade de operandos
envolvidos depende da operação em curso.

▪ Se estes forem ser armazenados na memória


principal, primeiramente a unidade de controle calcula
e/ou define os endereços das posições de memória
a serem acessadas, colocando um a um os dados a
serem escritos no registrador MBR e o endereço da
posição de memória onde os mesmos deverão ser
escritos no registrador MAR, ficando desta forma
os mesmos disponíveis no barramento de dados e
endereço do sistema juntamente com os sinais de
controle que indicam que é uma operação de escrita
de memória. Em resposta a memória armazena o
conteúdo fornecido nas posições de memória que
forem indicadas.

▪ Se estes forem ser armazenados em registradores,


a unidade de controle gera os sinais de controle

30
Infraestrutura de Hardware

necessários para acessá-los, conectando-os


diretamente à saída da Unidade Lógica e Aritmética,
juntamente com os sinais que indicam que é uma
operação de escrita em registradores.

» Instruções de Desvio

▪ Caso seja uma instrução de chamada de desvio


com retorno programado, ou seja, uma chamada de
sub-rotina, a unidade de controle primeiramente
armazena o conteúdo do registrador Contador de
Programa (PC) em algum lugar para ser utilizado
posteriormente como endereço de retorno, calcula o
endereço para onde o programa deverá ser desviado
e carrega o registrador Contador de Programa (PC)
com o novo endereço.

▪ Caso seja uma instrução de chamada de desvio sem


retorno, a unidade de controle simplesmente calcula o
endereço para onde o programa deverá ser desviado
e carrega o registrador Contador de Programa (PC)
com o novo endereço.

▪ Caso seja uma instrução de retorno programado, ou


seja, um retorno de uma sub-rotina, a unidade de
controle carrega o registrador Contador de Programa
(PC) com o endereço anteriormente armazenado.

Como podemos observar, ainda que muito superficialmente


nestas pequenas descrições, o processo de buscar, decodificar e
executar uma instrução não é uma tarefa simples sendo em parte o
grande diferencial entre um processador de alto desempenho e um
processador mais simples.

Bem, agora que conhecemos um pouco como é e como funciona


a arquitetura interna de um processador em geral, podemos continuar
com o nosso estudo sobre o MIPS.

O processador MIPS

Fruto de um projeto de pesquisa arrojado de um grupo de


pesquisadores liderados pelos cientistas David Patterson e Carlo
Séquin, o processador MIPS dominou por muitos anos o mercado de
equipamentos eletrônicos em geral. Para se ter uma ideia, só em 1997

31
Infraestrutura de Hardware

as vendas deste processador superaram a casa dos 19 milhões de


unidades. Em 2007, com mais de 250 milhões de clientes ao redor do
mundo, os processadores MIPS dominavam absolutos o mercado de
equipamento de entretenimento digital. Atualmente, os processadores
MIPS ainda detém uma boa fatia do mercado de equipamentos
eletrônicos, estando presentes em equipamentos como:

» Wireless Access Point

» Máquina Fotográfica Digital

» Console de Jogos Eletrônicos

▪ Nintendo 64

▪ Sony Playstation e Sony Playstation II

▪ Sony PSP

» Computadores de grande porte

Arquitetura Interna do MIPS

Diferentemente dos demais processadores existentes à época do


seu lançamento, o processador MIPS foi projetado de forma a ter uma
arquitetura simples e regular, com um pequeno número de instruções
que pudessem ser decodificadas e executadas em apenas um ciclo
de relógio.

Isto causou uma certa estranheza e descrédito por parte dos demais
fabricantes de processadores, os quais construíam processadores
extremamente complexos, que ao contrário do MIPS possuíam
centenas de instruções, algumas das quais tidas como extremamente
flexíveis e poderosas e que levavam entre dezenas e centenas de
ciclos de relógio para serem decodificadas e executadas.

De um modo geral, o objetivo destes fabricantes era prover a


linguagem de máquina dos seus processadores com instruções cada
vez mais próximas das utilizadas nas linguagens de alto-nível, a fim de
poder reduzir o tamanho dos programas e assim tornar sua execução
cada vez mais rápida e eficiente.

Entretanto, devido às limitações de tecnologia existentes à época,


os chips ainda eram relativamente pequenos se comparados com
os produzidos hoje em dia, possuindo apenas algumas centenas
de milhares de transistores, muitas destas instruções não podiam

32
Infraestrutura de Hardware

ser implementadas diretamente em hardware, tendo assim que ser


implementadas através de um artifício que ficou conhecido como
microcódigo.

Um microcódigo nada mais era que uma referência a um pequeno


trecho de código que ficava armazenado em uma memória especial
dentro do próprio processador. Como as instruções deste trecho de
código ficavam armazenadas dentro do próprio processador, elas
podiam ser acessadas muito mais rapidamente que o restante das
instruções que ficavam armazenadas na memória principal. Esta
diferença na velocidade de acesso permitia que um programa que
utilizasse instruções baseadas em microcódigo executasse muito
mais rapidamente que um programa que não as utilizasse.

Ou seja, sempre que um fabricante de processador percebia que


uma determinada operação mais complexa estava sendo utilizada
com grande frequência pelos programadores em geral, a qual
normalmente era implementada através de uma sub-rotina, utilizando
várias instruções básicas da linguagem de máquina do processador,
estes criavam um novo microcódigo com este conjunto de instruções e
definiam uma nova instrução na linguagem de máquina do processador
para lhe fazer referência.

Desta forma, devido a sua praticidade e pelos resultados


alcançados, o uso dos microcódigos tinha se tornado a melhor solução
para aumentar o desempenho e a complexidade dos processadores.

Os processadores MIPS vinham portanto quebrar estes


paradigmas, eliminando por completo o uso dos microcódigos e
reduzindo drasticamente o número de instruções da linguagem de
máquina do processador, dando assim início a uma nova geração
de processadores que ficou conhecida como processadores RISC,
acrônimo da língua inglesa que traduzido ao pé da letra significa
Processador com Conjunto Reduzido de Instruções, conforme
abordamos no capítulo 1 deste volume. Os demais processadores,
os que seguiam a abordagem padrão, em contrapartida, ficaram
conhecidos como processadores CISC, também um acrônimo da
língua inglesa que traduzido significa Processador com Conjunto de
Instruções Complexo.

O outro diferencial da arquitetura do MIPS, como já citamos, era a


presença de um grande número de registradores de propósito geral,
os quais poderiam ser utilizados como espaço de memória de acesso

33
Infraestrutura de Hardware

ultrarrápido era um outro ponto. Vale lembrar que um registrador nada


mais é que um espaço de memória com o tamanho exato da palavra
do processador construído dentro do próprio processador e ao qual
este tem acesso quase que instantâneo, diferentemente da memória
principal a qual é construída fora do processador e portanto tem um
acesso bem mais lento.

E, para completar o cenário, um outro ponto que diferia o


processador MIPS dos demais era a exigência de que os operandos
para as operações lógicas e aritméticas estivessem armazenados
exclusivamente em registradores ou diretamente no corpo da instrução.
Com isto os projetistas do MIPS objetivavam reduzir ao máximo o
acesso à memória principal e assim permitir que seus programas
pudessem ser executados ainda mais rapidamente. Ou seja, o grande
número de registradores tinha um objetivo claro e direto: otimizar uso
da unidade lógica e aritmética do processador.

Os demais processadores, por outro lado, permitiam que os


operandos estivessem armazenados tanto nos registradores quanto
na memória principal, o que era claramente um dos motivos do seu
baixo desempenho.

Apenas a título de comparação, as Figuras 10 e 11 a seguir


nos trazem o ciclo completo de buscar, decodificar e executar das
instruções lógicas e aritméticas sendo executadas num processador
clássico e no MIPS. Observe que no MIPS como os operandos já
estão armazenados nos registradores, o acesso a memória principal
pode ser reduzido drasticamente, bem como o processo de acesso
aos operandos fica bem simplificado.

Figura 10 – Execução de uma instrução lógica ou aritmética nos processadores em geral

34
Infraestrutura de Hardware

Figura 11 – Execução de uma instrução lógica ou aritmética no MIPS

Como você deve ter percebido, tanto o MIPS quanto os demais


processadores executam basicamente as mesmas ações durante o
processo de buscar, decodificar e executar uma instrução. Ou seja, o
que muda é como estas ações são implementadas pela arquitetura
interna do processador.

Bem, olhando agora para a arquitetura do MIPS em comparação


com uma arquitetura clássica da época, pode até fazer algum
sentido imaginar que este pudesse ter até um bom desempenho,
mas para os fabricantes de processadores de época, isto não fazia
nenhum sentido. Como diziam eles, um processador com tão poucas
instruções e ainda por cima com instruções tão simples, que não faz
uso de microcódigos e que só permite operações lógicas e aritméticas
com operandos já armazenados em registradores poderia ter um bom
desempenho? Um programa escrito para este processador deve ficar
enorme... Como então este processador pode ter um desempenho
superior aos demais?

A resposta a esta pergunta é ao mesmo tempo simples e


complexa.

O grande desempenho do MIPS adivinha de algumas decisões de


projeto muito bem arquitetadas, que resultaram em um conjunto de
instruções simples e regular, o que permitiu implementar um esquema
de pipeline extremamente eficiente, de tal forma que toda e qualquer
instrução podia ser decodificada e executada em um único ciclo de
clock (conforme estudamos no capítulo 1), e um grande número de
registradores de propósito gerais totalmente conectados à Unidade

35
Infraestrutura de Hardware

Lógica e Aritmética, de tal modo que qualquer destes registradores


pudesse ser utilizado tanto como operando como destino das
operações lógicas e aritméticas.

Isto se comparado à estratégia dos processadores CISC, que


levavam dezenas e até centenas de ciclos de clock para executar uma
única instrução e que permitiam que os operandos das operações
lógicas e aritméticas estivessem armazenados diretamente na
memória principal, fazia com que, mesmo seus programas sendo
duas ou até três vezes maiores que os demais, executassem muito
mais rapidamente que seus equivalentes em um processador CISC.

Muito interessante, não é mesmo? Mas que tal agora darmos


uma olhada mais de perto nas instruções da linguagem de máquina
do MIPS para em seguida vermos como estas instruções eram
decodificadas e executas em hardware?

Linguagem de Máquina do MIPS

Conforme dissemos, devido aos princípios de simplicidade e


regularidade, todas as instruções do MIPS podem ser divididas em
apenas três tipos básicos, descritos a seguir:

» Instruções Tipo R: Instruções em que todos os operandos se


encontram armazenados em registradores.

» Instruções Tipo I: Instruções onde um dos operandos é fornecido


na forma de um valor imediato dentro da própria instrução e os
Saiba Mais demais encontram-se armazenados em registradores.

JUMP é uma » Instruções Tipo J: Este formato de Instrução é utilizado


palavra inglesa exclusivamente para representar instruções de desvio,
que pode ser
traduzida como conhecidas como instruções Jump.
salto ou pulo.
As figuras a seguir (12, 13 e 14) demonstram como estão divididos
os 32 bits da palavra do processador para cada uma destas classes
de instruções. Mais tarde veremos como esta organização permitiu
uma decodificação rápida e direta destas instruções.

36
Infraestrutura de Hardware

Figura 12 – Formato interno das instruções tipo R

Figura 13 – Formato interno das instruções tipo I

Figura 14 – Formato interno das instruções tipo J

Para que possamos entender como os princípios de simplicidade e


regularidade estão presentes no formato interno de cada uma destas
classes de instruções, vamos primeiramente analisar o significado de
cada um dos campos assinalados.

Você observou que todas as classes de instruções possuem um


campo op com 6 bits. É neste campo que é definida a classe e o

37
Infraestrutura de Hardware

tipo de instrução representado. Se, por um lado o pequeno número


bits deste campo limita em 64 o número máximo de classes ou tipos
de instruções disponíveis nos processadores MIPS, por outro lado a
sua decodificação pode ser feita quase que instantaneamente com o
auxílio de uma tabela ou através de um circuito lógico combinacional
extremamente simples.

Como você deve ter notado, o conteúdo dos outros campos


representam os operandos e outras informações necessárias à
execução da operação representada. Veja inclusive que os nomes
e funções dos campos são praticamente os mesmos em todas as
classes de instruções.

Continuando nossa análise, vamos fazer uma análise mais


detalhada no formato das instruções tipo R.

Instruções Tipo R

Como dissemos, as instruções tipo R são aquelas em que todos


os operandos se encontram armazenados em registradores. Como
existem diversas instruções deste tipo nos processadores MIPS,
existe um segundo campo nestas instruções, o campo func, o qual
determina qual destas instruções deve ser executada. Ou seja, quando
a unidade de controle recebe uma instrução para ser decodificada e,
pelo valor armazenado no campo op verifica que é uma instrução do
tipo R, este utiliza o valor armazenado no campo func para determinar
qual a instrução deverá ser executada.

Determinada a instrução a ser executada, a unidade de controle


utiliza os campos rs, rt e rd para acessar o conteúdo dos dois
operandos, e para endereçar o registrador de destino onde será
armazenado o resultado obtido.

Observe que os campos rs, rt e rd possuem 5 bits cada, o que é


suficiente para armazenar o endereço de todos os 32 registradores
presentes no MIPS.

Vejamos agora o que muda nas instruções tipo I.

Instruções Tipo I

A decodificação das instruções tipo I é bem parecida com o que


acabamos de ver. Após verificar pelo conteúdo do campo op que trata-

38
Infraestrutura de Hardware

se de um instrução tipo I, uma vez que esta não possui o campo func,
a unidade de controle pode passar a acessar os operandos, dos quais
um se encontra no registrador apontado pelo conteúdo do campo rs e
o outro no campo imediato. O resultado obtido, quando necessário, é
armazenado no registrador apontado pelo campo rt.

Instruções Tipo J

Por fim, a decodificação das instruções tipo J são ainda mais


simples que as duas primeiras apresentadas. Uma vez verificado
que trata-se de uma instrução desta classe, a unidade de controle
simplesmente obtém o operando do campo endereço o qual é aplicado
a ULA para calcular o endereço para o qual a execução do programa
será desviada.

Muito simples, não é mesmo?

Observe que, tantos para as operações tipo I quanto para as


do tipo J, o processo de decodificação das instruções se resumiu
à verificação do conteúdo do campo op. E, mesmo no caso das
instruções tipo R, as quais possuem o campo func para determinar
qual a instrução dentro da classe será executada, ambos os campos
podem ser decodificados simultaneamente, o que simplifica e agiliza
o processo de decodificação.

Bem, agora que já sabemos, em linhas gerais, como as três


classes de instruções do MIPS estão internamente organizadas e
como são decodificadas, vamos conhecer algumas destas instruções
da linguagem de máquina do MIPS.

Instruções do MIPS

Do ponto de vista de funcionalidade, as instruções da linguagem


de montagem do MIPS podem ser divididas em:

» Instruções Lógicas e Aritméticas

» Instruções de transferência de dados

» Instruções de tomada de decisão

» Instruções de desvio

Infelizmente, devido o pouco tempo que dispomos, veremos


apenas algumas instruções de cada uma das classes apresentadas.

39
Infraestrutura de Hardware

Veremos apenas o suficiente para que possamos entender na prática


o funcionamento interno do processador. Aos que quiserem se
aprofundar no assunto, recomendamos a leitura do livro Organização
e Projeto de Computadores constante em nossa bibliografia.

Vamos começar pelas operações lógicas e aritméticas.

Instruções Lógicas e Aritméticas

Como dissemos a princípio, tão importante quanto conhecer as


instruções de uma determinada linguagem é saber como utilizá-las
corretamente. Em nosso caso isto significa conhecer os mnemônicos,
sua funcionalidade e a sua sintaxe, ou seja, a maneira correta de
escrever um comando utilizando uma determinada instrução.

Para nossa felicidade, todas as instruções Lógicas e Aritméticas


possuem uma mesma sintaxe. Todas devem ser escritas da seguinte
maneira:

Instrução RegistradorDeDestino, PrimeiroOperando, SegundoOperando

Vamos analisar o formato destas instruções:

» A primeira coisa que temos que ter em mente é que, conforme


dissemos, o processador MIPS só permite que operações
lógicas e aritméticas sejam operadas sobre operandos já
armazenados em registradores ou entre um valor armazenado
em um registrador em um valor que já esteja presente no corpo
da instrução, chamado de valor imediato. Temos que lembrar
também que o resultado de toda e qualquer operação lógicas
ou aritmética do MIPS deve ser automaticamente armazenado
em um registrador, veja o detalhe na saída da ULA na Figura 3.
Por este motivo, a sintaxe das instruções lógicas e aritméticas
exige a referência a três operandos na seguinte ordem:

▪ O registrador de destino, ou seja, aquele registrador que


receberá o resultado da operação,

▪ O primeiro operando, que obrigatoriamente será um


registrador,

▪ O segundo operando, que tanto poderá ser um registrador


ou um valor numérico qualquer. Observe que se o segundo
operando for um registrador teremos uma instrução tipo R

40
Infraestrutura de Hardware

e se este for um valor numérico teremos uma instrução tipo


I.

A Tabela a seguir nos traz algum exemplos de instruções Lógicas


e Aritméticas. Nestes exemplos, os parâmetros rd, rs e rt indicam os
campos de bits da instrução em linguagem de máquina. No uso da
instrução, em linguagem de montagem os mesmos serão substituídos
por registradores do banco de registradores do MIPS, conforme
podemos ver na coluna Exemplo.

Tabela 2 – Exemplos de Instruções Lógicas e Aritméticas

Instrução Formato Tipo Operação Exemplo →


Execução

Add Add rd, rs, rt R R[rd] = R[rs] Add R3, R4, R5 →


+ R[rt] R3=R4 + R5

Addi Add rt, rs, #im I R[rt] = R[rs] + Addi R3, R3, 23 →
#im R3=R3 + 23

Sub Sub rd, rs, rt R R[rd] = R[rs] - Sub R7, R2, R9 →


R[rt] R7=R2 - R9

And And rd, rs, rt R R[rd] = R[rs] Add R9, R6, R3 →


& R[rt] R9=R6 & R3

Andi Andi rt, rs, #im I R[rd] = R[rs] Andi R3, R4, 25 →
& #im R3=R4 & 25

Or Or rd, rs, rt R R[rd] = R[rs] | Or R2, R5, R7 →


R[rt] R2=R5 | R7

Ori Ori rt, rs, #im I R[rd] = R[rs] | Ori R4, R2, 33 →
#im R4=R2 | 33

Muito simples, não é mesmo?

Vamos conhecer agora as instruções de transferência de dados.

Instruções de Transferência de Dados

Esta classe de instruções é destinada exclusivamente à


transferência dos dados da memória principal para o banco de
registradores e do banco de registradores para a memória principal.

No MIPS todo o acesso aos dados armazenados na memória


principal é feito de maneira indireta, ou seja, o endereço de memória
a ser acessado deve ser calculado somando-se o conteúdo de um
registrador com um valor presente no campo imediato da instrução.

41
Infraestrutura de Hardware

Esta estratégia se fez necessária para manter todas as instruções


com 32 bits. Se fosse definida uma instrução que permitisse o acesso
direto aos dados, com o endereço de acesso presente no corpo da
instrução, fatalmente esta instrução iria ter mais de 32 bits e sairia
fora do padrão estabelecido.

A seguir temos alguns exemplos desta classe de instruções.

Tabela 3 – Exemplos de Instruções de Transferência da Dados

Instrução Formato Tipo Operação Exemplo → Execução

Lw Lw rt, I R[rt] = M[R[rs]+Im] Lw R3, 3(R5) →


#im(rs) R3=M[R5+3]

Sw Sw rt, I M[R[rs]+Im]=R[rt] Sw R3, 3(R5) →


#im(rs) M[R5+3]=R3

Vamos analisar primeiramente a instrução Lw.

A instrução Lw carrega o registrador indicado no campo rt com


o conteúdo da posição de memória indicada pelo conteúdo do
registrador indicado no campo rs somado ao valor do campo #im.
Parece um pouco confuso, não é mesmo? Mas vejamos os exemplos
a seguir, e eu creio que tudo ficará mais claro.

Na Figura 15 a seguir podemos ver um exemplo do que ocorre


durante a execução da operação Sw. Como podemos ver, neste
exemplo o campo rt foi substituído pelo registrador R3, o campo rs
pelo registrador R5 e o campo #im tem o valor 8. Ao somarmos o
conteúdo do registrador R5 com o valor do campo imediato obtemos
10+8=18, que é o endereço de memória onde será gravado o conteúdo
do registrador R3.

Figura 15 - Exemplo de operação Sw

Na Figura 16 a seguir temos um outro exemplo de execução da

42
Infraestrutura de Hardware

operação Sw. Desta vez o campo rt foi substituído pelo registrador


R7, o campo rs pelo registrador R2 e o campo #im pelo valor 2. Ao
somarmos o conteúdo do registrador R3 com 2 obtemos: 25+3 = 28,
que é o endereço de memória onde o conteúdo do registrador R7 será
armazenado.

Figura 16 - Exemplo de operação Sw

Muito simples, não é mesmo?

Para concluir, vejamos agora alguns exemplos de uso e execução


da operação Lw.

A Figura 17, a seguir, nos traz um exemplo de utilização da instrução


Lw onde rt foi substituído por R1, rs por R8 e #im por 3. Observe
que a operação Lw funciona de maneira inversa à operação Sw, em
vez de salvar o conteúdo do registrador na memória ela carrega o
registrador com o conteúdo armazenado na posição de memória que
for acessada. Nesta caso, como R8 tem o valor 35 e o campo #im tem
o valor 3 estarmos acessando o endereço 38, o qual tem o valor 97
armazenado. Com a execução da operação uma cópia deste valor é
então carregado no registrador R1. O exemplo da Figura 18 é análogo
a esse, tente entender por você mesmo.

Agora, para terminar, só uma perguntinha. Do ponto de vista


de formato interno, o que você acha, a que classe de instruções
pertencem as instruções Lw e Sw? A classe R, I ou J?

Figura 17 - Exemplo de execução da operação Lw

43
Infraestrutura de Hardware

Figura 18 - Exemplo de execução da operação Lw

Instruções de tomada de decisão

O MIPS possui dois tipos de instruções de tomada de decisão, as


que são conhecidas como instruções de desvio condicional, que são
aquelas que podem desviar a execução do programa para um trecho
do código ou outro a partir da avaliação de alguma inferência lógica,
e as instruções que carregam ou não um registrador com um valor
pré-determinado também a partir da avaliação de alguma inferência
lógica. A tabela Tabela 4, a seguir, nos traz alguns exemplos desta
classe de instruções.

Tabela 4 – Exemplos de instruções de tomada de decisão

Instrução Formato Tipo Operação Exemplo → Execução

Beq Beq rs, rt, I Se rs == rt, desvia Beq R3, R5, 25 → Se


#im para a instrução R3 == R5 desvia para
em #im a instrução 25

Benq Bneq rs, I Se rs != rt, desvia Bneq R3, R5, 29 → Se


rt, #im para a instrução R3 != R5 desvia para a
em #im instrução 29

Slt Slt rd, rs, R Se rs < rt, carrega Slt R3,R4,R5 → Se


rt rd com 1, caso o conteúdo de R4 for
contrario carrega menor que o conteúdo
rd com 0 de R5, carrega R3
com 1, caso contrário
carrega R3 com 0

Slti Slti rt, rs, I Se rs < rt, carrega Slt R3,R4,34 → Se o


#im rd com 1, caso conteúdo de R4 for
contrario carrega menor que 34, carrega
rd com 0 R3 com 1, caso
contrário carrega R3
com 0

Normalmente estas instruções são utilizadas para controlar o


fluxo de execução de um programa, exatamente como ocorre nas

44
Infraestrutura de Hardware

linguagens de alto nível com as instruções if, while e for. Veja na


Figura 19 a seguir um exemplo de como ficaria a tradução de um
trecho de código utilizando uma instrução if, escrito na linguagem C,
quando traduzido para a linguagem de montagem do MIPS.

Figura 19 - Exemplo de trecho de código utilizando a instrução if convertido para a


linguagem de montagem do MIPS

Eu sei que o trecho de código em linguagem de montagem pode


não ter ficado tão claro para alguns, mas o ponto mais importante a
destacar é a utilização da instrução Bneq. Observe que a depender
Saiba Mais
do seu resultado o programa tomará um fluxo ou outro, ou seja, se o
conteúdo de R3 for igual ao conteúdo de R4 o programa continuará Uma Label é um
nome que se
o seu fluxo normal, caso contrário o programa será desviado para o insere no inicio
trecho indicado com a Label Else. de uma linha de
código de um
programa escrito
A Figura 20 a seguir nos traz mais um exemplo. Neste exemplo em linguagem
podemos observar o uso das instruções Beq e Slt juntas para descrever de máquina
para poder
a funcionalidade de uma instrução if um pouco mais elaborada. referenciá-la mais
tarde. Durante
Observe que primeiro foi utilizada a instrução Slt para verificar se o o processo de
conteúdo de R3 era menor que o conteúdo de R4, sendo o resultado montagem todas
as Labels são
desta comparação armazenado em R1. Em seguida utilizou-se a substituídas pelos
endereços de
instrução Beq para verificar o resultado da comparação anterior e, a memória onde o
depender do resultado obtido, desviar ou não o fluxo de execução do referido trecho
de código ficou
programa. armazenado.

Muito engenhoso, não é mesmo? Ainda bem que os compiladores


se encarregam de fazer estas conversões entre as linguagens de alto
nível e a linguagem de montagem para nós.

Figura 20 - Exemplo de trecho de código utilizando a instrução Slt

45
Infraestrutura de Hardware

Instruções de desvio

Em todos os tipos de processadores existem pelo menos dois


tipos de instruções de desvio, as instruções de desvio condicional, as
quais nós já fomos apresentados quando estudamos as instruções de
tomada de decisão, e as instruções de desvio incondicional, as quais
iremos estudar agora.

No Mips existem três tipos de instruções de desvio incondicional,


conforme podemos ver na Tabela 5 a seguir.

Tabela 5 – Instruções de desvio incondicional

Instrução Formato Tipo Operação Exemplo → Execução

Jr J rs I PC = rs J R31 → PC = R31

J J J PC = endereço * 4 J 25 → PC = 100
endereço

Jal Jal J R31=PC+4, PC = Jal 25 → R31=PC,


endereço endereço *4 PC=100

A primeira instrução é a instrução Jr, que significa Jumper para


registrador. Esta instrução permite desviar a execução do programa
do endereço que está programado no PC para um outro endereço
qualquer que já esteja armazenado em algum outro registrador. Por
simples que possa parecer, esta instrução é muito útil e é normalmente
utilizada para prover o retorno de sub-rotinas.

A instrução seguinte é a instrução J, que significa simplesmente


Jumper. Esta instrução permite desviar a execução do programa
do endereço que está programado no PC para um outro que esteja
indicado no campo #im.

Aqui precisamos fazer um parêntese em nosso estudo para uma


observação muito importante. Como você deve ter observado pelo
formato das instruções do tipo J, conforme apresentado na Figura 14,
a fim de manter o padrão adotado em todas as instruções do MIPS de
reservar 6 bits para o campo op, o campo endereço possui apenas
26 bits, o que não seria suficiente para preencher o registrador PC, o
qual possui 32 bits. Desta forma não seria possível acessar todas as
posições de memória do processador com as instruções da classe J.

A solução a este impasse se deu de uma maneira simples mas não

46
Infraestrutura de Hardware

menos engenhosa que as demais soluções de engenharia adotadas


no MIPS.

Como todos sabemos a palavra do processador MIPS possui 32


bits, ou seja 4 bytes, e a memória principal vem com um barramento
de endereços que permite que esta seja acessada byte a byte.
Observe as Figuras 21, 22 e 23 a seguir. Verifique que se quisermos
referenciar as posições de memória palavra por palavra em vez de
byte a byte poderíamos reduzir 2 bits em nossa referência, uma vez
que os dois bits menos significativo seriam sempre iguais a zero.

Figura 21 - Diferença entre o endereçamento por bytes e o endereçamento por palavras

Figura 22 - Endereço real de cada palavra de 32 bits quando armazenada na memória

Figura 23 - Endereço em binário para as palavra de 32 bits quando armazenadas na


memória

Desta forma, a fim de aumentar o alcance das instruções J e


Jal, ficou definido que o campo endereço não conteria o endereço
da instrução para onde o programa seria desviado, mas sim uma
referência à palavra de 32 bits onde a instrução estivesse armazenada.
Com isto era como se o campo endereço tivesse dois bits a mais,
passando de 26 para 28 bits. Observe a Figura 24 a seguir, nela temos
47
Infraestrutura de Hardware

um exemplo prático de como se dá a conversão entre a referência, a


palavra de memória e o seu endereço real.

Figura 24 - Conversão entre a referência a palavra de memória a ser acessada e o endereço


de memória onde ela se encontra, em binário

Ainda que muito criativa, esta estratégia resolve só em parte


o nosso problema, uma vez que ainda ficariam faltando quatro bits
para completar os trinta e dois necessários para carregar o PC numa
operação de desvio. Observe que se não preenchermos os trinta e
dois bits do PC na hora em que formos executar um desvio podemos
cair em situações inusitadas como a que pode ser vista na Figura 25 a
seguir. Nela temos uma possível configuração do uso da memória de
um computador onde quatro programas estão em execução. Observe
que cada programa ocupa uma área restrita da memória a qual não é
conhecida no momento da compilação do programa. Veja que se não
for possível indicar claramente o endereço da posição de memória no
momento de executar um desvio, um programa pode acabar sendo
desviado para dentro da área de memória do outro.

Figura 25 - Falha na execução do desvio devido a falta dos 4 bits mais significativos durante
a carga do PC

A solução para situações como esta foi também extremamente


simples e funcional, e consiste em manter inalterados os 4 bits mais
significativos do PC durante as operações de desvio e sobreescrever
os demais com o endereço da palavra de meméoria que se deseja

48
Infraestrutura de Hardware

acessar. Com isto todos os desvios foram transformados em desvios


relativos, ou seja, os desvios são sempre efetuados tomando em
conta o endereço atual do programa em execução. Veja como ficaria
a execução de uma instrução de desvio com o artifício do desvio
relativo ao valor do PC na Figura 26 a seguir. Observe que calcula-
se o endereço de memória da palavra a ser acessada, o que como
sabemos resulta em uma referência de 28 bits, e simplesmente
sobrepõe-se estes 28 bits aos 28 bits menos significativos do PC,
deixando os 4 bits mais significativos inalterados.

Figura 26 - Exemplo de execução da instrução J com o artifício de calcular o desvio relativo


ao valor do PC

Esta estratégia é seguida tanto pelas instruções de desvio


condicional como pelas de desvio incondicional, com exceção da
instrução Jr que como já foi explicado não necessita de tais artifícios.

Por fim, chegamos à última instrução de desvio incondicional, a


instrução Jal, cujo mnemônico é um acrônimo da expressão inglesa
Jump and Link. Esta instrução foi especialmente projetada para
executar desvios com retorno programado, ou seja, para ser utilizada
na chamadas a sub-rotinas. A sua execução é em tudo semelhante a
instrução J que acabamos de estudar, a única diferença é que antes de
se executar a carga do PC com o endereço de desvio o seu conteúdo
é copiado para o registrador R31 para ser utilizado posteriormente
como endereço de retorno da sub-rotina. Veja um exemplo na Figura
27 a seguir.

Figura 27 - Exemplo de chamada de sub-rotina com a instrução Jal e retorno com a


instrução Jr

49
Infraestrutura de Hardware

Muito interessante, não é mesmo?

Bem, agora para terminar nosso estudo sobre a arquitetura


interna do MIPS que tal vermos como algumas destas instruções
são implementadas em linguagem de máquina e como elas são
executadas diretamente em hardware?

A Tabela 6, a seguir, nos traz algumas instruções da linguagem


de montagem do MIPS com os seus respectivos formato interno,
descrição simbólica da sua operação e os valores para o campo op e
para o campo func, quando aplicável.

Tabela 6 – Exemplo de algumas instruções e os seus respectivos valores para os


campos op e func

Instrução Formato Operação Op./Func.

Add R R[rd]=R[rs]+R[rt] 0/20

Addi I R[rt]=R[rs]+Im 8

And R R[rd]=R[rs] & R[rt] 0/24

Andi I R[rt]=R[rs] & Im C

Beq I Desvia p/ a instrução indicada se 4


R[rs]==R[rt]

Bneq I Desvia p/ instrução indicada se 5


R[rs]!=R[rt]

J J Desvia para a instrução indicada 2

Jal J Desvia para a instrução indicada e salva 3


retorno em R31

Lw I R[rt]=M[R[rs]+Im] 23

Sw I M[R[rs]+Im]=R[rt] 2b

Sub R R[rd]=R[rs]-R[rt] 0/22

Vamos começar por um exemplo bem simples. Vamos começar


com a instruções Add. Observe a Figura 28 a seguir. Verifique que
para converter uma instrução da linguagem de montagem para a

50
Infraestrutura de Hardware

linguagem de máquina primeiramente precisamos identificar a classe


da instrução para poder fazer o preenchimento correto dos campos
op e func e verificar o seu formato interno, conforme vimos nas
Figuras 12, 13 e 14. Neste caso, tomando como referência os valores
da Tabela 6 encontramos que op=0x00 e func = 0x20. Em seguida,
baseado no formato da instrução, podemos fazer o preenchimento
dos demais campos. O campo shant não é utilizado por nenhuma das
instruções que estudamos, devendo ser preenchido sempre com 0.
Observe que primeiramente preenchemos os campos com os valores
em hexadecimal para em seguida convertê-los para binário e só então
formarmos a palavra binária de 32 bits que representa a instrução na
linguagem de máquina.

Figura 28 - Exemplo de conversão da instrução Add para a linguagem de máquina do MIPS

Muito simples, não é mesmo?

Vamos agora pegar mais dois exemplos, só que desta vez de


instruções da classe I. Vamos pegar as instruções Addi e Beq. A Figura
29 nos mostra como ficaria a conversão destas duas instruções para
a linguagem de maquina do MIPS. Muito simples, não é mesmo?

51
Infraestrutura de Hardware

Figura 29 - Exemplo de conversão das intruções Addi e Beq para a linguagem de máquina
do MIPS

Bem, eu creio que estes exemplos são suficientes para que


possamos ver que o processo de conversão de uma instrução
da linguagem de montagem para a linguagem de máquina é
extremamente simples e direto.

Agora, para finalizar, vem a melhor parte, vamos dar uma olhadinha
em como o processador decodifica e executa estas instruções
diretamente em hardware.

Decodificação e execução das instruções

Antes que uma instrução possa ser executada ela precisa

52
Infraestrutura de Hardware

primeiramente ser decodificada pela unidade de controle do


processador.

O processo de decodificação das instruções da linguagem de


máquina do MIPS é extremamente simples e pode ser feito da
seguinte forma:

» Separe os 6 bits mais significativos da palavra binária para


identificar o valor do campo op.

» Baseado no valor do campo op, identifique a classe da instrução,


se esta é da classe R, I ou J.

» Sendo da classe R, separe os 6 bits menos significativo para


identificar o valor do campo func.

» A partir dos valores dos campos op e func e, baseado na


tabela que associa estes valores às instruções do processador,
identifique por fim a instrução a ser executada.

» Identificada a instrução e o seu formato interno, carregue os


seus operandos e programe a Unidade Lógica e Aritmética com
a operação a ser efetuada.

Vejamos um exemplo na Figura 30, a seguir. Todas as demais


instruções são decodificadas exatamente da mesma forma. O que
você achou? Muito fácil, não é mesmo?

Figura 30 - Exemplo de decodificação da instrução Add

53
Infraestrutura de Hardware

Bem, agora que já sabemos como as instruções são codificadas


da linguagem de montagem para a linguagem de máquina e como,
uma vez codificadas, estas podem ser decodificadas para que sejam
executadas. Estamos prontos para ver como estas instruções são
executadas em hardware.

Para que possamos entender como se dá a execução das


instruções da linguagem de máquina no hardware interno do MIPS,
precisamos primeiramente conhecer como este hardware está
constituído. Isto é feito analisando o seu diagrama elétrico. Para tanto
vamos começar conhecendo os símbolos utilizados na representação
deste diagrama.

O primeiro componente que vamos conhecer é o Mux.

MUX

O nome Mux é uma abreviação da palavra Multiplexador. Um


Multiplexador é um componente eletrônico que funciona como uma
chave seletora, que permite selecionar entre duas entradas qual será
conectada à saída.

Observe o diagrama de um Multiplexador na Figura 31, a seguir.


Temos uma entrada seletora, indicada com a palavra Select. Duas
entradas, a entrada 0 e a entrada 1, e uma saída indicada com a letra
Y. Quando Select é igual a 1, a entrada 1 é conectada a saída Y.
Quando Select é igual a 0, a entrada 0 é conectada a saída Y. Quando
dizemos que uma entrada é conectada a saída queremos dizer que a
saída Y assumirá o mesmo nível lógico que estiver aplicado a entrada
selecionada por todo tempo em que esta estiver selecionada. Se
durante este tempo a entrada selecionada mudar o seu nível lógico,
digamos de 0 para 1, a saída Y acompanhará esta mudança.

Figura 31 - Diagrama elétrico do Mux

54
Infraestrutura de Hardware

Em seguida temos o Somador.

Somador

O somador, como o próprio nome define, efetua uma operação de


adição entre os valores aplicados às suas entradas. Esta operação
segue o que estudamos para números da base Binária utilizando a
representação de complemento a dois. A Figura 32, a seguir, nos traz
o diagrama elétrico do somador. Nele temos apenas as entradas A
e B e a saída indicada como A+B. Tanto as entradas como a saída
estão preparadas para trabalhar com uma palavra binária do tamanho
da palavra do processador, no caso do MIPS 32 bits.

Figura 32 - Diagrama elétrico do somador

Nosso próximo componente é a Unidade Lógica e Aritmética


(ULA).

Unidade Lógica e Aritmética

A Unidade Lógica e Aritmética é responsável por efetuar todas as


operações lógicas e aritméticas existentes em qualquer programa. A
Figura 33, a seguir, nos traz o diagrama elétrico deste componente.

Como podemos observar, a ULA possui uma entrada para indicar


a operação a ser realizada, indicada com o nome Operação, e mais
duas entradas para os operandos, sinalizadas como entradas A e
B. A ULA possui ainda duas saídas. Uma para fornecer o resultado
da operação efetuada e outra para indicar quando o resultado da
operação é zero. Tanto as entradas A e B como a saída Resultado
estão preparadas para trabalhar com palavras binárias do tamanho da
palavra do processador, no caso 32 bits. Já a entrada Operação, irá

55
Infraestrutura de Hardware

possuir tantos bits quanto forem necessários para representar todas


as operações que esta consegue executar. Para as versões mais
simples do processador MIPS, esta entrada pode possuir apenas 3
bits codificados conforme podemos ver na Tabela 7 a seguir.

Figura 33 - Diagrama elétrico da Unidade Lógica e Aritmética (ULA)

Tabela 7 – Codificação das funções da ULA nos três bits da entrada Operação

Código Função

000 AND

001 OR

010 Soma

110 Subtração

111 Compara se A<B

Nosso próximo componente interno do processador é o banco de


registradores.

Banco de Registradores

Conforme havíamos citado, um registrador nada mais é que


um espaço de memória de acesso ultra-rápido, dentro do próprio
processador, capaz de armazenar uma palavra do processador, no
caso do MIPS uma palavra com 32 bits.

A fim de ordenar o acesso aos diversos registradores existentes


no processador estes ficam agrupados na forma de um Banco de
Registradores com 32 registradores, conforme podemos ver na Figura
34 a seguir.

56
Infraestrutura de Hardware

Como podemos observar, o banco de registradores possui cinco


entradas e duas saídas assim denominadas:

» Dado: Porta de entrada para uma palavra de 32 bits a ser escrita


no registrador apontado pela porta End. Reg. Dest. durante a
ativação do sinal Escrever.

» End. Reg. rs: Porta de entrada com 5 bits, utilizada para carregar
o endereço do registrador associado ao registrador rs.

» End. Reg. rt: Porta de entrada com 5 bits, utilizada para carregar
o endereço do registrador associado ao registrador rt.

» End. Reg. Dest. : Porta de entrada com 5 bits, utilizada para


carregar o endereço do registrador que será escrito.

» Escrever: Porta de entrada de um bit, associada ao sinal que


ativa o processo de escrita no registrador destino.

» rs: Porta de saída de 32 bits com o conteúdo do registrador


associado ao registrador rs

» rt: Porta de saída de 32 bits com o conteúdo do registrador


associado ao registrador rt

Observe que as portas End. Reg. rs, End. Reg. rs e End. Reg. Dest
possuem exatamente 5 bits cada, o que é suficiente para endereçar
qualquer um dos 32 registradores do Banco de Registradores.

Figura 34 – Banco de Registradores

Unidade de Controle

Conforme já dissemos, a Unidade de Controle é responsável por

57
Infraestrutura de Hardware

buscar e decodificar as instruções e, a partir da decodificação destas,


controlar todos os demais componentes internos do processador. A
Figura 35, a seguir, nos traz o símbolo utilizado para representar a
Unidade de Controle no diagrama interno do processador.

Como era de se esperar, esta unidade recebe como entrada os


bits dos campos op e func da instrução em linguagem de máquina
e, a partir do conteúdo destes campos, gera os seguintes sinais de
saida:

» RegDest: Sinal que seleciona a partir de um Mux, que conjunto


de bits da instrução em linguagem de máquina será utilizado
para endereçar o registrador de destino. Assumindo nível lógico
0 para as instruções tipo R e nível lógico 1 para as instruções
tipo I, selecionando respectivamente os bits 11-15, registrador
rd, ou 16-20, registrador rt, como endereço do registrador de
destino.

» RegWrite: Sinal que ativa a escrita no banco de registradores

» AluSrc: Sinal que controla mux que seleciona qual será o


segundo operando da Unidade Lógica e Aritmética. O primeiro
operando, como veremos um pouco mais a frente, será sempre
o conteúdo do registrador rs. Este sinal assume nível lógico 0
para as instruções tipo R, indicando que o segundo operando
será o conteúdo do registrador rt, e o nível lógico 1 para
instruções tipo I, indicando que o segundo operando será o
conteúdo imediato já presente na instrução.

» MemRead: Sinal que ativa a leitura da memória de dados.

» MemToReg: Sinal que controla o mux que seleciona o conteúdo


a ser escrito no banco de registradores. Este sinal assume nível
lógico 1 quando está sendo executada a instrução lw, indicando
que o dado lido da memória será escrito em algum registrador,
assumindo nível lógico 0 para todas as demais instruções,
deixando resultado presente à saída da ULA disponível para
ser escrito no banco de registradores.

» Operação: Palavra com 3 bits que indica a operação a ser


efetuada pela ULA.

» Branch: Sinal que indica que está em curso uma instrução


de desvio condicional. Mais a frente veremos melhor o seu
funcionamento.

58
Infraestrutura de Hardware

» MemWrite: Sinal que ativa a escrita na memória de dados. Este


sinal é ativo durante a execução de instruções de transferência
de dados do banco de registradores para a memória de dados,
como em instruções instrução sw (store word) por exemplo.

Figura 35 - Diagrama elétrico da Unidade de Controle

Por fim, chegamos aos dois últimos elementos da arquitetura


interna do MIPS, a Memória de Dados e a Memória de Instruções.
Na verdade, normalmente, existe apenas uma memória principal a
qual armazena tanto os dados quanto as instruções a qual fica fora
do processador. Entretanto, apenas como um recurso didático, para
facilitar a compreensão do funcionamento interno do processador, não
apenas separamos em Memória de Dados e Memória de Instruções
como as incluímos fazendo parte da arquitetura do processador.

Memória de Dados

A Memória de Dados representa o espaço de memória onde estão


armazenados os dados do programa, tanto variáveis como constantes.
A Figura 36, a seguir, nos traz o símbolo utilizado para representar a
Memória de Dados na arquitetura interna do MIPS.

Observe que esta contém quatro portas de entradas e uma de


saída assim denominadas:

» Endereços: Com 32 bits, corresponde a porta por onde é


fornecido o endereço da posição de memória a ser acessada,
tanto em operações de leitura como de escrita.

» Dados: A memória de dados possui duas portas identificadas


como portas de dados. Uma de entrada e uma de saída, ambas
com 32 bits. A porta de escrita corresponde à porta por onde
é fornecido o dado a ser escrito na memória em operações

59
Infraestrutura de Hardware

de escrita. A porta de leitura corresponde à porta por onde os


dados presentes na memória podem ser lidos em operações de
leitura.

» Escrever: Com 1 bit, corresponde ao sinal que habilita a escrita


na memória.

» Ler: Com 1 bit, corresponde ao sinal que habilita a leitura da


memória.

Figura 36 - Diagrama elétrico da memória de dados

Memória de Instruções

A Memória de Instruções representa o espaço de memória onde


estão armazenadas as instruções do programa a ser executado. A
Figura 37, a seguir, nos traz o símbolo utilizado para representar a
Memória de Instruções na arquitetura interna do MIPS.

Observe que esta contém apenas uma porta de entrada e uma


porta de saída assim denominadas:

» Endereços: Com 32 bits, corresponde a porta por onde é


fornecido o endereço da posição de memória a ser acessada.

» Instruções: Com 32 bits, corresponde a porta por onde é lida a


palavra binária que representa a instrução presente na posição
de memória acessada.

60
Infraestrutura de Hardware

Figura 37 - Diagrama elétrico da memória de instruções

Agora que já conhecemos os símbolos dos principais componentes


que formam a arquitetura interna do MIPS, podemos dar uma olhada
no seu diagrama completo.

Diagrama Interno do MIPS

Na figura Figura 38, a seguir, temos o diagrama interno do


processador. Apesar de este ser um diagrama simplificado, é
suficiente para que possamos tem uma ideia do funcionamento do
seu hardware.

Figura 38 – Diagrama interno simplificado do processador MIPS

Para facilitar a compreensão do seu funcionamento, vamos analisar


a execução de algumas instruções diretamente neste hardware,
verificando os valores atribuídos a cada um dos sinais internos do
processador para cada uma destas instruções, e suas consequências

61
Infraestrutura de Hardware

no sistema como um todo.

Vamos começar analisando uma instrução aritmética do tipo


R. Vamos analisar a instrução Add R3, R4, R4 a qual já teve o seu
formato interno e a sua representação na linguagem de máquina do
MIPS apresentado na Figura 28. Acompanhe pela Figura 39, a seguir,
a execução desta instrução.

1. O conteúdo do PC é aplicado à memória de instruções a fim de


ler a instrução a ser executada.

2. A memória de instruções fornece a instrução armazenada no


endereço indicado. O conteúdo da instrução é dividido em
palavras binárias menores as quais são simultaneamente
aplicadas à unidade de controle para decodificação da instrução
e ao banco de registradores para ler os possíveis operandos.
Ao mesmo tempo o conteúdo do PC que foi aplicado à memória
de instruções é somado a 4 para já preparar para a carga da
próxima instrução.

3. Ao mesmo tempo que o banco de registradores fornece o


conteúdo dos registradores endereçados, a unidade de controle
decodifica a instrução, identificando que é uma instrução Add,
e programa todos multiplexadores e a ULA para a execução
correta da instrução. Observe na figura como os multiplexadores
ficaram configurados. Veja que por se tratar de uma instrução
tipo R o sinal AluSrc foi configurado com nível lógico 0, o
que permitiu que o conteúdo dos registradores rs e rt fossem
conectados à ULA para serem operados.

4. A ULA executa a instrução programada pela unidade de


controle.

5. O resultado obtido é escrito no registrador de destino.

Observe que, por não se tratar de uma instrução de desvio, o sinal


Branch foi configurado com nível lógico 0, o que, independente do
resultado obtido no sinal Zero, força o sinal ExecBranch para 0. Como
consequência o Mux 1 fica configurado para carregar o PC com o
resultado de PC + 4.

Bem, temos que admitir, os engenheiros que projetaram o MIPS


fizeram mesmo um bom trabalho, não é mesmo?

62
Infraestrutura de Hardware

Figura 39 - Execução da instrução Add no Hardware do MIPS

Vamos agora ver outra instrução, desta vez uma instrução tipo I.
Só para não ficar muito diferente do que acabamos de ver, vamos
analisar a instrução Addi R3, R4, 0x22. Acompanhe pela Figura 40, a
seguir, a execução desta instrução no hardware do MIPS.

Como você pode observar, a execução das duas instruções são


praticamente idênticas, com uma única diferença, a programação do
sinal AluSrc que passa de 0 para 1. Com isto o Mux 4 passa a conectar
à entrada da ULA o conteúdo do campo imediato da instrução, bits 0 à
15, para serem utilizados como segundo operando.

Figura 40 - Execução da instrução Addi no Hardware do MIPS

63
Infraestrutura de Hardware

Muito interessante, não é mesmo?

Vamos agora pegar uma instrução que pode parecer um pouco


mais complicada mas que, como você poderá constatar, é também
extremamente simples. Vamos analisar a instrução Lw R8, 3(R5).
Acompanhe pela Figura 41, a seguir, o passo a passa da execução
desta instrução no hardware do MIPS.

1. O conteúdo do PC é aplicado à memória de instruções a fim de


ler a instrução a ser executada.

2. A memória de instruções fornece a instrução armazenada no


endereço indicado. O conteúdo da instrução é dividido em
palavras binárias menores as quais são simultaneamente
aplicadas à unidade de controle para decodificação da instrução
e ao banco de registradores para ler os possíveis operandos.
Ao mesmo tempo o conteúdo do PC que foi aplicado à memória
de instruções é somado a 4 para já preparar para a carga da
próxima instrução.

3. Ao mesmo tempo que o banco de registradores fornece o


conteúdo dos registradores endereçados, a unidade de controle
decodifica a instrução, identificando que é uma instrução Lw,
e programa todos multiplexadores e a ULA para a execução
correta da instrução. Observe na figura como os multiplexadores
ficaram configurados. Veja que por se tratar de uma instrução
tipo I o sinal AluSrc foi configurado com nível lógico 1, o que
ajusta para que sejam operados o registrador rs e o campo
imediato da instrução para serem operandos pela ULA. Um
ponto interessante e sutil a ser observado é que a ULA deve
ser configurada para uma operação de soma (010), uma vez
que para calcular o endereço de memória a ser acessado é
necessário somar o conteúdo do registrador rs com o valor do
campo imediato.

4. A ULA executa a instrução programada pela unidade de


controle. Só que, diferente do que aconteceu nas instruções
Add e Addi, o resultado da operação da ULA em vez de ser
enviado para ser armazenado em algum registrador, é aplicado
à porta de endereços da Memória de Dados.

5. Por fim, o dado que foi lido da memória é enviado para ser é
escrito no registrador indicado no campo rt através do MUX 2.

64
Infraestrutura de Hardware

Figura 41 - Execução da instrução Lw no Hardware do Mips

Para concluir, vamos dar uma olhada em como ficaria a execução


de uma instrução de desvio condicional. Vamos ver a execução da
instrução Beq R9, R2, 0xA3. Acompanhe pela Figura 42, a seguir,
como fica a execução desta intrução.

1. O conteúdo do PC é aplicado à memória de instruções a fim de


ler a instrução a ser executada.

2. A memória de instruções fornece a instrução armazenada no


endereço indicado. O conteúdo da instrução é dividido em
palavras binárias menores as quais são simultaneamente
aplicadas à unidade de controle para decodificação da instrução
e ao banco de registradores para ler os possíveis operandos.
Ao mesmo tempo o conteúdo do PC que foi aplicado à memória
de instruções é somado a 4 para já preparar para a carga da
próxima instrução.

3. Ao mesmo tempo que o banco de registradores fornece o


conteúdo dos registradores endereçados, a unidade de controle
decodifica a instrução, identificando que é uma instrução Beq,
e programa todos multiplexadores e a ULA para a execução
correta da instrução. Observe na figura como os multiplexadores
ficaram configurados. Veja que apesar de se tratar de uma
instrução tipo I o sinal AluSrc foi configurado com nível lógico
0, o que define que os registradores rs e rt serão operandos
pela ULA. Lembre-se, a execução desta instrução exige que

65
Infraestrutura de Hardware

sejam comparados os conteúdos dos registradores rs e rt para


definir se ocorrerá ou não o desvio programado. Observe pela
Tabela 7 que a ULA não possui a operação de comparação. A
solução encontrada foi utilizar a operação de subtração para
fazer a comparação do conteúdo dos dois registradores.

4. A ULA executa a instrução programada pela unidade de


controle, no caso uma subtração. Caso os dois registradores
tenham um mesmo conteúdo, a operação resultará em zero,
o que é sinalizado pela ULA levando o nível lógico do sinal
Zero, à sua saída, para 1. Caso contrario, caso o conteúdo dos
registradores sejam diferentes entre si, o sinal Zero ficará com
nível lógico 0.

5. Por fim, caso o sinal Zero seja 1, o sinal ExecBranch também


terá seu nível lógico alterado para 1, uma vez que este é obtido
a partir da função lógica and entre os sinais Zero e Branch.
Isto configurará o MUX 1 para carregar o PC com o resultado
da soma de PC+4 mais o conteúdo do campo imediato, o que
configurará um desvio no programa. Caso contrario, caso o
sinal Zero seja 0, sinal ExecBranch também terá o seu nível
lógico igual a 0, o que configurará o MUX 1 para carregar o PC
com PC+4 como de costume.

Figura 42 - Execução da instrução Lw no Hardware do Mips

Bem, com isto terminamos nosso estudo pela hardware do MIPS.

66
Infraestrutura de Hardware

Existem muitos outros pontos a serem explorados com relação ao


hardware deste processador, os quais estão disponível na literatura
indicada em nossa bibliografia.

Vamos Revisar?

Neste capítulo, nós conhecemos as principais classes de


processadores e o que eles tem em comum com respeito a sua
arquitetura interna.

Conhecemos também o Caminho de Dados e vimos a sua


importância para o desempenho do processador.

Aprendemos o fluxo de execução de uma instrução no processador,


com as várias fases em que se dividem os seus ciclos de busca e de
execução.

Neste capítulo, aprendemos também sobre a linguagem de


maquina e sobre a linguagem de montagem do MIPS. Vimos como as
instruções da linguagem de máquina são decodificadas pela unidade
de controle deste processador e como esta unidade de controle utiliza
as informações contidas nestas instruções para controlar o hardware
deste processador durante a execução destas instruções.

Atividades e Orientações de Estudo

Como você deve ter percebido, o estudo da arquitetura interna de


um processador não é algo muito simples.

Desta forma, recomendamos que você continue dedicando algum


tempo para resolver os exercícios do seu caderno de exercícios.
E, lembre-se você sempre pode contar com a ajuda dos tutores da
disciplina.

67
Infraestrutura de Hardware

Capítulo 3

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» As interrupções;

» O ciclo de instrução com o uso de interrupções;

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Aprender os princípios básicos das interrupções;

» Compreender porque o uso de interrupções possibilita o


aumento do desempenho dos sistemas computacionais;

» Entender os impactos causados pelas interrupções no ciclo de


instrução.

68
Infraestrutura de Hardware

Capítulo 3 – Ciclo de Execução


e Interrupções

Vamos conversar sobre o assunto?

3.1 Introdução

Durante a execução dos programas, muitos computadores precisam


otimizar o desempenho dando oportunidade aos programas de tratar
eventos inesperados como falhas em dispositivos, tratar referência
a um endereço de memória fora do espaço de endereçamento do
programa, dentre outras ocorrências.

Imagine ainda que se o processador puder tratar outras ações


enquanto espera uma resposta de um periférico, interrompendo
assim o seu fluxo sequencial de trabalho, o seu desempenho poderia
ser melhorado. É seguindo essa ideia que surgem os mecanismos de
tratamentos de interrupções.

Mas o que vem a ser uma interrupção dentro do contexto


computacional? Podemos dizer que uma interrupção, como o próprio
nome já sugere, é uma parada na execução sequencial de um
programa do usuário para tratar um evento assíncrono que pode ser
causado por diversos fatores.

Imagine, por exemplo, uma situação onde um programa que


executa no processador requisita leitura de dados de um arquivo que
está em disco. Normalmente, as CPUs trabalham em velocidades muito
superiores aos dispositivos periféricos. Mesmo com toda a evolução
tecnológica, há uma tendência que esses dispositivos continuem mais
lentos que a própria CPU, pois esta última é o cérebro do computador,
devendo, portanto atender a vários dispositivos periféricos.

Durante a leitura do disco, o programa em execução na CPU ficará


em estado de espera, aguardando o término na leitura dos dados. Caso
esse tempo de espera seja aproveitado com a execução de outras
atividades que não dependessem do resultado da leitura do arquivo,
haveria um ganho em termos de desempenho de processamento.
Se você entendeu essa situação, você entendeu o propósito do uso
das interrupções como alternativa para melhorar o desempenho dos

69
Infraestrutura de Hardware

processadores na execução dos programas.

Para exemplificar, podemos pensar em um cenário onde um


programa executa numa CPU que não utiliza interrupções. Esse
programa possui uma operação de leitura em disco e durante a
execução do comando de leitura do periférico, o controle da operação
é desviado para a controladora de disco. Se você não sabe o que é
a controladora do disco, não se preocupe, pois veremos em volumes
subsequentes.

O programa do nosso exemplo segue a sua execução e ao encontrar


um comando de leitura de disco, desvia a operação de leitura para a
controladora. Durante a operação de leitura há um tempo ocioso da
CPU, pois ela continua parada, aguardando o retorno da operação
de leitura por parte da controladora. Quando a controladora concluiu
a operação de leitura, o fluxo do programa retorna novamente à
CPU que seguirá com a execução dos demais comandos. Observe
a Figura 1 abaixo representando o esquema de execução do referido
programa.

Figura 1 – Programa executando sem interrupção.

Durante a operação de leitura haverá um intervalo de tempo (T)


no qual a CPU não poderá executar ações deste programa, devido
o aguardo do retorno da operação de leitura. Isso não é desejável,
pois o desempenho da CPU fica bastante degradado. Sendo assim,
uma maneira de otimizar esse desempenho é introduzir o uso de
interrupções.

Ao ser executado, o programa da Figura 1 seguirá a seguinte


sequência de execução:

70
Infraestrutura de Hardware

1, 3, T, 4, 2

Onde T = Tempo de leitura do disco

Se pensarmos que para execução dos blocos de comandos 1, 3,


4, 2 sejam decorridos 1 milissegundo para a execução de cada um,
o tempo total para a execução do programa seria 4 milissegundo + T,
onde T é um tempo ocioso para a CPU.

Suponha agora esse mesmo programa sendo executado numa


CPU que trabalha com interrupções. Neste caso ao encontrar um
comando de leitura, a CPU desvia o controle para a controladora,
mas enquanto aguarda pelo retorno da operação, ela poderá executar
outras instruções daquele mesmo programa quando estas não
dependem diretamente da saída da operação de leitura. O mesmo
esquema de execução apresentado anteriormente comporta-se
conforme a Figura 2, no caso de uso de interrupções.

Figura 2 – Programa executando com interrupção.

Note agora que a operação de leitura acontece em paralelo ao


primeiro conjunto de comandos do bloco 2. Quando a operação de
leitura termina, a controladora irá colocar um sinal no barramento,
avisando que a operação acabou. Saiba Mais

Neste ponto, a CPU salva o contexto de execução do programa


Tratador de
(para saber onde o programa parou) e vai verificar o retorno da interrupções
é o programa
operação de leitura (Tratador de Interrupções). Após o tratamento da do sistema
interrupção, o fluxo de execução continua na instrução imediatamente operacional
que indentifica
após aquela do momento da interrupção, executando assim, o bloco qual o tipo de
interrupção que
de instruções representado por 2b. aconteceu.

71
Infraestrutura de Hardware

Ao ser executado, o programa da Figura 2 seguirá a seguinte


sequência de execução:

1, 3, T, 4, 2b

2a

Onde T = Tempo de leitura do disco = tempo levado pra execução


da metade do bloco 2, representado aqui por 2a

Dessa forma, observamos que o tempo T é utilizado para a


execução de uma outra tarefa, não sendo portanto, um tempo ocioso
já que a CPU não fica desperdiçando tempo, esperando um retorno
do dispositivo.

Note que quando o dispositivo externo estiver pronto para ser


utilizado, a controladora enviará um sinal de requisição de interrupção
à CPU. Em resposta a esse sinal, a CPU suspende a execução do
programa atual, desviando o controle para uma rotina que controla a
operação do disco, apenas retomando a execução do original, após
os dados terem sido obtidos do disco.

Diante desse exemplo que acabamos de apresentar, você percebe


qual o benefício que as interrupções podem introduzir nos ambientes
computacionais?

Bem, embora o uso de interrupções aumente o desempenho dos


sistemas computacionais, para que o processador passe a utilizá-las,
alguns controles de fluxos precisam ser incluídos, conforme
observamos no exemplo acima. Por exemplo, após tratar a operação
de leitura, o processador precisa saber a partir de qual instrução do
programa, ele precisará continuar.

Sendo assim, um ciclo de interrupção precisará ser incluído no ciclo


de instrução original, levando este ciclo ao esquema apresentado na
Figura 3.

72
Infraestrutura de Hardware

Figura 3 – Ciclo de execução com Interrupções

A Figura 3 nos mostra que o processador busca a próxima instrução,


a executa e em seguida, verifica se ocorreram interrupções. Caso
não haja interrupção pendente, o processador prossegue buscando a
instrução seguinte do programa corrente.

Nos casos onde há interrupção pendente, o processador realiza as


seguintes tarefas:

» Suspende a execução do programa corrente e salva o endereço


da próxima instrução a ser executada; Saiba Mais

» Configura o registrador PC para iniciar a rotina de interrupção;


O PC (Program
Counter), é um
» O processador procede, buscando a primeira instrução no registrador
programa tratador de interrupção. cujo objeivo
é armazenar
o endereço
Você pode estar pensando que a introdução de interrupções da próxima
aumenta a sobrecarga de processamento, já que instruções extras instrução.

devem ser executadas para determinar a natureza da interrupção


para então decidir a medida a ser adotada. Se você pensou assim,
você está certo. Por outro lado, do ponto de vista da CPU, há um
grande intervalo de tempo na espera de uma operação de entrada e
saída, levando o processador a obter mais eficiência com o uso de
interrupções.

73
Infraestrutura de Hardware

3.2 Múltiplas Interrupções

Observe que até o momento estamos trabalhando na ocorrência


de uma única interrupção. Você já parou para pensar no que acontece
quando uma nova interrupção é levantada durante o tratamento de
outra?

Para ficar mais fácil de entender, imagine um programa que


recebe dados por uma placa de rede e envia para escrita em disco.
A controladora do disco gera uma interrupção toda vez que completa
uma operação de escrita. A controladora da placa de rede, por sua
vez, gera uma interrupção toda vez que recebe um pacote de dados.

Para resolver esses problemas, podem ser utilizadas duas


soluções: A solução mais simples sugere que durante o tratamento
de uma interrupção ocorra a desabilitação de demais interrupções.
Dessa forma, enquanto as interrupções estiverem desabilitadas, o
processador ignora qualquer sinal de requisição de interrupção. As
interrupções ocorridas durante este intervalo ficarão pendentes e serão
verificadas pela CPU apenas após a habilitação das interrupções.
Quando o tratador de interrupções termina de manipular a primeira
interrupção, as interrupções são novamente habilitadas, possibilitando
ao processador verificar a ocorrência de novas interrupções.

Essa solução lhe parece simples? Ela de fato é simples, mas


não leva em consideração prioridades dos dispositivos. Como
sabemos, alguns dispositivos periféricos são mais rápidos que outros.
Facilmente observamos que uma impressora é um dispositivo lento
quando comparada a uma placa de rede ou teclado. Essa solução
tratará todos os dispositivos e as interrupções geradas pelos mesmos
com igual prioridade e essa é a sua desvantagem, já que não resolve
o problema de diferentes taxas de transmissão de dispositivos.

Outra solução é atribuir e considerar prioridades de interrupções.


Dessa forma, se uma interrupção está sendo tratada e uma outra ocorre
durante a sua manipulação, caso a prioridade da segunda supere a da
primeira, a primeira interrupção será suspensa temporariamente para
tratar a interrupção de maior prioridade. Terminado o processamento
da segunda interrupção, o processador retorna ao tratamento da
anterior. Caso contrário, se a segunda tiver prioridade menor que a
primeira, ela ficará aguardando a conclusão da mesma.

74
Infraestrutura de Hardware

Aprenda Praticando

Agora que você já leu a teoria e os exemplos apresentados, vamos


tentar entender os exercícios resolvidos a seguir. É interessante que
antes de observar a solução você tente sozinho resolver, para em
seguida comparar a sua solução com a proposta pelo livro.

Exercício 1

Desconsiderando o uso de interrupções, esquematize através


de um cenário a execução de um programa que possui 2
operações envolvendo E/S.

Exercício 2

Considere o programa sendo executado em uma máquina


com interrupções. Compare os dois programa, identificando os
trechos de execução que causam perda de desempenho.

Exercício 3

Considere uma versão com interrupções que demoram a ser


disparadas (situação típica de dispositivos lentos). Que situação
nova deve ser considerada no cenário?

Exercício 4

De acordo com estes cenários, o que podemos esperar, em


geral, com a introdução de interrupções.

Inicialmente você deve desconsiderar o uso de interrupções, e


esquematizar através de um cenário a execução de um programa
que possui 2 operações envolvendo entrada e saída. Lembre-se
que operações de entrada e saída podem ser leitura ou escrita de
dados, por exemplo. Você pode utilizar o mesmo raciocínio explicado
na seção 3.1 para o programa que continha uma única operação de
leitura em disco. Lembra?

Bom, então de posse de caneta e papel, vamos desenhar o


esquema de execução de nosso programa, resolvendo, portanto o
Exercício 1. Representaremos os blocos de comandos do programa
do usuário por 1, 2, e 3 e os blocos de comandos do programa de

75
Infraestrutura de Hardware

entrada e saída pelos trechos 4 e 5. Veja o esquema na Figura 4.

Figura 4 – Programa com 2 operações de E/S

O programa do nosso exemplo segue a sua execução e ao


encontrar um comando de E/S, desvia a operação de leitura para a
controladora. Durante a operação de leitura há um tempo ocioso da
CPU, pois ela continua parada, aguardando o retorno da operação
de E/S por parte da controladora. Quando a controladora concluiu a
operação de E/S, o fluxo do programa retorna novamente à CPU que
seguirá com a execução dos demais comandos.

Assim como no programa representando na seção anterior,


durante a operação de E/S haverá um intervalo de tempo (T) no qual
a CPU não poderá executar ações deste programa, devido o aguardo
do retorno da operação de E/S. Sendo assim, concluímos que a
execução do programa seguirá a seguinte sequência de execução:

1, 4, T, 5, 2, 4, T, 5, 3

Onde T = Tempo de leitura do disco

Para dar continuidade ao nosso exercício, vamos então considerar


agora que este mesmo programa esteja sendo executado em uma
CPU que faça uso de interrupções. Esse é o questionamento do

76
Infraestrutura de Hardware

Exercício 2.

Ao encontrar um comando de entrada e saída, a CPU desvia o


controle para a controladora, mas enquanto aguarda pelo retorno
da operação, ela poderá executar outras instruções daquele mesmo
programa.

Note agora que a operação de entrada e saída acontece em


paralelo ao primeiro conjunto de comandos do bloco 2. Quando a
operação de leitura termina, a controladora irá colocar um sinal no
barramento, avisando que a operação acabou.

Neste ponto, a CPU salva o contexto de execução do programa


(para saber onde o programa parou) e vai verificar o retorno da
operação de entrada e saída (Tratador de Interrupções). Após o
tratamento da interrupção, o fluxo de execução continua na instrução
imediatamente após aquela do momento da interrupção, executando
assim, o bloco de instruções representado por 2b.

Em seguida, o programa encontra a segunda operação de entrada


e saída, e novamente a CPU desvia o controle para a controladora,
e enquanto aguarda pelo retorno da operação, ela executa outras
instruções daquele mesmo programa. Vamos observar o esquema de
execução na Figura 5.

Figura 5 – Programa em Execução com 2 operações de E/S

77
Infraestrutura de Hardware

O programa da Figura 5 seguirá a seguinte sequência de


execução:

1, 4, T, 5, 2b, 4, T, 5, 3b

2a 3a

Onde T = Tempo de leitura do disco = tempo levado pra execução da


metade do bloco 2 e do bloco 3, representados aqui por 2a e 2b.

Vamos agora comparar o programa executando nas duas situações


(Exercício 1 e Exercício 2). Vamos identificar quais os trechos de
execução que causam perda de desempenho.

Observamos que o tempo T é utilizado para a execução de outra


tarefa, não sendo portanto, um tempo ocioso já que a CPU não fica
desperdiçando tempo esperando um retorno do dispositivo. Quando
o dispositivo externo estiver pronto para ser utilizado, a controladora
enviará um sinal de requisição de interrupção à CPU. Em resposta a
esse sinal, a CPU suspende a execução do programa atual, desviando
o controle para uma rotina que controla a operação do disco, apenas
retomando a execução do original, após os dados terem sido enviados
ao disco.

Dessa forma, a situação ilustrada no Exercício 2 apresenta um


tempo total de execução menor, demonstrando que o desempenho
da execução do mesmo programa no Exercício 2 foi melhor que no
Exercício 1, já que não houve tempo ocioso.

Agora vamos considerar uma versão com interrupções que


demoram a ser disparadas (situação típica de dispositivos lentos, por
exemplo impressoras). Que situação nova deve ser considerada no
cenário? Esta é a pergunta do Exercício 3.

Você sabe que alguns periféricos são mais lentos que outros, não
é? Uma impressora ou um scanner, por exemplo, são dispositivos
lentos. Neste caso, para o nosso cenário, vamos considerar que o
tempo levado para um dispositivo lento executar a operação de E/S
igual ao tempo levado para executar um bloco de comandos completo
(representado por 2 e 3) da Figura 6.

78
Infraestrutura de Hardware

Figura 6 – Programa em Execução com 2 operações de E/S

Dessa forma, a sequência de execução seguirá o fluxo exposto


abaixo, respondendo, portanto, o Exercício 3:

1, 4, T, 5,4, T, 5

2 3

Onde T = Tempo de leitura do disco = tempo levado pra execução


do bloco 2 e do bloco 3.

Por fim, de acordo com estes cenários, o que podemos esperar,


em geral, com a introdução de interrupções? Essa pergunta está
no Exercício 4 e você sem dúvida já está habilitado a responder.
Veja que a introdução de interrupções agrega mais complexidade à
execução dos programas, entretanto, os ganhos de desempenho são
notáveis, pois todo tempo de espera em operações de entrada e saída
são utilizados para a execução de outras tarefas.

Atividades e Orientações de Estudo

Dedique, pelo menos, 2 horas de estudo para o Capítulo 3.

79
Infraestrutura de Hardware

Organize uma metodologia de estudo que inicie com a leitura dos


conceitos e acompanhamento dos exercícios resolvidos.

Você poderá esclarecer suas dúvidas com o professor e os tutores


utilizando os chats e os fóruns tira-dúvidas no ambiente virtual de seu
curso.

Não esqueça de ler atentamente o guia de estudo da disciplina,


pois nele você encontrará a divisão de conteúdo semanal, ajudando-o
a dividir e administrar o seu tempo de estudo.

Observe os prazos estabelecidos pelo seu professor para essas


atividades virtuais. Lembre-se que as atividades somativas propostas
pelo professor no ambiente virtual são importantes para o aprendizado
e para a composição da sua nota.

Vamos Revisar?

Neste capítulo, você estudou as interrupções e o seu impacto na


execução dos programas.

Aprendemos que as interrupções acrescentam complexidade à


execução embora permitam que os tempos de espera por retorno
das operações de entrada e saída (executadas por periféricos) sejam
aproveitadas para a execução de outras tarefas, possibilitando, assim,
uma melhoria de desempenho.

Estudamos as técnicas existentes para o tratamento de múltiplas


interrupções e quais os impactos sofridos pelo ciclo de busca e
execução com a inserção de interrupções.

No próximo e último capítulo deste volume, você estudará os


barramentos ou estruturas de interconexões.

80
Infraestrutura de Hardware

Capítulo 4

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Princípios básicos de funcionamento das estruturas de


interconexão;

» Principais padrões comerciais de barramentos;

» Evolução histórica dos padrões comerciais de barramentos;

Metas

Após o estudo deste capítulo, esperamos que você consiga:

» Aprender os princípios básicos de funcionamento dos


barramentos;

» Compreender a evolução dos padrões de barramento sob o


ponto de vista tecnológico;

» Conhecer um pouco dos padrões comerciais de barramentos


dos últimos 20 anos até a atualidade.

81
Infraestrutura de Hardware

Capítulo 4 – Estruturas de
Interconexão

Vamos conversar sobre o assunto?

Como conversamos anteriormente, o computador é uma rede


constituída de módulos básicos: dispositivos de E/S (entrada e
saída), memória e CPU. Tais módulos precisam se conectar, para que
possam trocar dados e sinais de controle, com o objetivo de executar
programas. Então, como seria possível conectá-los?

Podem ser utilizados para isso, um conjunto de caminhos


conectando os diversos módulos. Os módulos podem transferir entre
si diversos tipos de informações. Vejamos alguns exemplos:

» Memória  CPU

■ A memória transfere dados para a CPU, por exemplo, no


momento da edição de um documento;

» E/S  CPU

■ Um dispositivo de E/S transfere dados para a CPU quando,


por exemplo, um documento está sendo editado, via teclado
ou mouse;

» CPU  Memória

■ A CPU transfere dados para memória como resultado da


edição do documento (resultado do processamento);

82
Infraestrutura de Hardware

» CPU  E/S

■ A CPU transfere dados para um dispositivo de E/S, quando,


por exemplo, um documento está sendo visualizado no
monitor;

» Memória  E/S

■ O ato de salvar um documento no disco rígido é um exemplo


de transferência de dados da memória para E/S.

» E/S  Memória

■ A abertura de um documento representa uma retirada do


arquivo do disco rígido para colocá-lo na memória. O disco
rígido representa o dispositivo de E/S.

Sendo assim, uma estrutura ou barramento de interconexão pode


ser definido como um caminho conectando dois ou mais dispositivos.
Esse caminho é um meio de transmissão compartilhado, onde diversos
dispositivos estão conectados e um sinal transmitido por qualquer
um deles é recebido por todos os outros conectados ao barramento.
Para que a transmissão de dados ocorra com sucesso apenas um
dispositivo, por vez, poderá transmitir. Podemos observar uma
imagem genérica desse meio compartilhado de transmissão de dados
na Figura 1. Nesta ilustração, representamos todos os dispositivos
periféricos por E/S. Representamos as estruturas de memórias na
caixa denominada Memória, enquanto que a caixa denominada CPU
representa a unidade de processamento de dados.

Figura 1 – Barramento

4.1 Fundamentos Básicos

Um barramento consiste em vários caminhos ou linhas de


comunicação. Cada linha transmite sinais que representam um
único dígito binário (0 ou 1). Em geral, as linhas do barramento são
agrupadas de acordo com o tipo de informação que elas transportam.
Ao longo do tempo, uma sequência de dígitos pode ser transmitida por
meio de uma linha. As diversas linhas podem ser usadas em conjunto

83
Infraestrutura de Hardware

para transmitir vários dígitos binários simultaneamente (em paralelo).


Por exemplo, uma unidade de dados de 8 bits, pode ser transmitida
por 8 linhas do barramento.

As linhas do barramento podem ser classificadas em três grupos


funcionais: dados, endereço e controle. A distribuição dessas linhas
pode ser observada na Figura 2.

Figura 2 – Linhas do Barramento

As linhas de dados fornecem o meio de transmissão de dados


entre os módulos do sistema. O conjunto dessas linhas formam
o barramento de dados, que podem conter 8, 16, 32 ou 64 linhas.
O número de linhas é conhecido como largura do barramento. Na
sua opinião, a largura do barramento interfere de alguma forma no
desempenho do sistema?

Suponha uma situação onde o barramento de dados possui


largura de 8 bits. Imagine agora que o computador em questão utiliza
instruções com 16 bits. Quantas vezes o processador tem que acessar
o módulo de memória em cada ciclo de instrução?

Neste caso, o processador teria que realizar dois acessos ao


módulo de memória, pois o barramento de dados só suporta transmitir
8 bits por vez. Como a instrução tem 16 bits, os dados são colocados no

84
Infraestrutura de Hardware

barramento agrupados de 8 em 8. Isso significa dizer que quanto mais


linhas o barramento de dados possui, ou seja, quanto mais largo ele
for, mais bits poderão ser transmitidos simultaneamente, levando-nos
a concluir que a largura do barramento tem um impacto direto no
desempenho do sistema.

As linhas de endereço são utilizadas para designar fonte e


destino dos dados transferidos pelo barramento de dados. Quando
um processador deseja ler uma palavra da memória, ele coloca o
endereço da palavra desejada nas linhas de endereço do barramento.
Como as linhas de dados e de endereços são usadas por todos os
componentes, deve existir uma maneira de controlar sua utilização.
Esta é uma das funções das linhas de controle do barramento. Elas
referem-se ao acesso e o uso das linhas de dados e endereços. Os
sinais de controle são utilizados para transmitir comandos, explicitando
quais ações serão executadas. São considerados sinais que trafegam
no barramento de controle, os seguintes exemplos:

1 Escrita na Memória (CPU para memória): Faz com que os dados


existentes nas linhas de dados do barramento sejam gravados
na posição de memória especificada nas linhas de endereço.

2 Leitura de Memória (memória para CPU): Faz com que o


valor armazenado no endereço da memória especificado nas
linhas de endereço seja colocado nas linhas de dados do
barramento.

3 Escrita de E/S (CPU para E/S): Faz com que os dados no


barramento de dados sejam enviados para uma porta de saída
(dispositivo de E/S).

4 Leitura de E/S (E/S para CPU): Faz com que os dados em um


dispositivo de E/S sejam colocados no barramento de dados.

Como o barramento é um meio de acesso compartilhado, quando


um módulo do sistema deseja enviar dados para outro, ele deverá
inicialmente obter o controle do barramento através das linhas de
controle, já que apenas um componente pode utilizar o meio em um
determinado instante. Após a obtenção do controle de acesso, o
módulo poderá transferir os dados por meio do barramento.

Da mesma forma, quando um módulo deseja requisitar dados


de outro módulo, ele também deverá inicialmente obter o controle
do barramento, para então iniciar a transferência da requisição

85
Infraestrutura de Hardware

para o outro módulo, por meio das linhas de endereço e de controle


apropriadas. Em seguida, o módulo requisitante deverá esperar que o
outro módulo envie os dados requisitados.

Toda essa operação de controle de acesso ao barramento faz


parte do protocolo do barramento. O nome que se dá a maneira pela
qual os componentes obtêm acesso ao barramento é Arbitragem.
A arbitragem irá designar um dispositivo para ser o mestre na
comunicação. O dispositivo mestre é aquele que pode iniciar uma
transferência de dados com outros dispositivos, que atuam como
escravos nessa atividade específica. Mas o que você acha que
acontece se dois ou mais dispositivos quiserem se tornar mestres ao
mesmo tempo?

Para resolver esse tipo de impasse, existem dois tipos de técnicas


de arbitragem de barramento. São elas: centralizada e distribuída.

Na arbitragem centralizada, existe um único dispositivo de


hardware, denominado árbitro que comanda a transferência de dados.
Ele é responsável por alocar tempo de utilização do barramento a
cada módulo do sistema. Já na arbitragem distribuída, não existe
um controlador central, ou seja, quando um dispositivo quer usar um
barramento, ele ativa sua linha de requisição. A linha de requisição do
barramento faz parte do conjunto de linhas de controle.

Para a arbitragem distribuída, quando nenhum dispositivo quer


utilizar o barramento, a linha de arbitragem ativada é propagada
através de todos os dispositivos. Para obter o acesso ao barramento,
um dispositivo primeiro verifica se o mesmo está disponível e se a
linha de arbitragem que está recebendo IN está ativada. Se a linha
de arbitragem IN estiver desativada, ele não poderá tornar-se mestre
do barramento. Se IN estiver ativada, o dispositivo requisita o
barramento, desativa OUT, levando todos os dispositivos seguintes na
cadeia a desativarem IN e OUT. Esse esquema pode ser observado
na Figura 3.

86
Infraestrutura de Hardware

Figura 3 – Arbitragem Distribuída

Baseando-se na arbitragem centralizada, podem ser utilizadas


2 técnicas: Arbitragem Centralizada com 1 nível e Arbitragem
Centralizada com 2 níveis. Na primeira delas (Figura 4), todos os
dispositivos são ligados em série, assim a permissão dada pelo árbitro
pode ou não se propagar através da cadeia. Cada dispositivo deve
solicitar acesso ao barramento, porém o dispositivo mais próximo
do árbitro tem maior prioridade. Uma vez que o dispositivo recebe
a permissão para acesso ao barramento, ele bloqueia o acesso dos
demais.

Figura 4 – Arbitragem Centralizada com 1 nível

A arbitragem centralizada com 2 níveis (Figura 5) possui uma


pequena variação em relação à técnica anterior, pois existem
diferentes níveis de requisição e cada dispositivo se liga a um dos
níveis. Os dispositivos com tempos mais críticos se ligam aos níveis
de maior prioridade. Se múltiplos níveis de prioridade são requeridos
ao mesmo tempo, o árbitro solta a permissão apenas para os de

87
Infraestrutura de Hardware

prioridade mais alta.

Figura 5 – Arbitragem Centralizada com 2 níveis

Hierarquia de Barramentos

O uso de barramentos traz consigo diversas vantagens que


vão desde o baixo custo na comunicação entre componentes até
a facilidade de se adicionar novos dispositivos ao computador.
Entretanto, existem desvantagens no uso dos barramentos, no
sentido de criação de gargalos na comunicação, pois a vazão máxima
no envio de dados aos dispositivos de E/S fica limitada.

Além disso, à medida que aumentamos o número de dispositivos


conectados ao barramento, a probabilidade de um dispositivo
encontrar o barramento livre para iniciar a transmissão diminui. Dessa
forma, quanto mais dispositivos conectados ao barramento, maiores
as chances de engarrafamentos e atrasos na transmissão.

Atualmente experimentamos uma tendência de crescimento do


número de dispositivos de E/S disponíveis no mercado. Se pararmos
para observar o nosso computador, constataremos que temos em
média 10 periféricos conectados (monitor, teclado, mouse, impressora,
pen drive, cd-room, disco dígido, caixas de som, microfone, webcam).
Essa realidade era diferente há 10 anos atrás.

E então, será que existe alguma forma de contornar esse


problema? Alternativas devem ser criadas para minimizar os gargalos
obtidos devido ao grande número de módulos que compartilham o
barramento. Por exemplo, podem ser utilizados barramentos de maior
largura, ou seja, mais linhas no barramento de dados, possibilitando a
transferência de mais bits por vez.

Essa primeira proposta de aumentar a largura do barramento


seria uma solução limitada, pois logo chegaríamos a uma situação de

88
Infraestrutura de Hardware

gargalo. Não sabemos quantos periféricos teremos nos próximos 5


anos!

Sendo assim, outra alternativa baseia-se no uso de múltiplos


barramentos dispostos de maneira hierárquica. A Figura 6 apresenta
uma hierarquia de barramentos.

Figura 6 – Hierarquia de Barramento

Na figura 6, observamos 4 níveis da hierarquia do barramento. O


barramento que interliga a memória e o processador se dá através
de uma ponte na memória cache (vamos estudar esse tipo de
memória em volume posteriores) e é denominado barramento local
(do inglês, local bus). O barramento do sistema (do inglês, system
bus) conecta a memória principal ao barramento de alta velocidade.
Neste último barramento estão conectados os dispositivos periféricos
que trabalham em velocidades maiores enquanto que no barramento
de expansão estão conectados os periféricos mais lentos, tais como
modems e interfaces seriais.

Temporização de Barramentos

Os barramentos coordenam a ocorrência de eventos de diferentes


formas. Esse detalhe de projeto de barramentos refere-se à
Temporização. A Temporização do barramento indica o modo pelo
qual os eventos nesse barramento são coordenados. Os barramentos
podem ser classificados como Síncrono ou Assíncrono, no que se
refere à sincronização.

Um barramento síncrono é aquele que exige que todo o tráfego de

89
Infraestrutura de Hardware

dados e controle seja sincronizado sob uma mesma base de tempo


chamada relógio (do inglês, clock). O barramento síncrono inclui uma
linha de relógio, e através dela, um relógio transmite uma sequência
alternada de 1s e 0s de igual duração. Uma transmissão de um 1 e de
um 0 (denominada ciclo de relógio ou ciclo de barramento) é definida
em um intervalo de tempo.

Todos os eventos no barramento devem começar no inicio de um


ciclo de relógio e todos os dispositivos conectados ao barramento
síncrono podem ler a linha de relógio. As atividades que ocorrem no
barramento gastam um número inteiro destes ciclos. O comportamento
temporal deste tipo de barramento é ilustrado na Figura 7.

Figura 7 – Barramento Síncrono

Analisaremos as linhas da Figura 7, de cima para baixo.


Consideraremos a primeira linha como a mais superior e assim
sucessivamente. A primeira linha da Figura 7, indica o comportamento
do relógio. A segunda linha indica o início da transferência de
dados que são apresentados na quinta linha (linha de dados). O
processador emite um sinal de leitura (terceira linha) e coloca um
endereço nas linhas de endereço. As informações contidas na quarta
linha referem-se ao endereço onde o dado será lido e por fim, a linha
de reconhecimento indica que um sinal de controle para confirmar
o recebimento foi enviado ao barramento. O processador também
emite um sinal de início para marcar a presença do endereço e de
informação de controle no barramento. Esse sinal está representado
na segunda linha superior da Figura 7.

Diferentemente do barramento síncrono, para um barramento


assíncrono não existe um relógio mestre. Os ciclos podem ter

90
Infraestrutura de Hardware

qualquer duração requerida. A ocorrência de um evento no barramento


depende de um evento ocorrido anteriormente. O funcionamento
desse barramento pode ser observado na Figura 8. Observa-se que o
processador coloca os sinais de endereço e de leitura no barramento.
Após uma pausa para estabilização desses sinais, ele emite um sinal
representado na primeira linha (de cima para baixo) indicando que os
sinais apresentados nas linhas de endereço e controle são válidos.
Esse sinal é emitido pelo dispositivo mestre. O dispositivo escravo na
comunicação responde enviando um sinal na linha SSYN (segunda
linha), indicando o envio da resposta e dos dados propriamente ditos,
contido nas linhas de dados do barramento (última linha da Figura 8).

Figura 8 – Barramento Assíncrono

Em geral, os barramentos assíncronos possuem um desempenho


superior, pois não perdem tempo com a sincronização, para permitir o
início da transferência de dados.

Tanto os dispositivos lentos quanto os rápidos, que utilizam


tecnologia mais nova ou mais antiga podem compartilhar o uso
do barramento assíncrono, pois não precisam operar segundo a
velocidade fixa do relógio. Entretanto os barramentos síncronos são
mais facilmente implementados e testados.

4.2 Barramentos Comerciais

Agora que você já conhece os princípios básicos de operação e


funcionamento dos barramentos, você irá conhecer alguns padrões
de barramentos comerciais que foram e que ainda são utilizados nos
computadores atuais.

No início dos anos 80, novas categorias de periféricos foram

91
Infraestrutura de Hardware

surgindo, com o desenvolvimento do primeiro computador pessoal


(PC-IBM). Sendo assim, foi definido o padrão de barramento ISA
(Industry Standard Architecture) desenvolvido no início dos anos 80
pela IBM nos laboratórios em Boca Raton, Florida. O ISA surgiu no
computador IBM PC (1981), na versão de 8 bits e posteriormente,
chegou ao IBM PC-AT (1984), passando a usar 16 bits de dados por
vez. A ilustração de uma placa ISA é apresentada na Figura 9.

Figura 9 – Estrutura Geral da Placa ISA: 8 bits

No barramento ISA, com 8 bits de dados, a frequência de operação


é de 8 MHz, sendo portanto, um barramento síncrono. A sua velocidade
atinge cerca de 8 Mbps e foi bastante utilizado em placas de som e
fax-modem.

No barramento ISA, com 16 bits de dados (utilizados em


processadores 286), a frequência de operação do barramento também
era 8 MHz e a velocidade atingia o dobro do ISA 8 bits, chegando a 16
Mbps. A ilustração de uma placa ISA é apresentada na Figura 10.

Figura 10 – Estrutura Geral da Placa ISA: 16 bits

Em 1987, a IBM introduziu o padrão MCA (Micro Channel


Architecture) propondo um novo barramento de dados para substituir o

92
Infraestrutura de Hardware

ISA. Esse barramento é síncrono e utiliza comunicação com palavras


binárias de 32 bits (disponível para os processadores 386) e a sua
frequência de operação é de 10 MHz. A sua velocidade de operação é
32 Mbps e foi bastante utilizada em placas de vídeo e HDs.

A COMPAQ e outros fabricantes de hardware não concordaram


com o padrão MCA da IBM, gerando um novo padrão, em 1988,
denominado EISA (Extended Industry Standard Architecture), como
resposta ao modo como a IBM pretendia fazer o licenciamento do
barramento MCA. Foi inicialmente desenvolvido pela COMPAQ com a
intenção de retirar a IBM da condução do futuro dos PCs.

Uma das grandes preocupações dos fabricantes durante o


desenvolvimento do EISA, foi manter a compatibilidade com o ISA. O
resultado foi um slot com duas linhas de contatos, capaz de acomodar
tanto placas EISA quanto placas ISA de 8 ou 16 bits, conforme
observado na Figura 11.

Figura 11 – Estrutura Geral da Placa EISA: 32 bits

Esse barramento síncrono também utiliza comunicação com


palavras binárias de 32 bits (compatível para os processadores 386)
com frequência de operação é de 8 MHz. A velocidade de operação
é 16 Mbps e era utilizado em placas de vídeo e HDs com eficiência
comparável à do padrão MCA.

Quatro anos depois (1992) surgiu um barramento específico


para uso em aplicações de vídeo, com o objetivo de melhorar o
desempenho de vídeo nos computadores pessoais. Esse padrão
foi denominado VESA (Vídeo Electronics Standards Association) e
utilizava 32 bits no barramento de dados, sendo, portanto, compatível
com os processadores 486, disponíveis na época. A frequência

93
Infraestrutura de Hardware

de operação é de 25/33 MHz, alcançando velocidade de 25/33


Mbps e sendo utilizado em dispositivos como placas de vídeo e
controladoras de disco. Apesar de ser um barramento relativamente
rápido, o VESA apresentou alguns problemas, que levaram dentre
outras consequências ao surgimento do barramento PCI (Peripheral
Component Interconnet). Este barramento manteve a mesma
frequência de operação, mas incorporou suporte nativo a plug-and-
play rompendo com o padrão ISA, o que simplificou muito a pinagem
do barramento.

O PCI foi desenvolvido pela Intel sendo também classificado como


síncrono, possuindo arbitragem centralizada, com dois níveis para
utilizar as prioridades dos dispositivos conectados ao barramento. A
Figura 12 apresenta a imagem de uma placa PCI.

Figura 12 – Estrutura Geral da Placa PCI

O PCI opera nativamente a 33 MHz, o que resulta em uma taxa


de transmissão teórica de 133 Mbps. Entretanto, assim como em
outros barramentos, a frequência do PCI está vinculada à frequência
de operação da placa-mãe. Conforme a frequência das placas foi
subindo, passaram a ser utilizados divisores cada vez maiores, de
forma a manter o PCI operando à sua frequência original. Em uma
placa-mãe operando a 133 MHz, a frequência é dividida por 4 e, em
uma de 200 MHz, é dividida por 6.

Com a evolução dos processadores, o barramento PCI foi se


tornando cada vez mais lento com relação ao processador e outros
componentes, de forma que, com o passar do tempo, os periféricos
mais rápidos migraram para outros barramentos, como o AGP
(Accelerated Graphics Port) e o PCI-Express.

O AGP foi desenvolvido com o propósito específico para o uso das

94
Infraestrutura de Hardware

placas 3D de alto desempenho. O AGP demorou a se popularizar,


pois em meados dos anos 90, as placas 3D ainda eram bastante
primitivas, de forma que ainda não existia uma demanda tão grande
por um barramento mais rápido. O padrão AGP inicial não chegou a
ser muito usado, surgindo então o padrão AGP 2X, que introduziu o
uso de duas transferências por ciclo, permitindo assim a duplicação
da taxa de transferência. Os padrões posteriores foram o AGP 4X e o
8X, que realizam, respectivamente, 4 e 8 transferências por ciclo.

Quando comparamos o AGP com o PCI, podemos dizer que o


primeiro padrão de barramento é reservado unicamente à placa
de vídeo, enquanto a taxa de transmissão do barramento PCI é
compartilhada por todas as placas PCI instaladas. Uma semelhança
entre eles é que a frequência de ambos os padrões está atrelada à
frequência de operação da placa-mãe.

O PCI Express, por sua vez, é um barramento serial, que pouco


tem em comum com os barramentos anteriores, pois é um barramento
ponto a ponto, onde cada periférico possui um canal exclusivo de
comunicação. A maioria dos barramentos estudados anteriormente
utiliza a comunicação paralela. Na comunicação paralela é possível
se transmitir vários bits por vez, enquanto que na comunicação serial
é transmitido apenas um bit por vez.

Sendo assim, em sua opinião, qual dos dois tipos de comunicação


apresenta melhor desempenho?

A princípio, a comunicação paralela aparenta-se mais rápida do que


a serial, pois transmitirá um maior número de bits por vez. Entretanto,
a comunicação paralela sofre alguns problemas impactando o
alcance de clocks maiores nas transmissões, devido a problemas de
interferência magnética e de atraso de propagação.

O atraso de propagação se dá devido ao fato dos dados transmitidos


em paralelo não chegarem ao mesmo tempo ao dispositivo de destino.
Isso ocorre porque os fios que interligam a placa-mãe ao dispositivo
através do barramento não têm exatamente o mesmo tamanho,
fazendo com que os dados transmitidos por fios mais curtos cheguem
antes dos demais, ocasionando uma espera no dispositivo, podendo
vir a comprometer o desempenho. Por esse motivo, o projeto do PCI
Express foi implementado em um barramento serial, que permite
operar com clocks maiores sem sofrer essas interferências e atrasos
de propagação.

95
Infraestrutura de Hardware

Com a evolução tecnológica, a diversidade de periféricos foi além


de dispositivos como mouse, teclado e impressora. Atualmente temos
vários outros periféricos e o número de interfaces conectadas ao
barramento de expansão deve ser bem maior para adequar a essa
necessidade. A necessidade de se ter um hardware pequeno para não
retroceder aos antigos mainframes também é um fator importante.
Os computadores não podem ter um número grande de placas
conectadas ao barramento de expansão, pois os tornariam máquinas
que ocupavam grandes espaços físicos.

Dessa forma, em 1995, para resolver estes problemas, surgiu o


padrão USB (Universal Serial Bus). Em 1997/1998, todas as placas
mães passaram a contemplar, pelo menos, duas portas USB. As
primeiras versões estabelecidas datam de 1994, entretanto as
versões que entraram para uso comercial em larga escala foram a 1.1
(setembro de 1998) e a 2.0 (abril de 2000).

O padrão USB permite fácil e rápida a conexão de diversos tipos


de aparelhos, tais como, câmeras digitais, HDs externos, pendrives,
mouses, teclados, MP3-players, impressoras, scanners, leitor de
cartões, dentre outros, utilizando o mesmo de conector para conectar
todos os dispositivos ao computador.

Além disso, com o advento do USB, deixou de ser necessário


abrir o computador e configurar jumpers e/ou IRQs para conectar
dispositivos. Os dispositivos USB são “Plug and Play”, ou seja,
são projetados para serem conectados ao computador e utilizados
imediatamente. Inclusive, é comum se encontrar portas USB em
vários outros aparelhos, como TVs, aparelhos de som, dentre outros.

Para o USB, o computador atua como um hospedeiro podendo


conectar até 127 dispositivos, diretamente ou através de Hubs
USB. Se você não sabe o que é um Hub USB não se preocupe que
falaremos dele mais adiante.

Os cabos individuais USB podem ter até 5 metros, porém ao serem


utilizados conjuntamente com os hubs, os dispositivos conectados via
USB podem ficar até 30 metros de distância do hospedeiro, ou seja,
utilizando, no máximo, seis cabos de 5 metros cada um.

Os cabos USB contam com quatro fios internos, sendo dois deles
responsáveis pela alimentação elétrica. Os outros dois referem-se a
um par trançado responsável pela transmissão de dados, conforme
podemos observar na Figura 13.

96
Infraestrutura de Hardware

Figura13 – Cabos USB

A alimentação dos dispositivos USB depende do tipo do dispositivo.


Para dispositivos como mouse e teclado, a alimentação pode ser
retirada diretamente do computador, sendo, portanto fornecida pelos
cabos de alimentação elétrica do USB. Para dispositivos com maior
consumo de energia, como impressoras e scanners, uma parte da
energia é fornecida pelo barramento e a outra parte é proveniente de
uma fonte externa.

Como os computadores possuem em geral, no máximo 5 portas


USBs, a forma de permitir que muitos dispositivos sejam conectados
ao host é através de um dispositivo que multiplique o número de portas
disponíveis. Esse dispositivo é exatamente o hub USB que falamos
anteriormente. Você poderá identificá-lo na Figura 14.

Figura 14 – Hub USB

Os dispositivos USB são Hot-Swap (conectáveis “a quente”), ou


seja, podem ser conectados e desconectados a qualquer momento.
Eles também podem ser colocados no modo sleep (hibernar) pelo
computador hospedeiro para não retirarem energia do barramento

97
Infraestrutura de Hardware

quando não estão sendo utilizados, evitando assim o desperdício.

Um exemplo de um computador hospedeiro conectando vários


dispositivos USBs diretamente e via hub é ilustrado na Figura 15.

Figura15 – Host com Dispositivos Conectados via USB

Para realizar a comunicação entre os dispositivos conectados via


USB e o computador hospedeiro é utilizado um protocolo.

Esse protocolo estabelece que para que seja iniciada a comunicação


ocorrerá o processo de enumeração. Esse processo baseia-se no

98
Infraestrutura de Hardware

fato que o computador precisa emitir um sinal para encontrar os


dispositivos conectados e estabelecer um endereço para cada um
deles. O computador hospedeiro (também denominado host) recebe a
informação de que tipo de conexão o dispositivo conectado utiliza. Ao
se conectar ao barramento USB, o dispositivo informa através desse
protocolo qual é o tipo de comunicação que será utilizada com o host.
Existem quatro possibilidades:

» Por Volume: Também conhecido como Bulk, é o tipo de


transmissão utilizada por dispositivos que lidam com grandes
volumes de dados, como impressoras e scanners. Esse método
utiliza recursos de detecção de erro, possibilitando preservar as
informações;

» Por Interrupção: Conhecido por Interrupt, é utilizado para


dispositivos que transferem poucos dados, como mouses,
teclados e joysticks

» Isócrono: Do inglês, Isochronous é utilizado em transmissões


contínuas, em dispositivos como caixas de som, por exemplo.
Não utiliza recursos de detecção de erros, para evitar atrasos
na comunicação.

» Por Controle: Utilizado para transmissão de parâmetros de


controle e configuração do dispositivo.

Quando o dispositivo é enumerado pelo host, ele informa o tipo de


comunicação que irá utilizar. Dessa forma, o host manterá um registro
da total da largura de banda que todos os dispositivos isócronos e de
interrupção exigem. Eles podem consumir até 90% da largura de banda
disponível. Passando deste limite, o host negará acesso a qualquer
outro dispositivo isócrono ou de interrupção. As transferências de
grandes volumes e de controle utilizam a largura de banda restante.

Atualmente, o USB encontra-se na versão 2.0, mas o padrão 3.0 Saiba Mais
já foi especificado, embora ainda não tenhamos disponibilidade de
dispositivos no mercado. Você sabia que
no final de 2008
foi especificado o
Após apresentarmos essa breve evolução dos padrões comerciais padrão USB 3.0?
e as características principais de cada um, passaremos para o Para consultar as
inovações desse
estudo de mais um subsistema que será apresentado no Volume 3: o padrão consulte:
http://www.
subsistema de memória. infowester.com/
usb.php.
Mas antes de passarmos ao próximo volume, é importante você
verificar os exercícios propostos na seção a seguir e tentar resolver

99
Infraestrutura de Hardware

pelo menos aquelas que foram propostas pelo seu professor, no


ambiente virtual.

Aprenda Praticando

Agora que você já leu a teoria e os exemplos apresentados,


sugerimos que você tente desenvolver algumas questões sobre
barramentos. Nesta seção é apresentada uma lista de exercícios
que você poderá tentar resolver. Caso tenha alguma dúvida, entre em
contato com o seu professor ou tutor para solucioná-la. É importante
que você passe para o módulo seguinte com todas as suas dúvidas
esclarecidas.

Lista de Exercícios

1) Explique o que você entende por barramento de um


computador

2) Com relação aos barramentos, que tipos de sinais poderão


trafegar nos mesmos e que linhas do barramento transportam
cada um desses elementos?

3) Quais os tipos de sinais de controle que podemos encontrar


nos barramentos e o que significam cada um deles?

4) Quais as vantagens e desvantagens da utilização dos


barramentos nos sistemas computacionais?

5) Qual a diferença entre barramentos síncronos e barramentos


assíncronos?

6) Para evitar que dois ou mais dispositivos tornem-se mestres


ao mesmo tempo, existe a arbitragem de barramento. Existem
duas formas de se fazer isso. Que formas são essas e como
cada uma delas funciona?

7) Quais os principais tipos de barramentos estudados?

8) Quais as principais características dos barramentos ISA e


EISA? Existe alguma compatibilidade entre eles?

9) Explique porque surgiu o barramento VL-VESA. Quantos cartões


ele suporta e como deverão ser feitas as suas expansões?

100
Infraestrutura de Hardware

10) Quais as principais características do barramento PCI?

11) Explique porque surgiu o barramento USB. Quais problemas


ele deveria solucionar?

12) Explique para que serve um hub USB. Quantos dispositivos


podem ser ligados via barramento USB direta ou
indiretamente?

13) O que significa um equipamento ser hot-swapped?

14) Como é feita a transferência de dados em um barramento


USB?

15) Cite e explique os três tipos de transferência de dados em


barramentos USB.

16) Explique qual é a motivação para a utilização de uma hierarquia


de barramentos.

Atividades e Orientações de estudo

Dedique, pelo menos, 4 horas de estudo para o Capítulo 4. Você


deve organizar uma metodologia de estudo que envolva a leitura dos
conceitos que serão ditos apresentados neste volume e pesquisas
sobre o tema, usando a Internet e livros de referência.

Os fóruns temáticos desta disciplina podem ser utilizados para


troca de informações sobre o conteúdo no ambiente virtual, pois a
interação com colegas, tutores e o professor da disciplina irá ajudá-lo
a refletir sobre aspectos fundamentais tratados aqui. Os chats também
serão muito importantes para a interação em tempo real com o seu
tutor virtual, seu professor e seus colegas.

Também é importante que você leia atentamente o guia de estudo


da disciplina, pois nele você encontrará a divisão de conteúdo
semanal, ajudando-o a dividir e administrar o seu tempo de estudo
semanal. Procure responder as atividades propostas como atividades
somativas para este capítulo, dentro dos prazos estabelecidos pelo
seu professor, pois você não será avaliado apenas pelas atividades
presenciais, mas também pelas virtuais. Muitos alunos não acessam
o ambiente e isso poderá comprometer a nota final. Não deixe que
isso aconteça com você!

101
Infraestrutura de Hardware

Considerações Finais

Olá, Cursista!

Esperamos que você tenha gostado d o segundo módulo da


disciplina Infraestrutura de Hardware. No próximo módulo, passaremos
a estudar o subsistema de memória, onde estudaremos diversos tipos
de memórias e seus princípios fundamentais.

Aguardamos sua participação no próximo módulo.

Até lá e bons estudos!

Juliana Regueira Basto Diniz


Abner Corrêa Barros

Professores Autores

102
Infraestrutura de Hardware

Referências

STALLINGS, William. Arquitetura e Organização de


Computadores. 5. ed.

PATTERSON, D. A. e Hennessy, John L. Organização e


Projeto de Computadores. LTC, 2000.

TANENBAUM, Andrew S. Organização Estruturada de


Computadores. 4. ed. Tradução Helio Sobrinho. Rio de Janeiro:
Prentice-Hall, 2001.

103
Infraestrutura de Hardware

Conheça os Autores

Juliana Regueira Basto Diniz possui graduação em engenharia


eletrônica pela Universidade Federal de Pernambuco, mestrado e
doutorado em Ciência da Computação pela Universidade Federal de
Pernambuco. Atualmente é professora da Universidade Federal Rural
de Pernambuco (UFRPE), desenvolvendo trabalhos no grupo de
Educação a Distância desta universidade. Seus temas de interesse
em pesquisa são: Sistemas Distribuídos, Computação Ubíqua e
Ensino a Distância.

Abner Corrêa Barros é mestre em Ciência da Computação com


foco em Engenharia de Hardware pelo Centro de Informática da
Universidade Federal de Pernambuco. Possui graduação em Ciência
da Computação pela mesma universidade. Atualmente é professor
da disciplina de Organização e Arquitetura de Computadores da
Faculdade Maurício de Nassau e Engenheiro de Hardware da
Fundação de Apoio ao Desenvolvimento da UFPE (FADE), atuando
em um projeto de convênio entre o Centro de Informática da UFPE
e a Petrobrás. Suas áreas de interesse e pesquisa são: Hardware
Reconfigurável, Arquitetura de Cores Aritméticas e Computação de
Alto Desempenho em Field-Programmable Gate Array (FPGA).

104
Infraestrutura de Hardware

Juliana Regueira Basto Diniz


Abner Corrêa Barros

Volume 3

Recife, 2009
Universidade Federal Rural de Pernambuco

Reitor: Prof. Valmar Corrêa de Andrade


Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski
Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire
Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos

Produção Gráfica e Editorial


Capa e Editoração: Allyson Vila Nova, Rafael Lira, Italo Amorim e Arlinda Torres
Revisão Ortográfica: Marcelo Melo
Ilustrações: Abner Barros e Allyson Vila Nova
Coordenação de Produção: Marizete Silva Santos
Sumário

Apresentação....................................................................................................4

Capítulo 1 – Hierarquia de Memória................................................................6

Hierarquia de Memória...................................................................................7

RAID Nível 0.............................................................................................22

RAID Nível 1.............................................................................................22

Disco Ótico...............................................................................................23

Fita Magnética..........................................................................................27

Pen-Driver................................................................................................27

Capítulo 2 – Memória Cache..........................................................................31

Acesso a Dados na Memória Cache............................................................32

Mapeamento de Memória.............................................................................35

Conheça os Autores.......................................................................................47
Apresentação

Caro(a) Cursista,

Estamos, neste momento, iniciando o terceiro volume do livro da disciplina de


Infraestrutura de Hardware. Neste volume iremos discutir o subsistema de memória
que constituem os computadores modernos. As memórias são subdivididas de acordo
com uma hierarquia e podem ser classificadas de acordo com uma série de critérios.
Estudaremos as memórias semicondutoras, as memórias de superfície ótica (CDs e
DVDs) e de superfície magnética (Discos rígidos).

Também abordaremos a troca de dados entre as memórias principal e a memória


cache, bem como as políticas de substituição e de escrita de dados na memória principal
e na cache.

Bons estudos!

Juliana Regueira Basto Diniz


Abner Barros

Professores Autores
Infraestrutura de Hardware

Capítulo 1

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Diversos tipos de memória que compõem o subsistema de


memória dos computadores

» Hierarquia de memória

» Troca de dados entre as estruturas de memória dos


computadores

5
Infraestrutura de Hadware

Capítulo 1 – Hierarquia de
Memória

Vamos conversar sobre o assunto?

Considere as seguintes afirmações, feitas em épocas distintas, por


alguns dos “papas“ da computação:

“Em termos ideais, desejaríamos dispor de uma capacidade


de memória infinitamente grande e que pudesse disponibilizar
imediatamente o conteúdo de qualquer de suas palavras...“

A.W.Burks, H.H.Goldstine e J. Von Neumann

“Desde o lançamento do primeiro computador, os


programadores vêm exigindo capacidades ilimitadas de memória,
de acesso quase instantâneo“

Andrew S. Tanenbaum

“...Somos forçados a reconhecer a possibilidade de construir


um sistema de memória estruturado hierarquicamente, no qual
cada um dos componentes da hierarquia tenha mais capacidade
de armazenamento e um tempo de acesso maior do que aqueles
que o precedem.”

A.W.Burks, H.H.Goldstine e J. Von Neumann

Como você deve ter percebido, a organização do sistema de


memória (tamanho da memória x velocidade de acesso) é um dos
problemas cruciais em sistemas computacionais.

De um lado precisamos de um sistema de memória com um grande


espaço de armazenamento, que possa ser acessado a altíssima
velocidade. Lembre-se que tanto os programas quanto os dados
ficarão armazenados neste sistema de memória, e que da velocidade
de acesso a estes dados depende, em última instancia, o desempenho
do computador como um todo.

Por outro, ainda não existe uma tecnologia de armazenamento


de dados que nos permita construir tais sistemas de memórias a um
custo acessível. Memórias rápidas são caras. Desta forma, como o

6
Infraestrutura de Hardware

próprio Von Neumann percebeu, ainda nos primórdios da história dos


computadores, a única alternativa viável é a construção de sistemas
de memória baseados em hierarquia, utilizando todas as diversas
tecnologias disponíveis, de tal forma a extrair o melhor de cada uma
delas.

Este portanto será o foco do nosso estudo. Conhecer as tecnologias


de armazenamento de dados atualmente disponíveis, e ver como
estas tecnologias são aproveitadas na construção da hierarquia de
memória.

Hierarquia de Memória

Quando pensamos em uma hierarquia qualquer, logo nos vem a


mente uma estrutura que dispõe os seus elementos a partir de algum
parâmetro que os distingue em grau de importância dos demais.
Na hierarquia de memória não é diferente, nela é a velocidade de
velocidade de aceso que determina o grau de importância de um
elemento e portanto o seu grau proximidade do processador. A Figura
1 a seguir nos traz os diversos elementos presentes na hierarquia de
memória dos computadores atuais.

Figura 1 - Elementos da Hierarquia de Memória

Como podemos observar, os elementos presentes na hierarquia


de memória podem ainda ser descritos como pertencentes a dois
grupos distintos: a Memória Primária e a Memória Secundária. Esta
classificação está diretamente ligada à forma como cada um destes
elementos se conecta ao sistema e, desta forma, como o processador

7
Infraestrutura de Hadware

tem acesso aos dados neles armazenados.

Fazem parte da Memória Primária os elementos aos quais


o processador tem acesso direto e imediato, ou seja, aqueles
elementos que estão conectados diretamente ao barramento de
memória do processador. É na memória primária que normalmente
ficam armazenados os dados e trechos de código dos programas em
execução.

Como podemos ver pela Figura 1, fazem parte da memória primária


o conjunto de registradores do processador, a memória cache e a
memória principal, comumente chamada de memória RAM.

Por outro lado, fazem parte da memória secundária os elementos


aos quais o processador tem acesso indireto, ou seja, aqueles que
não estão conectados ao barramento de memória do processador
mas sim à algum dos barramentos de entrada e saída do sistema.

Para que os dados armazenados nestes dispositivos se tornem


acessíveis na hierarquia de memória, é necessária a utilização de
device drivers, softwares específicos que intermediam as transações
de leitura e/ou escrita na memória entre o programa em execução
e o dispositivo aonde estão armazenados os dados. São estes
device drivers que permitem ao processador acessar aos dados
armazenados nestes dispositivos da mesma forma como acessaria
os dados armazenados na Memória Primária. Ou seja, do ponto de
vista do processador, é como se existisse apenas um único e grande
espaço de memória, compreendendo os elementos presente tanto na
memória primária quanto secundária, ao qual ele pode acessar de
maneira simples e direta.

Observe que, como falamos a princípio, o objetivo desta hierarquia


é construir um sistema de memória com as principais características
de cada um dos seus elementos, de tal forma que possa ser visto pelo
processador com um espaço de armazenamento tão grande quanto
o disponível nos elementos presentes na sua memória secundária e
com um acesso tão rápido quando o possível nos elementos presentes
na sua memória primária.

Em linhas gerais podemos considerar que, ao longo do tempo da


execução de um programa os seus dados trafegam entre os diversos
níveis desta hierarquia, vindo desde o local aonde ficam armazenados
quando não estão em uso, normalmente em algum ponto da memória
secundária, passando pela memória principal e desta para a memória

8
Infraestrutura de Hardware

cache e para o banco de registradores, onde por fim se tornam


acessíveis ao processador.

No próximo capítulo estudaremos com detalhes como se dá este


processo e quais as técnicas adotadas a fim de garantir o melhor
desempenho do sistema de memória como um todo.

Por enquanto, que tal estudarmos com um pouco mais de


detalhes alguns dos elementos presentes na hierarquia de memória
que acabamos de conhecer? Para tanto, vamos começar estudando
algumas características fundamentais dos elementos que compõem
o sistemas de memória dos computadores atuais. A Figura 2 a seguir
nos traz um pequeno resumo destas características.

Figura 2 - Características fundamentais dos elementos do sistema de memória

» Localização: Esta característica está diretamente relacionada


com a localização física do elemento de memória no sistema
computacional, ou seja, se este é interno ao processador como
no caso dos registradores, externo ao processador mas com
conexão direta ao barramento de memória deste, sendo desta
forma considerado como pertencente a memória interna do
computador, ou ainda um elemento de armazenamento externo
conectado ao sistema através de um dos barramentos de
entrada e saída.

» Capacidade: Normalmente expressa em bytes, mas podendo


ser expressa também diretamente em bits ou em palavras de
16, 32 ou 64 bits, esta característica revela a capacidade de
armazenamento de informações de um determinado elemento

9
Infraestrutura de Hadware

de memória. Não é por acaso que esta é talvez a característica


que mais interesse aos usuários comuns de computadores.
Observe entretanto que possuir um computador com uma
grande capacidade de memória não é, obrigatoriamente,
sinônimo de possuir um computador de grande desempenho.

» Unidade de transferência: Esta característica esta associada


a como a informação é transferida de/para o elemento de
memória. Como já estudamos anteriormente, apesar de a
unidade básica de informação nos computadores ser o bit, a
unidade básica de manipulação da informação, ou seja, a
unidade endereçável, é determinada a partir do tamanho da
palavra do processador adotado. Por outro lado, por motivos
de desempenho, conforme veremos mais a frente no próximo
capítulo, os dados são normalmente transferidos em blocos
contendo várias palavras formando assim uma unidade de
transferência de dados.

» Método de acesso: Esta característica determina como se


dará o acesso aos elementos de memória, ou às suas unidades
endereçáveis. Existem a princípio quatro forma de acesso aos
dados, são elas:

○ Acesso sequencial: no acesso sequencial uma


determinada posição N de memória só pode ser acessada
após ter-se acessado a posição N-1. Sistemas que adotam
este tipo de acesso armazenam juntamente com o dado
um registro de informação que contem o seu endereço de
acesso. Desta forma, para se acessar uma determinada
posição de memória deve-se ir acessando uma a uma
todas as posições que a antecedem, lendo sempre o seu
identificador, até alcançar-se o bloco desejado. Exemplo de
dispositivo de armazenamento de acesso sequencial: Fita
Magnética.

○ Acesso direto: o acesso direto pode ser considerado


uma evolução do acesso sequencial. Nele os dados são
organizados em blocos maiores, ou clusters, os quais
possuem uma localização física conhecida no meio de
armazenamento. Dentro do bloco os dados são acessados
sequencialmente conforme acabamos de descrever.
Exemplo de dispositivo de armazenamento de acesso
direto: Disco Magnético.

10
Infraestrutura de Hardware

○ Acesso aleatório: no acesso aleatório cada elemento


de armazenamento possui um endereço único pré-
determinado a partir da posição que este ocupa da
estrutura do dispositivo que o implementa e podendo desta
forma ser acessado diretamente, em qualquer sequencia,
independente da posição de memória anteriormente
acessada. Exemplo de dispositivo de armazenamento de
acesso aleatório: Memória principal, também conhecida Saiba Mais
como memória RAM (Random Access Memory)1.
Pesquise
1

○ Associativo: no acesso associativo pode ser visto como na Internet o


significado da
uma junção do acesso direto com o acesso aleatório. Nos expressão:
sistemas que adotam o acesso associativo cada posição de Random Access
Memory
memória possui alem do espaço para o armazenamento da
informação propriamente dita, um espaço para o endereço
associado aquela informação. Desta forma, os espaços
de armazenamento não tem mais um endereço fixo como
acontece no acesso aleatório, podendo ser utilizados de
uma maneira muito mais eficiente. O acesso aos dados
é feito comparando-se o endereço da informação que
se deseja acessar com os endereços associados aos
elementos armazenados. Esta comparação pode ser feita
simultaneamente com todos os elementos de memória,
o que permite um acesso rápido e eficiente dos dados
armazenados. Exemplo de dispositivo de armazenamento
de acesso associativo: Memória cache. Mais a frente, no
próximo capítulo, estudaremos em detalhes a memória
cache e o como o endereçamento associativo é importante
para o funcionamento deste tipo de memória.

» Desempenho: Juntamente com a sua capacidade de


armazenamento, o desempenho é a característica mais
importante de uma memória. O desempenho de uma memória
pode ser medido a partir de três medidas básicas descritas a
seguir:

○ Tempo de acesso: tempo necessário para se concluir um


acesso de escrita ou leitura a uma posição de memória.

○ Tempo de ciclo de memória: é o tempo necessário para


se fazer dois acessos seguidos à memória.

○ Taxa de transferência: é a taxa ou velocidade com que

11
Infraestrutura de Hadware

os dados podem ser transferidos de ou para a memória. A


taxa de transferência é diretamente afetada pelo tempo de
acesso, pela tempo de ciclo de memória e pela unidade de
transferência de dados na seguinte relação:

Figura 3 - Taxa de transferência

» Tecnologia: A tecnologia de construção de um elemento de


memória tem impacto direto sobre todas as sua características.
Normalmente uma tecnologia que apresenta excelentes
resultados em determinado parâmetros não apresenta tão bons
resultados em outros parâmetro. Por exemplo: os elementos de
armazenamento baseados na tecnologia Magnética costumam
ter um excelente custo de implementação, apresentado assim
um baixo custo por bit, entretanto o seu tempo de acesso
costuma ser da ordem de milhares de vezes mais lento que os
das memórias baseadas na tecnologia de semi-condutores. As
principais tecnologias atualmente empregadas na construção
de elementos de memória são:

○ Semicondutor: Atualmente existe um grande número de


dispositivos de armazenamento construídos a partir da
tecnologias baseadas em semicondutores, entretanto as
principais, do ponto de vista da construção da hierarquia de
memória dos computadores são os dispositivos construídos
a partir das seguintes tecnologias:

» Capacitiva: Esta tecnologia tem dominado o mercado de


fabricação das memórias tipo DRAM (Dynamic Random Access
Memory), ou seja, das memórias de armazenamento dinâmico
e acesso randômico, desde o seu lançamento no iníco da
década da 70 do século passado. Nela a unidade básica de
informação, o bit, é armazenado em capacitores construídos
diretamente na pastilha de silício dos componentes de memória.
A grande vantagem desta tecnologia é a sua alta densidade
de armazenamento por área de silício, o que reduz em muito
o preço por bit armazenado. Seu tempo de acesso e taxa de

12
Infraestrutura de Hardware

transferência, ainda que superior a grande maioria das outras


tecnologias, não tem conseguido acompanhar a velocidade
dos processadores atuais, sendo menor que os apresentados
nas memórias construídas a partir de Flip-Flops, motivo pelo
qual esta tecnologia ocupa o ponto mediano da hierarquia de
memória.

» Flip-Flop: Esta tecnologia é a que apresenta as melhores


taxas de acesso e de transferência dentre todas as tecnologias
atualmente disponíveis, entretanto devido a sua baixa densidade
de armazenamento, cada bit de memória ocupa muita área na
pastilha de silício, o seu custo por bit armazenado é também o
mais caro entre todas as tecnologias atualmente empregadas.
Desta forma, esta tecnologia é normalmente empregada apenas
na construção dos dispositivos que ocupam o topo da hierarquia
de memória, ou seja, dos registradores e da memória cache.

○ Magnética: Esta tecnologia tem sido desde o seu


lançamento a principal tecnologia para a construção de
elementos de armazenamento persistente da informação
(Programas e Dados). Nela a informação é armazenada
mudando-se a orientação do campo magnético de
partículas de material Ferri-magnético depositados nas
mídias magnéticas. A grande vantagem desta tecnologia
é o seu baixo custo de construção e sua alta densidade
de armazenamento, o que resulta em um baixíssimo custo
por bit armazenado. Os principais dispositivos construídos
com esta tecnologia são os discos rígidos, os discos
flexíveis e as fitas magnéticas. A principal desvantagem
desta tecnologia são o seu alto tempo de acesso e de ciclo
de leitura e escrita, o que resulta em uma baixa taxa de
transferência.

○ Ótica: A tecnologia de armazenamento em mídias óticas


surgiu como uma alternativa ao armazenamento de dados
permanentes em mídias magnéticas, principalmente
em substituição às mídias removíveis. Suas principais
características são sua alta densidade de armazenamento
e sua capacidade de manter os dados praticamente
inalterados por tempo infinitamente longos se comparados
as demais tecnologias, desde que armazenados de
maneira adequada. Na tecnologia ótica a unidade básica

13
Infraestrutura de Hadware

de informação é armazenada a partir da mudança do índice


de refração da luz da mídia no pondo aonde a informação é
gravada. Atualmente os principais dispositivos construídos
com esta tecnologia são os CDs, DVDs e Blue-Rays.

» Características Físicas: As características físicas da


tecnologia empregada na construção dos elementos de
armazenamento determinam a persistência e a volatilidade da
informação armazenada. Desta forma, as memórias podem ser
classificadas em:

○ Voláteis ou não-voláteis: Dizemos que uma memória é


volátil quando esta depende de algum estímulo externo,
denominado de ciclo de refresh, para manter os dados nela
armazenados. São portanto não-volátil todas os demais
tipos de memória que não dependem de tais estímulos
para manter os dados armazenados. Atualmente apenas as
memórias DRAM, as quais são construídas com tecnologia
capacitiva são consideradas memória voláteis.

○ Apagáveis ou não apagáveis: Esta característica quase


que dispensa qualquer comentário, desta forma, apenas
ressaltaremos que atualmente apenas alguns tipos de
mídias óticas e alguns tipos de memórias baseadas em
semi-condutores podem ser consideradas como memórias
não apagáveis, uma vez que os dados nelas gravados não
podem ser alterados de tal forma que possamos utilizá-las
para outro fim. Todas os demais tipos de memória podem
ser consideradas como memórias apagáveis.

» Organização: A organização da memória é a característica que


reflete como os bits de memória estão dispostos, ou seja, qual
o tamanho da palavra de dados com o qual a memória pode ser
acessada. Observe a Figura 4 a seguir, nela podemos ver três
formas distintas de organização de uma memória com 96 bits
de armazenamento.

14
Infraestrutura de Hardware

Figura 4 - Três formas distintas de organizar uma memória com 96 bits de armazenamento

Muito bem, agora que já conhecemos as principais características


dos elementos que compõem um sistema de memória, estamos
prontos para estudar os principais tipos de elementos de memória
utilizados na construção da hierarquia de memória.

Vamos começar nosso estudo pelos elementos que compõem a


memória primária da nossa hierarquia de memória:

Memória Primaria

Conforme dissemos no início deste capítulo, fazem parte da


Memória Primária os elementos aos quais o processador tem acesso
direto e imediato, ou seja, aqueles elementos que estão conectados
diretamente ao barramento de memória do processador. Por este
motivo a memória primária também recebe o nome de memória
interna. Tomando como referência a hierarquia disposta na Figura 1,
vamos estudar primeiramente os registradores, em seguida a memória
cache e por último a memória principal.

Registradores

Como podemos observar pela Figura 1, os registradores são os


elementos mais próximos do processador, ocupando assim o topo da
nossa hierarquia de memória. Os registradores nada mais são que
palavras de memória construídas com tecnologia de semicondutores,
Flip-Flops, diretamente na pastilha de silício do processador, sendo
desta forma os elementos de memória de acesso mais rápido em
toda a hierarquia de memória. A maioria dos registradores presentes
em um processador são dispostos na forma de um banco de memória
de acesso aleatório, organizado em palavras do tamanho exato da
palavra do processador, as quais são acessíveis uma a uma em
unidades de transferência também do tamanho exato da palavra do

15
Infraestrutura de Hadware

processador. Os registradores são considerados memórias apagáveis


e não voláteis

Memória Cache

A memória cache é um espaço de memória, organizado na forma


de bancos de memória, normalmente construída em dois ou três
níveis, um diretamente na pastilha do processador, chamada de
cache L1, e os demais, denominados de cache L2 e L3, construídos
como componentes a parte do processador. Conforme dissemos
anteriormente, da mesma forma que os registradores, a memória
cache é construída com tecnologia de semicondutor, Flip-Flop, com
acesso associativo, e organizado em palavras com tantos bits quantos
necessários para armazenar uma ou mais palavras do processador
e uma referencia ao endereço de memória associado aos dados
armazenados. Dada a sua importância para o desempenho da
hierarquia de memória como um todo, a memória cache será estudada
em maiores detalhes no próximo capítulo.

Memória Principal

A memória principal, como o próprio nome sugere é o elemento


central da hierarquia de memória. Ë na memória principal que
normalmente ficam armazenados os trechos de código e os dados
dos programas em execução.

Em linhas gerais, podemos dizer que a memória principal e o


banco de registradores são os únicos espaços de memória que o
processador realmente identifica como tal. Tanto a memória cache
quanto os elementos de armazenamento presentes na memória
secundária existem a fim de melhor as características de velocidade
de acesso e de espaço de armazenamento da memória principal. O
que se busca com a hierarquia de memória é que o processador veja
a memória principal com a velocidade de acesso da memória cache e
o espaço de armazenamento da memória secundária.

Atualmente a memória principal é formada primeiramente a partir


da utilização de chips de memória DRAM, formando bancos de
memória que podem variar de centenas de Mega-Bytes à Dezenas de
Giga-Bytes de memória. Conforme já foi dito, as memórias DRAM são
memórias construídas com tecnologia de semicondutor, capacitiva,
voláteis e apagáveis, de acesso aleatório, organizadas e acessadas
normalmente em palavras do tamanho da palavra do processador

16
Infraestrutura de Hardware

utilizado.

Entretanto, existem também um outro tipo de memória que faze


parte da memória principal, na qual fica armazenado o Sistema Básico
de Entrada e Saída da placa mãe, também conhecido como BIOS
(Basic Input Output System). O BIOS é gravado em uma memória
construída com tecnologia de semicondutor, não apagável, somente
de leitura denominada de memória ROM (Read Only Memory). Assim
como a memória DRAM a memória ROM é uma memória de acesso
aleatório, organizada e acessada em palavras do tamanho da palavra
do processador, na qual fica gravado permanentemente o programa
responsável pela verificação inicial da integridade dos componentes
básicos da placa mãe e pela carga inicial do sistema operacional.

Memória Secundária

A memória secundária é formada pelos elementos de memória


que não estão diretamente conectados ao barramento de memória
do processador, sendo desta forma acessados de maneira indireta
a partir do barramento de entrada e saída. De um modo geral
podemos dizer que a memória secundária é formada por elemento
de armazenamento de massa, tais como disco rígido e fita magnética,
e pelos elementos de armazenamento removíveis, tais como discos
flexíveis, discos óticos e pen-drivers. Por não estarem diretamente
conectados ao barramento de memória do processador, estes também
são conhecidos como memória externa.

Ainda seguindo a ordem apresentada na Figura 1, estudaremos


primeiramente os Discos Magnéticos, em seguida os Discos Óticos,
as Fitas Magnéticas e por fim os pen-drivers.
Saiba Mais

Disco Magnético 2
Conheça
um pouco da
Conforme já dissemos, os discos magnéticos recebem esta história, com
designação por armazenarem a informação a partir da mudança da fotos, dos
primeiros discos
orientação magnética de minúsculos partículas Ferri-magnéticas Magnéticos.
depositadas sobre uma mídia suporte. Visite o site http://
www-03.ibm.
com/ibm/history/
Desde o seu lançamento, feito pela IBM em meados da década de exhibits/storage/
50 do século passado, os discos Magnéticos evoluíram2 muito, tendo storage_350.html
o seu tamanho sido reduzido a frações do tamanho original ao mesmo
É realmente
tempo em que sua capacidade de armazenamento e velocidade de muito
acesso foram aumentadas de centenas à milhares de vezes a dos interessante!

primeiros dispositivos. Os primeiros discos apresentados mediam

17
Infraestrutura de Hadware

60x68x29 polegadas, aproximadamente 152x172x74 cm, e tinham


uma capacidade de armazenamento de 50 MB de informação.

Ao longo do tempo foram surgindo diversas variantes para este tipo


de dispositivo, sendo os mais importantes o discos flexível, também
chamado de disquete, e o disco rígido, nosso conhecido HD. Dada a
sua importância, tanto no contexto histórico quanto no contexto atual,
aqui estudaremos apenas os discos rígidos.

A Figura 5 a seguir nos traz um esquema simplificado da estrutura


interna de um disco rígido. Como podemos perceber, seus principais
componentes internos são a mídia magnética, o motor de tração da
mídia, também conhecido como spinde motor, a cabeça de leitura
e escrita e o dispositivo de posicionamento da cabeça, também
conhecido como voice coil.

Figura 5 – Estrutura interna de um disco rigido

A fim de aumentar a capacidade de armazenamento do disco,


os dois lados da mídia magnética são utilizadas como discos
independentes, cada qual sendo acessada por sua própria cabeça de
leitura e escrita. É comum também utilizar-se um conjunto com várias
mídias em conjunto, presas ao eixo de um único motor de tração, as
quais são acessadas por um conjunto de cabeças de leitura e escrita
controladas por um único dispositivo de posicionamento. A Figura 6 a
seguir pode nos dar uma ideia de como este conjunto fica disposto no
interior do disco rígido.

18
Infraestrutura de Hardware

Figura 6 - Disposição das mídias Magnéticas e das cabeças de gravação e leitura de um


disco rígido

O princípio de funcionamento de um disco rígido é de certa forma


até bem simples. Conforme dissemos a princípio, os bits de dados
são gravados na mídia alterando-se o sentido do fluxo magnético do
material Ferri-magnético que está depositado sobre esta, da mesma
forma como se grava uma informação de áudio em uma fita magnética.
A fim de permitir o acesso ordenado dos dados gravados, estes ficam
organizados em blocos denominados de setores do disco, os quais
são gravados em regiões distintas da mídia denominadas de trilhas.
A Figura 7 a seguir nos traz um diagrama simplificado de como fica
a disposição das trilhas e setores do disco. Observe que cada trilha
nada mais é que a região disposta sob a cabeça de leitura e escrita
durante o processo de rotação que a mídia sofre ao ser tracionada
pelo eixo do motor. Observe ainda que cada trilha, por sua vez, é
dividida em pequenas regiões ou setores, aonde são gravados os
dados.

Desta forma, o processo de acesso aos dados gravados no disco


exige primeiramente que a cabeça de leitura e escrita seja posicionada
sobre a trilha onde se encontra o setor com os dados. Isto é feito
variando-se a corrente elétrica aplicada ao voice-coil. Em seguida,
simplesmente aguarda-se que o setor com os dados passe sob a
cabeça de leitura e escrita, a qual converte o fluxo magnético presente
na mídia em corrente elétrica que é enviado à placa controladora do
disco para por fim ser convertido novamente em informação lógica. O
processo de escrita é análogo a este, com exceção que em vez de ler
a informação, a cabeça de leitura e escrita irá gravar a informação no
setor desejado.

19
Infraestrutura de Hadware

Figura 7 - Organização dos dados na mídia

Apenas para concluir, na Figura 8 a seguir, temos uma visão mais


detalhada da organização dos dados nos setores do disco. Observe
que antes dos dados propriamente ditos cada setor do disco tem uma
região com um preâmbulo, ou seja, uma região com um padrão de
gravação previamente estabelecido que permite identificar o ponto
aonde começa o setor e qual a sua identificação. E, após a região
aonde os dados estão gravados temos uma região com um código de
verificação de erro também conhecido como ECC. O ECC é utilizado
tanto para a verificação da integridade dos dados gravados quanto
para uma possível recuperação dos mesmos. Ainda como medida
de segurança, a fim de melhor demarcar a região ocupada por cada
setor, sempre entre dois setores existe uma região que é deixada sem
gravação conhecida como gap de interseção.

Figura 8 - Organização dos dados nos setores do disco

Conforme citamos na introdução desta seção, com o passar do

20
Infraestrutura de Hardware

tempo a evolução dos discos rígidos não se deu apenas com vista a
redução de suas dimensões físicas e no aumento da sua capacidade
de armazenamento. Houveram também avanços significativos na taxa
de transferência dos dados e na redução das taxas de erro de leitura
e escrita dos dados.

Sendo o disco rígido basicamente um elemento de memória,


como é de se esperar, é de suma importância que os dados nele
armazenados possam ser recuperados de maneira rápida e livre de
falhas.

Observe que a princípio a taxa de transferência dos dados entre a


mídia e o sistema é função direta da velocidade de rotação desta e da
área física ocupada pela unidade básica de informação gravada. Ou
seja, quanto menor a área ocupada por um bit de informação e quanto
mais rápido a mídia passar na frente da cabeça de leitura e gravação,
maior é a taxa de transferência dos dados.

Atualmente a área ocupada por um bit de informação está na


ordem do micrometro e a rotação da mídia na ordem das 10.000
rotações por minuto.

Por outro lado, quanto menor a área ocupada por um bit de


informação na mídia e quanto maior a velocidade de rotação da mídia
maior é o risco de ocorrer falhas de gravação e escrita.

Desta forma, historicamente o mercado de discos rígidos teve


sempre que buscar um ponto de equilíbrio entre a taxa de transferência
e a segurança dos dados. Discos rápidos e seguros eram caros,
discos baratos ou não eram rápidos ou não eram seguros.

Pensando nisto, no fim da década de 80 do século passado, um


dos inventores dos processadores RISC, David Patterson, propôs
uma nova arquitetura para os discos rígidos que permitiria aumentar
a velocidade de transferência dos dados ao mesmo tempo em que
aumentaria a segurança dos dados gravados, tudo isto a custa de
inserir uma certa taxa de redundância nos dados gravados de tal
forma que estes pudessem ser acessados em paralelo, e não mais
sequencialmente como de costume, e que na ocorrência de uma falha
os dados pudessem ser recuperados mais facilmentes. Esta nova
arquitetura recebeu o nome de RAID (Redundant Array of Independent
Drives).

A proposta de Patterson na verdade apresentava não apenas

21
Infraestrutura de Hadware

uma, mas sete possibilidades diferentes de organizar um conjunto


de discos rígidos a fim de explorar diferentes níveis de segurança e
taxas de transferência dos dados. Veremos aqui apenas duas destas
propostas que ficaram conhecidas como RAID 0 e RAID 1.

RAID Nível 0

A proposta da RAID 0 visa basicamente aumentar velocidade de


acesso aos dados, ou seja, a taxa de transferência, sem entretanto
apresentar nenhuma alteração no nível de segurança dos mesmos.

Conforme podemos ver pela Figura 9 a seguir, nesta proposta,


os discos são internamente divididos em áreas, chamadas de strip.
Observe que no exemplo apresentado na figura nós temos quatro
discos rígidos os quais foram divididos em 16 strip’s. Veja que, se
fosse possível dividir um arquivo em diversos arquivos menores, que
estivessem distribuídos pelas strip’s dos quatro discos, poderíamos
acessar 4 partes do arquivo simultaneamente, uma de cada disco,
aumentando assim em quatro vezes a nossa velocidade de leitura e/
ou leitura.

Figura 9 - Organização dos dados na RAID 0

RAID Nível 1

A proposta da RAID 1 é muito semelhante a anterior, e visa


aumentar velocidade de acesso ao mesmo tempo em que busca
aumentar o nível de segurança dos mesmos.

Conforme podemos ver pela Figura 10 a seguir, nesta proposta, os


discos também são internamente divididos em áreas, só que alem dos
quatro discos iniciais temos mais quatro discos divididos exatamente
como os quatro primeiros. O objetivo aqui é que este segundo conjunto
de discos sirva como armazenamento de segurança para os dados
gravados nos primeiros discos. Desta forma, sempre que um dado é

22
Infraestrutura de Hardware

gravado ou alterado no primeiro conjunto de discos o mesmo também


é gravado ou alterado no segundo conjunto, de tal forma que caso seja
identificado alguma falha nos dados gravados tanto no primeiro como
no segundo conjunto de discos, a copia existente no outro conjunto
de discos possa ser utilizada para recuperar a falha identificada.

Figura 10 - Organização dos dados na RAID 1

Como você deve ter percebido, a utilização de uma arquitetura


RAID exige a utilização de um controlados especial, um hardware
dedicado, responsável por prover tanto a leitura e/ou leitura simultânea
das strip’s nos discos, como por prover as verificações e correções de
segurança necessárias nos arquivos gravados.

Disco Ótico

Os discos óticos recebem este nome por utilizarem a refração da


luz como meio de gravação e leitura dos dados na mídia, ou seja,
apenas como um recurso didático podemos pensar que se a luz reflete
na mídia temos um bit zero e se a luz não reflete temos um bit um.
A Figura 11 a seguir pode nos dar uma ideia melhor do que estamos
falando.

Figura 11 - Gravação dos dados na mídia ótica

23
Infraestrutura de Hadware

Diferentemente dos discos magnéticos, onde os dados são


gravados em trilhas concêntricas, nos discos óticos os dados são
gravados sequencialmente em uma trilha espiral única que se projeta
no centro para a borda do disco. Devido a isto, a fim de evitar que a
velocidade de leitura e/ou escrita do disco varie ao longo da trilha, a
velocidade de rotação do disco varia, de forma a manter a taxa de
gravação e/ou leitura aproximadamente constante.

O processo de leitura de uma mídia ótica se dá pela através de


uma cabeça ótica de leitura e escrita, conforme podemos ver pela
Figura 12 a seguir. Nesta figura temos um esquema simplificado,
em corte dos elementos que formam esta cabeça ótica de leitura e
escrita. Observe que temos uma fonte de luz lazer a qual é aplicada
diretamente sobre a mídia e uma célula foto sensível que detecta se
a luz projetada reflete ou não na mídia. Na verdade, para que a luz
possa refletir na mídia esta possui uma camada de material reflexivo
colocada após a camada aonde os dados estão gravados, no lado
oposto aonde incide o lazer. Dependendo assim do dado gravado,
se é um bit zero ou um bit um, a luz aplicada pelo lazer pode ou não
transpassar a região aonde o dado está gravado, refletindo assim na
camada reflexiva, e retornando em seguida para ser conduzida pelo
espelho prismático à célula foto sensível.

Figura 12 - Estrutura de uma cabeça ótica de leitura e escrita

Do ponto de vista do método de gravação, existem atualmente


no mercado três tipos de mídias óticas, as mídias apenas para
leitura, também conhecidas como mídias ROM, as mídias graváveis,

24
Infraestrutura de Hardware

conhecidas como mídias R, e as mídias regraváveis, conhecidas


como mídias RW.

As mídias ROM tem o seu conteúdo gravado por processo de


prensagem no seu substrato durante a sua fabricação. A estrutura de
uma mídia ROM com dupla face e dupla camada de gravação pode
ser visto na Figura 13 a seguir. Como você pode observar, esta mídia
é formada por várias camadas de policarbonato, o qual é moldado
internamente com a informação a ser gravada, por este motivo diz-se
que os dados gravados em uma mídia ótica deste tipo não podem ser
afetados por arranhões ou riscos acidentais em sua superfície, uma
vez que estão gravados no interior do disco e não em sua superfície.

Figura 13 - Estrutura de uma mídia ROM

Tanto as mídias R como as RW possuem uma estrutura interna


conforme podemos ver na Figura 14 a seguir. Nestes tipos de mídias
tanto o processo de leitura quanto o de gravação é ótico feito a partir
da aplicação de luz lazer. Como podemos ver pela figura, estas mídias
possuem 4 camadas. A primeira, que serve de suporte às demais, é
um substrato de policarbonato. A segunda camada é a camada foto
sensível. A terceira camada é a camada reflexiva, e por último temos
mais uma fina camada de policarbonado que serve de proteção à
camada reflexiva.

Nas mídias tipo R a camada foto sensível recebe uma aplicação


de corante foto sensível, normalmente cianina ou ftalocianina. Desta
forma, ao receber uma aplicação da luz lazer de alta intensidade, o
que ocorre durante o processo de gravação, o corante modifica a sua
cor, tornando-se opaco, permitindo assim a gravação da informação
na mídia. Durante o processo de leitura aplica-se uma luz lazer de
baixa intensidade, a qual não é suficiente para sensibilizar o corante
presente na camada fotosensíve.

25
Infraestrutura de Hadware

Nas mídias RW a utiliza-se uma mistura de prata, índio, antimônio


e telúrio no lugar do corante como camada foto sensível. Esta liga
tem a propriedade de mudar o seu estado de cristalino para amorfo
quando exposto a luz lazer intensa, o que ocorre durante o processo
de gravação, e de retornar ao estado cristalino se exposto a luz lazer
moderada, o que ocorre durante o processo de apagamento do disco.
O restante do processo de leitura e escrita é semelhante aos demais
tipos de mídias óticas.

Figura 14 - Estrutura das mídias tipo R e RW

Por fim, vale um comentário a respeito das diferenças existentes


entre os CDs, DVDs e Blue Rays.

A princípio, todos funcionam da mesma forma, conforme já foi


descrito. A grande diferença está no comprimento de onda do lazer
utilizado e no tamanho da região física utilizada para gravar um bit de
informação. A Figura 15 a seguir demonstra estas diferenças.

Figura 15 - Diferenças entre CDs, DVDs e Blue Rays

26
Infraestrutura de Hardware

Fita Magnética

As fitas Magnéticas são a mais antiga forma de armazenamento


de dados ainda em uso. Este meio de armazenamento foi inventado
no início da década de 50 do século passado.

Assim com os discos magnéticos as fitas magnéticas utilizam a


mudança da orientação magnética de algum tipo de material ferri-
magnético como meio de gravar a informação na mídia suporte.

Apesar de toda evolução dos outros meios de armazenamento, as


fitas Magnéticas ainda apresentam inúmeras vantagens, tais como:
grande capacidade de armazenamento, baixo custo por unidade
armazenada, longa expectativa de vida e a confiabilidade na retenção
dos dados ao longo de sua vida útil. Por este motivo ainda são um
dos meios mais utilizados como meio de armazenamento removível
para grandes volumes de informação e onde se necessita garantir
Saiba Mais
maior segurança aos dados armazenados.
Conheça um
3

Pen-Driver pouco da história


dos pen-drivers
no link http://
Conhecido pelos nomes de Pen-Driver, USB Flash Driver, Flash pt.wikipedia.org/
wiki/USB_flash_
Driver, Thumb-driver entre outros nomes, este dispositivo faz parte drive
da nova geração dos meios de armazenamento, construídos com o
uso de memória não volátil baseada em semicondutor3. A Figura 16 a
seguir nos traz o formato de um pen-driver típico, ainda que hoje em
dia não é incomum ver pen-drivers com as mais variadas formas.

Desde o seu lançamento no ano de 2000 pela IBM, os pen-drivers


evoluíram substancialmente, passando de 8MB para atuais 128 GB
de memória.

Devido a sua flexibilidade de uso, alta capacidade de


armazenamento e à redução de custo pelo qual tem passado, os pen-
drivers são a mídia removível preferida pela maioria dos usuários de
computadores pessoais.

27
Infraestrutura de Hadware

Saiba Mais Figura 16 - Pen-Driver tipico

4
Você sabe o que
Conforme podemos ver pela Figura 17 a seguir, a estrutura interna
é uma memória
FLASH? de um pen-driver é bastante simples, composta basicamente de um
Conheça um
controlador UBS e de um ou dois chips de memória FLASH4.
pouco mais
sobre este tipo
de memória
visitando a
página

http://
pt.wikipedia.org/
wiki/
Mem%C3%
B3ria_flash

Figura 17 - Estrutura interna de um pen-driver

Vamos Revisar?

Neste capítulo você conheceu a hierarquia de memória e


seus principais componentes. Viu que o sistema de memória dos
computadores atuais é formado conjuntamente pela memória primária
e pela memória secundária. E que a memória primária é formada
pelos elementos de memória que estão conectados diretamente ao
barramento de memória do processador, ao passo que a memória
secundária é formada pelos elementos de memória que estão
conectados ao processador indiretamente através do barramento de
entrada e saída.

Neste capítulo você também pôde perceber que o objetivo da


hierarquia de memória é apresentar ao processador um sistema de
memória com uma velocidade de acesso próxima à da memória cache
e com um espaço de armazenamento tão grande quanto o disponível

28
Infraestrutura de Hardware

nos elementos da memória secundária.

Você aprendeu também que a memória primária é formada pelo


conjunto de registradores, pela memória cache e pela memória
principal. E que a memória secundária, atualmente é formada pelo
disco rígido, pela unidades óticas (CD, DVD e Blue-Ray), pela fita
magnética e pelos pen-drivers.

Por fim, você conheceu os detalhes de construção e a tecnologia


empregada em cada um dos elementos de memória apresentados,
indo desde as memória baseadas em semicondutores, passando pela
memória de armazenamento em mídia magnética e concluindo com a
memória de armazenamento ótico.

29
Infraestrutura de Hadware

Capítulo 2

O que vamos estudar?

Neste capítulo, vamos estudar os seguintes temas:

» Diversos tipos de memória que compõem o subsistema de


memória dos computadores

» Hierarquia de memória

» Troca de dados entre as estruturas de memória dos


computadores

» Mapeamento de dados entre as memórias principal e cache

30
Infraestrutura de Hardware

Capítulo 2 – Memória Cache

Vamos conversar sobre o assunto?

Antes de começar a estudar a disciplina infraestrutura de hardware,


você já tinha ouvido falar em memória cache? Possivelmente sim,
mas o que talvez você não saiba é o porquê de seu uso e as suas
principais funcionalidades. Isso é o que veremos nesse capítulo.

Vamos estudar a memória cache e como os dados são trocados


entre as memórias cache e principal. Para iniciarmos a nossa
conversa, podemos dizer que a cache é uma memória menor e
mais rápida que a memória principal, estando localizada entre os
registradores e a memória principal de acordo com a hierarquia de
memória que estudamos no Capítulo 1. Por estar entre a CPU e a
memória principal, normalmente, os dados são trocados da CPU com
a cache e desta com a memória principal. Devido ao seu tamanho ser
menor que a memória principal, a cache só contém cópia de porções
da memória principal. Podemos observar a localização da cache no
esquema apresentado na Figura 1.

Figura 1- Cache X Principal

Você deve estar se perguntando qual o objetivo de se criar uma


memória menor que a principal, já que ela não poderia comportar todos
os dados da principal. A principal motivação para a criação da cache
foi acelerar a velocidade de transferência das informações entre CPU

31
Infraestrutura de Hadware

e a memória principal, aumentando o desempenho dos sistemas.

Pelo fato de ser menor, a memória cache armazena de instruções


e dados de acordo com algum algoritmo de substituição. Por
exemplo, pode-se utilizar um algoritmo que mantenha na cache
apenas as informações mais frequentemente acessados do programa
em execução. Esses algoritmos de substituição de dados serão
abordados nesse capítulo em seções posteriores. O importante agora
é que você entenda a filosofia da cache e o seu princípio básico de
funcionamento.

Acesso a Dados na Memória Cache

Como a cache fica localizada entre a CPU e a memória principal,


todo e qualquer informação acessada será incialmente procurada
na cache. Somente no caso da informação não estar armazenada
na cache é que a busca se dará na memória principal. Essa técnica
naturalmente aumenta o desempenho dos sistemas computacionais,
uma vez que a cache é menor que a principal. Sendo assim, procurar
dados em um espaço menor tende a ser mais rápido que procurar
dados num espaço maior.

Quando um dado não pôde ser encontrado na cache, significa


que aquela informação não está lá, estando, portanto, apenas na
principal ou no disco. Como esses dois últimos tipos de memória
estão mais abaixo da cache na pirâmide de hierarquia, significa que
são mais lentas, embora maiores. Sendo assim, o fato da busca por
informações se dá inicialmente na cache reduz o número de acessos
a principal a aos discos aumentando o desempenho dos sistemas
computacionais.

Vamos observar na Figura 2, um fluxograma indicando como ocorre


a leitura de dados na memória. No primeiro momento a CPU solicita

32
Infraestrutura de Hardware

a leitura de um determinado endereço em memória. Como falamos


anteriormente, esse dado ou palavra será buscada inicialmente na
cache. Por isso, o fluxograma apresenta o losango da estrutura de
decisão onde é feita a pergunta se aquela palavra procurada está na
cache. Caso positivo (( o losango aponta a saída Sim), o conteúdo
do endereço será buscado e entregue à CPU. Caso negativo ( o
losango aponta a saída Não) a informação a ser buscada deve ser
acessada na memória principal. Porém, para trazer esses dados, a
informação deve passar da MP para a cache e desta para a CPU.
Assim, um espaço (aqui chamaremos de slot) será alocado na cache
para comportar a informação, e em seguida, o dado será carregado
na cache para posteriormente seguir para a CPU.

Figura 2 - Operação de Leitura na Cache

A memória principal apresenta a uma organização dividida em


blocos. Um bloco é composto por um conjunto de palavras. Cada
palavra possui um endereço para que a mesma possa ser alcançada
e este endereço armazena um conteúdo, que pode ser dado ou
instrução. Já para a memória cache, a organização se dá em
linhas, também denominadas slots e cada slot (linha) armazena um
conjunto de palavras. Você deve estar pensando que é coincidência
o fato de que tanto uma linha da cache quanto um bloco da memória
principal armazenarem um conjunto de palavras. Entretanto, não é
coincidência, e sim uma obrigatoriedade para que o subsistema de
memória funcione eficientemente que o número de palavras de um

33
Infraestrutura de Hadware

bloco da memória principal seja igual ao número de palavras de uma


linha da cache. Você pode observar na Figura 3 a divisão da memória
principal e da memória cache.

Figura 3- Estrutura da MP e da Cache

Ao observar a Figura 3, notamos que a memória principal possui


2n palavras endereçáveis. Cada palavra tem um endereço de n bits.
Existe um número fixo de blocos com K palavras. A memória cache,
por sua vez, apresenta C slots ou linhas, e cada um com possui K
palavras. Note que o número de palavras de uma linha da cache é
igual ao número de palavras de um bloco da memória principal. Para
que esse esquema funcione com eficiência, o número de linhas da
cache deve ser bem menor que o de blocos da memória principal, já
que a memória principal deve ser bem maior que a cache. Lembre-
se que a a memória cache só pode ter parte dos dados da memória
principal.

Sendo assim, se nem todos os dados da memória principal estão


na cache e se inicialmente os dados são procurados na cache (vide
Figura 2), como o processador poderá identificar se o dado procurado
está na cache?

É importante salientar que o processador armazena em seus


registradores, o endereço de uma palavra da memória principal e não
da memória cache. Entretanto, o dado só é procurado na memória
principal após não ser encontrado na cache. Mas se o dado está na
cache, como acessá-lo de forma rápida, uma vez que só se conhece
o seu endereço da memória principal?

34
Infraestrutura de Hardware

A solução para esse problema é o que chamamos de mapeamento


de memória. Você já ouviu falar disso? Essa técnica existe para
possibilitar a descoberta da localização de um bloco da memória
principal entre as linhas da cache. Isso é necessário já que o número
de linhas da cache é bem menor que o número de blocos da MP.
Dessa forma, não existe uma linha da cache dedicada para cada
bloco da MP. Caso isso acontecesse, o número de linhas da cache
deveria ser igual ao número de blocos da MP e isso iria de encontro
ao princípio básico que vimos no capítulo 1 , que pela hierarquia de
memória, a cache fica acima da MP na pirâmide de hierarquia, sendo
mais rápida e menor que a MP.

Agora que você já sabe o porquê da necessidade do mapeamento,


vamos estudar três maneiras diferentes para se mapear de dados
entre a MP e a cache. São eles: mapeamento direto, mapeamento
associativo e mapeamento associativo por conjunto.

Mapeamento de Memória

A primeira técnica que vamos estudar é a mais simples e é


denominada Mapeamento Direto. Através dele, cada bloco da memória
principal é mapeado em uma linha específica da cache.

O nosso problema inicial é localizar uma determinada palavra na


cache, conhecendo apenas o seu endereço na MP. Lembre-se que
a troca de dados entre os registradores e a memória cache é feito
palavra a palavra, enquanto que a troca de dados entre a MP e a cache
é feito por bloco (conjunto de palavras). Sabendo qual o endereço
da MP que contém a palavra procurada, é possível saber qual bloco
da MP a contém. Conhecendo-se o bloco na MP, pode-se utilizar as
técnicas de mapeamento direto para se calcular qual a linha da cache
armazena aquele bloco e consequentemente, a palavra procurada.

Para se calcular qual é a linha específica da cache que um


determinado bloco da MP se encontra, o subsistema de memória
utiliza uma equação matemática, quando o mapeamento é direto:

35
Infraestrutura de Hadware

i=j modulo m onde

i=linha da cache onde o bloco está armazenado

j=número do bloco da memória principal

m=número total de linhas na cache

Apenas para relembrar, a operação aritmética módulo retorna o


resto da divisão inteira de j por m. Perceba que j é o número do bloco
da memória principal que se deseja encontrar. Como ele está numa
determinada linha na cache, precisa-se encontrar que linha é essa, no
nosso caso, representado pela equação por i . A variável m refere-se
ao total de linhas da cache.

Para ficar mais fácil de compreender, vamos observar o exemplo


apresentado na Figura 4. Deseja-se descobrir onde está localizado
na cache o bloco da MP de número 12. Sabe-se que a memória cache
utiliza o mapeamento direto e que possui 8 linhas ao total.

Figura 4- Mapeamento Direto

Aplicando-se a equação i = 12 modulo 8 , encontramos 4 como


resultado, significando que o bloco 12, caso esteja na cache, deverá
estar ocupando a linha 4, já que o mapeamento direto obriga que um
determinado bloco da MP ocupe uma linha específica na cache. Vamos
pensar agora que desejamos descobrir onde o bloco de número 20
da MP encontra-se na cache. Aplicamos novamente a equação i =
20 modulo 8 e novamente encontramos 4 como resultado. Assim, o

36
Infraestrutura de Hardware

bloco 20 da MP também ocupará a linha 4 caso ele esteja na cache.

Nesse momento, você deve estar se perguntando, como os 2


blocos podem ocupar a mesma linha na cache. Eles podem sim, desde
que em momentos diferentes. Nunca poderão estar os dois blocos
ao mesmo tempo, já que a quantidade de palavras de um bloco é
equivalente a quantidade de palavras comportadas por uma linha da
cache. Nós consideramos o mapeamento como direto, porque sempre
que o bloco 12 estiver na cache nessa organização de memória, o
mesmo estará na linha 4. O mesmo dizemos do bloco 20 e também
do 28... Isso comprova a nossa afirmação inicial, que cada bloco da
memória principal é mapeado em uma linha específica da cache.

Neste momento, você deve estar com um novo questionamento:


como o subsistema de memória saberá se num momento, é o
bloco 12, bloco 20 ou 28 que está na linha 4 da cache?

Para isso, o esquema de mapeamento direto faz uso de uma outra


informação, que é denominada TAG e está contida no registrador de
endereço (MAR).

A TAG para o mapeamento direto é calculada pela seguinte


equação:

TAG = j div m onde

TAG = linha da cache onde o bloco está armazenado

j=número do bloco da memória principal

m=número total de linhas na cache

Você consegue perceber qual a diferença de uma equação para


a outra? A primeira utiliza a operação módulo que representa o resto
da divisão inteira. A segunda utiliza a operação div que representa o
quociente da divisão. Assim, a TAG será obtida através da obtenção
do quociente entre o número do bloco da MP e o número total de
linhas da cache.

Pensando no exemplo da Figura 4, para o bloco de número 12


seria calculada a TAG =1, enquanto para o bloco de número 20
seria calculada a TAG =2. A TAG=3 equivaleria ao bloco de número
28. Quando se escreve esses números em binário se obtém a
representação na coluna na TAG da linha 4. Essa TAG é o que define
que no momento específico quem está na linha 4 da cache é o bloco
12 e não o bloco 20.

37
Infraestrutura de Hadware

Dessa forma, poderemos definir TAG como um campo para indicar


que bloco em particular da memória principal está sendo armazenado
naquela linha da cache. Ele sempre será necessário, pois uma linha
da cache não pode ser dedicado a um único bloco, já que o número
de linhas da cache é bem inferior ao de blocos da MP.

Vamos agora resolver um exercício que consolidará esses conceitos


que estudamos sobre mapeamento direto. Vamos considerar uma
cache que trabalha com mapeamento direto e possui tamanho total
de 64 Kbytes. A memória principal, por sua vez tem capacidade total
16Mbytes e os seus endereços possuem 24 bits. O tamanho do bloco
da memória principal é 4bytes. Descubra então qual é o formato do
endereço da memória principal.

Para resolver esse exercício o que você precisa saber da teoria?


Em primeiro lugar, você deve lembrar que o MAR é um registrador
(memória interna à CPU) que armazena endereços de palavras da
memória principal. Em segundo lugar, você precisa lembrar que o
mapeamento direto transfere um dado bloco da memória principal
para uma linha específica da cache. Também é importante lembrar
que o tamanho do bloco da MP é o mesmo da linha da cache, ou seja,
em outras palavras, o número de bytes que cabem no bloco da MP é
o mesmo comportado por uma linha da cache.

Acrescentaremos ainda uma informação adicional com relação


a divisão de campos do MAR para o mapeamento direto: O MAR
precisará conter um conjunto de bits para representar a linha da
cache ocupada pela palavra procurada; um outro conjunto de bits
para representar a TAG (citado previamente utilizado para identificar
qual é o bloco que ocupa aquela linha, naquele momento); e por fim,
um último conjunto de bits para representar a própria palavra, dentro
da linha, uma vez que uma linha da cache comporta um conjunto
de palavras. Em síntese, o MAR, para o mapeamento direto, está
subdividido em três agrupamentos de bits, como podemos observar
na Figura 5.

Figura 5 - MAR para o mapeamento Direto

38
Infraestrutura de Hardware

Voltando ao nosso exemplo original, já estamos cientes da base


teórica para resolver o exercício. Dessa forma, precisamos descobrir
a quantidade de bits de cada um desses grupos (tag, linha e palavra)
e a quantidade total dos bits do MAR. Essa última informação, foi nos
passada no exemplo: observe a frase “A memória principal, por sua
vez tem capacidade total 16Mbytes e os seus endereços possuem
24 bits”. Isso significa que o MAR possui 24 bits agrupados em
três campos. Precisamos então descobrir a quantidade de linhas
disponíveis na memória cache. Como faremos isso? Já sabemos o
tamanho total da cache e também sabemos quantos bits cada linha
comporta (lembre-se que uma linha tem a mesma capacidade de
um bloco da MP). Dividindo-se o tamanho total da cache (64 kbytes)
pela quantidade de bytes de 1 linha (4 bytes) chegamos a 64Kbytes/4
bytes = 16 K linhas.

Note que são 64 Kbytes e não 64 bytes. Por isso, você não poderá
eliminar o K, pois ele representa a ordem de grandeza 1000.
Entretanto, devemos utilizar a notação em binário o que significa que
1K = 1024 = 210.

Ao colocarmos 16K em potência de 2, obtemos 16 K = 24 . 210 =


214 . Isso significa que temos 214 linhas possíveis na cache. Um bloco
da MP pode ocupar alguma dessas linhas e para representá-las serão
necessários 14 bits. Em outras palavras, você deverá observar o
expoente da potência de 2 da quantidade de linhas. No nosso caso, já
descobrimos que o campo slot/linha deverá ter 14 bits.

Vamos agora tentar descobrir quantas TAGs existem e


consequentemente, quantos bits são necessários para representá-las.
A TAG irá indicar qual bloco está naquela linha num dado momento.
Para isso, deveremos dividir o número de blocos da MP pelo número
de linhas da cache. Essa última informação, acabamos de descobrir
(214). O número de blocos, ainda não temos, pois nos foi dado o
tamanho da MP e a capacidade de um bloco. Ora, mas essas duas
informações, já são suficientes para a descoberta do número de
blocos. Basta dividirmos a capacidade toral da MP pela capacidade
de 1 bloco, então teremos a quantidade de blocos.

Assim teremos 16Mbytes/4bytes = 4M. Entretanto, 1M equivale a


1K x 1K, ou seja 210 x 210 = 220. Assim, para esse caso, teremos
4M = 4 x 220 blocos.

Mas a nossa busca pelo número de bloco objetivou descobrimos

39
Infraestrutura de Hadware

o número de TAGs. Para descobrir o número de TAGs vamos dividir


o número de blocos pelo número de linhas. Assim temos o seguinte
cálculo:

número de TAGs = 4 x 220 blocos/214 linhas

número de TAGs = 22 x 220 blocos/214 linhas

número de TAGs = 222 blocos/214 linhas

número de TAGs = 22 x 220 blocos/214 linhas

número de TAGs = 28 TAGs

Um bloco da MP deverá ter uma TAG para identifica-lo na cache


e para representar essa TAG serão necessários 8 bits. Em outras
palavras, você deverá observar o expoente da potência de 2 da
quantidade de TAGs. No nosso caso, já descobrimos que o campo
TAG deverá ter 6 bits.

Com isso poderemos descobrir o número de bits para representar


a palavra, calculando o que falta para completar os 24 bits do MAR.
Temos 14 para representar a linha e 8 para TAG, totalizando 22 bits.
Como o MAR possui 24 bits, concluímos que os 2 bits restantes
representam a palavra. O formato do MAR para a cache do exemplo,
utilizando mapeamento direto é ilustrado na Figura 6.

Figura 6 - Formato do MAR

De acordo com o exemplo estudado, verificamos que quando uma


palavra precisa ser procurada na memória, o subsistema de memória
faz a leitura do endereço no barramento de endereços (conforme
estudado no volume 2). Esse endereço está armazenado no MAR,
registrador de endereço da CPU. Para interpretar a informação do
MAR e fazer inicialmente a busca pela palavra na memória cache,
caso o MAR contenha a informação :000000010000000000111011,
o subsistema de memória interpretará esse endereço da seguinte
maneira:

40
Infraestrutura de Hardware

- Os 8 primeiros bits (00000001) indicam a TAG de


número 0

-Os 14 bits seguintes (00000000001110) indicam a linha


de número 14

-Os 2 últimos bits (11) indicam a palavra de número 3.

Assim a informação a ser buscada é a palavra 3 da linha


14, e identificado pela TAG 0.

Essa interpretação se dá devido ao tipo do mapeamento. Caso


seja utilizado um outro tipo de mapeamento, a interpretação do MAR
será diferente. O mapeamento direto foi o primeiro tipo estudado,
mas estudaremos a seguir mais dois tipos de mapementos.

Para concluímos o estudo deste primeiro tipo de mapeamento,


vamos observar quais os pontos positivos e os pontos negativos.
O mapeamento direto apresenta um custo em termos de hardware
menor (circuitos mais simples e menos custoso), é uma técnica rápida,
ganhando assim em velocidade na hora da busca por informações na
cache, uma vez que os dados são procurados diretamente em uma
linha específica, sem precisar varrer a cache completa.

Em se tratando dos pontos negativos, poderá se ter um mau


aproveitamento do tamanho da cache, a depender dos endereços
buscados. Para ficar mais claro de perceber isso, imagine naquele
nosso exemplo anterior, se o bloco 12 fosse alocado para cache
inicialmente. Ele iria para a linha 4, como vimos. Se imediatamente
depois fosse acessado o bloco 20 e o mesmo não tivesse na cache,
ele seria buscado na principal e trazido para a cache. O bloco 20
também seria alocado na linha 4, mesmo que a cache estivesse com
outras linhas vazias. Isso comprova o mau aproveitamento da mesma.
Além disso, o subsistema de memória reserva um espaço na cache
para o controle de informações. Observe na Figura 7, uma síntese
dos pontos positivos e negativos do mapeamento direto.

Figura 7- Mapeamento Direto

41
Infraestrutura de Hadware

A segunda técnica de mapeamento de memória que vamos estudar


é denominada Mapeamento Associativo. Através dele, cada bloco da
memória principal pode ser mapeado em qualquer linha da cache.

O nosso problema inicial é localizar uma determinada palavra na


cache, conhecendo apenas o seu endereço na MP. Lembre-se que
a troca de dados entre os registradores e a memória cache é feito
palavra a palavra, enquanto que a troca de dados entre a MP e a cache
é feito por bloco (conjunto de palavras). Sabendo qual o endereço
da MP que contém a palavra procurada, é possível saber qual bloco
da MP a contém. Conhecendo-se o bloco na MP, pode-se utilizar as
técnicas de mapeamento direto para se calcular qual a linha da cache
armazena aquele bloco e consequentemente, a palavra procurada.

Para o mapeamento associativo, a lógica de controle da cache


interpreta um endereço de memória simplesmente como um tag
e uma palavra, conforme é possível observar na Figura 8. Como a
linha a ser ocupada por um determinado bloco é aleatória, não há
necessidade de um conjunto de bits no registrador de endereço (MAR)
para representá-la.

Figura 8 - Mapeamento Associativo

Você deve estar se perguntando como o subsistema de memória


descobre que um determinado bloco está numa linha. Normalmente,
a TAG é o identificador que indica qual bloco está naquela linha. No
mapeamento associativo isso também é verdade porém a TAG irá
conter o número do bloco escrito na base binária. Observe na Figura 9,
o mesmo exemplo da Figura 4 quando o mapeamento é o associativo.
O bloco 12 teria como TAG, a sequência 01100.

42
Infraestrutura de Hardware

Figura 9- Mapeamento Associativo

Na Figura 9, optamos por alocar o bloco 12 da MP na linha 2 da


cache. Essa escolha foi aleatória. Poderíamos ter escolhido, por
exemplo, a linha 7, 5 ou 0, já que o mapeamento é associativo.

Vamos agora resolver um exercício que consolidará esses


conceitos que estudamos sobre mapeamento associativo. Como
ficaria a divisão de bits do registrador de endereço (MAR) para uma
cache associativa com 64 linhas (slots). Considere que o MAR possui
24 bits e que cada bloco da MP possui 64 palavras.

Aqui novamente recorreremos a teoria para resolver. Novamente,


você deve lembrar que o MAR é um registrador (memória interna à
CPU) que armazena endereços de palavras da memória principal. Em
segundo lugar, você precisa lembrar que o mapeamento associativo
transfere um dado bloco da memória principal para qualquer linha da
cache. Também é importante lembrar que o tamanho do bloco da MP
é o mesmo da linha da cache, ou seja, em outras palavras, o número
de bytes que cabem no bloco da MP é o mesmo comportado por uma
linha da cache. Por fim, lembre-se que a divisão de bits do MAR para
o mapeamento associativo será em dois agrupamentos de bits. A TAG
e a palavra.

Com relação aos dados do exemplo, o número de linhas da


cache será irrelevante, já que esse dado não aparece no MAR. Já
sabemos que o número total de bits do MAR é 24. Como cada bloco
da MP e consequentemente cada linha da cache possui 64 palavras,
precisaremos de 6 bits para representar a palavra. Como chegamos
nos 6 bits? Vamos escrever 64 palavras/bloco em potência de 2.

43
Infraestrutura de Hadware

64 = 26 palavras em cada bloco ou em cada linha

Dessa forma, precisamos de 6 bits para representar as palavras


de uma linha, restando 18 bits do MAR para armazenar informações
de TAG, conforme observamos na Figura10.

Figura 10 - Exemplo do MAR no Mapeamento Associativo

Vamos agora interpretar a mesma informação do MAR que fizemos


no mapeamento associativo, caso o MAR contenha a informação
:000000010000000000111011, o subsistema de memória interpretará
esse endereço da seguinte maneira:

- Os 18 primeiros bits (000000010000000000)


indicam a TAG de número1024

- Os 6 bits seguintes (111011) indicam a palavra


de número 59

Assim a informação a ser buscada é a palavra


59 do bloco 1024.

Vamos agora observar quais os pontos positivos e os pontos


negativos deste tipo de mapeamento. O mapeamento associativo
apresenta um custo adicional no momento em que se vai procurar
uma informação na cache pois precisará comparar a TAG de cada
linha com o número do bloco para tentar localizá-lo, já que o bloco
procurado pode estar em qualquer linha. Isso poderia ser citado como
um ponto negativo. Por outro lado, o que era um ponto negativo no
mapeamento direto passa a ser um ponto positivo no associativo, pois
a memória cache tende a ser melhor aproveitada. Como o bloco da
MP pode ser alocado em qualquer linha da cache, o subsistema de
memória irá procurar uma linha livre na cache para alocar um bloco
da MP, no momento em que este for trazido para a cache.

Já quando a cache estiver lotada, uma linha precisará ser


escolhida para alocar um novo bloco. Essa escolha é feita de acordo
com algum algoritmo de substituição de linhas na cache que veremos

44
Infraestrutura de Hardware

mais a diante. A depender do algoritmo escolhido, essa substituição


poderá trazer benefícios ou não ao desempenho. Observe na Figura
11, uma síntese dos pontos positivos e negativos do mapeamento
associativo.

45
Infraestrutura de Hadware

Referências

STALLINGS, William. Arquitetura e Organização de


Computadores. 5. ed

PATTERSON, D. A. e Hennessy, John L. Organização e


Projeto de Computadores. LTC, 2000.

TANENBAUM, Andrew S. Organização Estruturada de


Computadores. 4. ed. Tradução Helio Sobrinho. Rio de Janeiro:
Prentice-Hall, 2001.

46
Infraestrutura de Hardware

Conheça os Autores

Juliana Regueira Basto Diniz possui graduação em engenharia


eletrônica pela Universidade Federal de Pernambuco, mestrado e
doutorado em Ciência da Computação pela Universidade Federal de
Pernambuco. Atualmente é professora da Universidade Federal Rural
de Pernambuco (UFRPE), desenvolvendo trabalhos no grupo de
Educação a Distância desta universidade. Seus temas de interesse
em pesquisa são: Sistemas Distribuídos, Computação Ubíqua e
Ensino a Distância.

Abner Corrêa Barros é mestre em Ciência da Computação com


foco em Engenharia de Hardware pelo Centro de Informática da
Universidade Federal de Pernambuco. Possui graduação em Ciência
da Computação pela mesma universidade. Atualmente é professor
da disciplina de Organização e Arquitetura de Computadores da
Faculdade Maurício de Nassau e Engenheiro de Hardware da
Fundação de Apoio ao Desenvolvimento da UFPE (FADE), atuando
em um projeto de convênio entre o Centro de Informática da UFPE
e a Petrobrás. Suas áreas de interesse e pesquisa são: Hardware
Reconfigurável, Arquitetura de Cores Aritméticos e Computação de
Alto Desempenho em Field-Programmable Gate Array (FPGA).

47