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

Infraestrutura De Hardware Volume 1 2 e 3

  • 1.
    Infraestrutura de Hardware Juliana Regueira Basto Diniz Abner Corrêa Barros Volume 1 Recife, 2009
  • 2.
    Universidade Federal Ruralde 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
  • 3.
    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
  • 4.
    Conhecendo o Volume1 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
  • 5.
    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
  • 6.
    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
  • 7.
    Infraestrutura de Hardware Capítulo1 – 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
  • 8.
    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
  • 9.
    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
  • 10.
    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
  • 11.
    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
  • 12.
    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
  • 13.
    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
  • 14.
    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
  • 15.
    Infraestrutura de Hardware Ostransistores 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
  • 16.
    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
  • 17.
    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
  • 18.
    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
  • 19.
    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
  • 20.
    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
  • 21.
    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
  • 22.
    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
  • 23.
    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
  • 24.
    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
  • 25.
    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
  • 26.
    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
  • 27.
    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
  • 28.
    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
  • 29.
    Infraestrutura de Hardware ouadicionamos 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
  • 30.
    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
  • 31.
    Infraestrutura de Hardware comorepresentado 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
  • 32.
    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
  • 33.
    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
  • 34.
    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
  • 35.
    Infraestrutura de Hardware dígitosforam 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
  • 36.
    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
  • 37.
    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
  • 38.
    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
  • 39.
    Infraestrutura de Hardware conformepodemos 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
  • 40.
    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
  • 41.
    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
  • 42.
    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
  • 43.
    Infraestrutura de Hardware 2.7Té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
  • 44.
    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
  • 45.
    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
  • 46.
    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
  • 47.
    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
  • 48.
    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
  • 49.
    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
  • 50.
    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
  • 51.
    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
  • 52.
    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
  • 53.
    Infraestrutura de Hardware temostambé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
  • 54.
    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
  • 55.
    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
  • 56.
    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
  • 57.
    Infraestrutura de Hardware quepossamos 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
  • 58.
    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
  • 59.
    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
  • 60.
    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
  • 61.
    Infraestrutura de Hardware Vamosprimeiramente 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
  • 62.
    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
  • 63.
    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
  • 64.
    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
  • 65.
    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
  • 66.
    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
  • 67.
    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
  • 68.
    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
  • 69.
    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
  • 70.
    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
  • 71.
    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
  • 72.
    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
  • 73.
    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
  • 74.
    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
  • 75.
    Infraestrutura de Hardware Capítulo3 – 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
  • 76.
    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
  • 77.
    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
  • 78.
    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
  • 79.
    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
  • 80.
    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
  • 81.
    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
  • 82.
    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
  • 83.
    Infraestrutura de Hardware PortaLó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
  • 84.
    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
  • 85.
    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
  • 86.
    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
  • 87.
    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
  • 88.
    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
  • 89.
    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
  • 90.
    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
  • 91.
    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
  • 92.
    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
  • 93.
    Infraestrutura de Hardware poisnele 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
  • 94.
    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
  • 95.
    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
  • 96.
    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
  • 97.
    Infraestrutura de Hardware Juliana Regueira Basto Diniz Abner Corrêa Barros Volume 2 Recife, 2009
  • 98.
    Universidade Federal Ruralde 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
  • 99.
    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
  • 100.
    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
  • 101.
    Conhecendo o Volume2 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
  • 102.
    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
  • 103.
    Infraestrutura de Hardware Capítulo1 – 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
  • 104.
    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
  • 105.
    Infraestrutura de Hardware segundoestá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
  • 106.
    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
  • 107.
    Infraestrutura de Hardware NO-OPe 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
  • 108.
    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
  • 109.
    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
  • 110.
    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
  • 111.
    Infraestrutura de Hardware Capítulo2 – 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
  • 112.
    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
  • 113.
    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
  • 114.
    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
  • 115.
    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
  • 116.
    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
  • 117.
    Infraestrutura de Hardware delinguagem 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
  • 118.
    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
  • 119.
    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
  • 120.
    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
  • 121.
    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
  • 122.
    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
  • 123.
    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
  • 124.
    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
  • 125.
    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
  • 126.
    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
  • 127.
    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
  • 128.
    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
  • 129.
    Infraestrutura de Hardware serimplementadas 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
  • 130.
    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
  • 131.
    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
  • 132.
    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
  • 133.
    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
  • 134.
    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
  • 135.
    Infraestrutura de Hardware sede 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
  • 136.
    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
  • 137.
    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
  • 138.
    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
  • 139.
    Infraestrutura de Hardware operaçãoSw. 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
  • 140.
    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
  • 141.
    Infraestrutura de Hardware linguagensde 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
  • 142.
    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
  • 143.
    Infraestrutura de Hardware menosengenhosa 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
  • 144.
    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
  • 145.
    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
  • 146.
    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
  • 147.
    Infraestrutura de Hardware linguagemde 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
  • 148.
    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
  • 149.
    Infraestrutura de Hardware primeiramenteser 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
  • 150.
    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
  • 151.
    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
  • 152.
    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
  • 153.
    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
  • 154.
    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
  • 155.
    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
  • 156.
    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
  • 157.
    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
  • 158.
    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
  • 159.
    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
  • 160.
    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
  • 161.
    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
  • 162.
    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
  • 163.
    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
  • 164.
    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
  • 165.
    Infraestrutura de Hardware Capítulo3 – 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
  • 166.
    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
  • 167.
    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
  • 168.
    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
  • 169.
    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
  • 170.
    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
  • 171.
    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
  • 172.
    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
  • 173.
    Infraestrutura de Hardware Exercício2. 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
  • 174.
    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
  • 175.
    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
  • 176.
    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
  • 177.
    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
  • 178.
    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
  • 179.
    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
  • 180.
    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
  • 181.
    Infraestrutura de Hardware barramentoagrupados 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
  • 182.
    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
  • 183.
    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
  • 184.
    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
  • 185.
    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
  • 186.
    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
  • 187.
    Infraestrutura de Hardware qualquerduraçã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
  • 188.
    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
  • 189.
    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
  • 190.
    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
  • 191.
    Infraestrutura de Hardware placas3D 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
  • 192.
    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
  • 193.
    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
  • 194.
    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
  • 195.
    Infraestrutura de Hardware fatoque 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
  • 196.
    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
  • 197.
    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
  • 198.
    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
  • 199.
    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
  • 200.
    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
  • 201.
    Infraestrutura de Hardware Juliana Regueira Basto Diniz Abner Corrêa Barros Volume 3 Recife, 2009
  • 202.
    Universidade Federal Ruralde 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
  • 203.
    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
  • 204.
    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
  • 205.
    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
  • 206.
    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
  • 207.
    Infraestrutura de Hardware próprioVon 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
  • 208.
    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
  • 209.
    Infraestrutura de Hardware cachee 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
  • 210.
    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
  • 211.
    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
  • 212.
    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
  • 213.
    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
  • 214.
    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
  • 215.
    Infraestrutura de Hardware Figura4 - 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
  • 216.
    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
  • 217.
    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
  • 218.
    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
  • 219.
    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
  • 220.
    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
  • 221.
    Infraestrutura de Hardware tempoa 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
  • 222.
    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
  • 223.
    Infraestrutura de Hardware gravadoou 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
  • 224.
    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
  • 225.
    Infraestrutura de Hardware conhecidascomo 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
  • 226.
    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
  • 227.
    Infraestrutura de Hardware FitaMagné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
  • 228.
    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
  • 229.
    Infraestrutura de Hardware noselementos 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
  • 230.
    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
  • 231.
    Infraestrutura de Hardware Capítulo2 – 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
  • 232.
    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
  • 233.
    Infraestrutura de Hardware aleitura 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
  • 234.
    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
  • 235.
    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
  • 236.
    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
  • 237.
    Infraestrutura de Hardware bloco20 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
  • 238.
    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
  • 239.
    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
  • 240.
    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
  • 241.
    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
  • 242.
    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
  • 243.
    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
  • 244.
    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
  • 245.
    Infraestrutura de Hardware maisa 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
  • 246.
    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
  • 247.
    Infraestrutura de Hardware Conheçaos 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