Infraestrutura de Hardware - Volume 1_2e3

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. cfm?Action =20&Page307

Figura 5 – Fotografia do ENIAC

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 Instruction Set Architecture), superescalares e superpipelines. A quinta geração também é marcada pela miniaturização dos computadores e pela computação ubíqua, ou seja, computação a toda hora e em todo o lugar, utilizando uma grande diversidade de dispositivos. A disseminação da computação ubíqua foi impulsionada 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 tecnologias de comunicação. Com a computação ubíqua, a relação entre usuários e dispositivos computacionais muda em relação aos computadores pessoais, o que era de um para um, passa a ser de um para muitos (um usuário para vários dispositivos). Weiser e colegas (Weiser M.; Gold e Brown, 1999) argumentam que computadores de pequenas dimensões estarão embutidos em objetos do cotidiano do usuário, tais como livros, roupas e objetos pessoais em geral. A figura 9 apresenta uma série de dispositivos computacionais que estão presentes na quinta geração.

Atenção
Os detalhes de tais arquiteturas serão apresentados no segundo volume deste material didático.

Saiba Mais
Mark D. Weiser nasceu em 1952 em Chicago. Estudou Ciência da Computação e Comunicação na Universidade de Michigan, tendo recebido seu Ph.D. em 1979. Weiser foi cientista chefe da Xerox PARC e é 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. Os egípcios foram os primeiros que se tem notícia a adotar um sistema gráfico estruturado de tal forma a permitir o registro simples e claro de grandes quantidades de elementos através de um pequeno número de símbolos.

Saiba Mais
Conheça um pouco mais sobre a história dos números visitando estes 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

Atenção
Você pode estar se perguntando por que nos referimos aos números presentes nas bases numéricas como símbolos e não como números simplesmente. Como você deve ter percebido, a base hexa decimal utiliza tanto números como letras para representar os valores numéricos, desta forma, para não causar confusão aos nos referirmos às letras A,B,C,D,E e F como sendo números, nos referiremos aos números e letras utilizados, indistintamente, como sendo apenas símbolos.

Respeitadas estas regras, podem-se construir bases numéricas com tantos símbolos quantos se façam necessárias. Mas, pensemos um pouco, “porque se dar ao trabalho de definir outras bases numéricas se a base decimal, aparentemente, já resolve todos os nossos problemas?” A verdade é que as bases numéricas são definidas para simplificar o dia a dia de quem às utiliza. Mesmo sem perceber, constantemente estamos lançando mão de outras bases numéricas. Por exemplo, imagine as horas do dia, você já percebeu que normalmente nós contamos as horas utilizando uma base com apenas 12 elementos? Pois é, mesmo sabendo que o dia tem 24 horas, parece-nos bem melhor pensar em termos de duas séries de 12 horas, uma começando a meia noite e indo até o meio dia, e outra começando ao meio dia e indo até a meia noite. Como você irá perceber um pouco mais à frente, foi o desenvolvimento do estudo das bases numéricas que permitiu o desenvolvimento dos computadores digitais como nós os conhecemos hoje em dia. Agora, pense um pouco, que outras bases numéricas você pode identificar em suas atividades cotidianas? Que tal uma base com 60 elementos, só para começar? 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 perceber, para expressar valores que não se encontram representados diretamente na base, lançamos mão de um recurso matemático inventado pelos indianos denominado Notação Posicional. É o uso da notação posicional que nos permite dizer que o 1 do número 12 vale uma dezena e não uma unidade, o qual somado às duas unidades representadas pelo 2 nos dá como resultado os doze elementos que estávamos querendo representar. A ideia por trás da notação posicional é extremamente simples e pode ser facilmente ilustrada pela observação do que ocorre quando contamos as horas em um relógio com ponteiros. 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 estamos registrando.

Atenção
Notação Posicional nada mais é que um recurso de representação que nos permite alterar o valor atribuído aos símbolos de uma determinada base numérica, de forma a poder utilizá-los para representar valores que não existam na referida base.

Saiba Mais
A expressão Estouro da Base indica que estamos tentado representar um valor maior que o maior valor representável diretamente pela base numérica adotada.

Curiosidade...
Você conhece algum relógio com ponteiros com alguma indicação para 13 horas?

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

Fique por Dentro
O termo “vai um” indica que precisamos somar um na contagem do segundo disco.

Podemos assim continuar nossa contagem, de tal forma que a cada volta completa do disco das unidades, avançaremos o disco das dezenas de uma posição. Ou seja, sempre que ocorre um estouro da base no disco das unidades, dizemos que ocorre um “vai um” para o disco das dezenas. 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.
Atenção
Um número elevado a um expoente negativo é igual ao inverso do próprio número elevado ao expoente positivo.

Outro ponto muito importante é que os dígitos colocados à direita da virgula, que representam a parte fracionária do número, são ponderados pela base com o expoente negativo, o que significa que em vez se estarem sendo multiplicados estão sendo divididos por ela. Observe novamente os exemplos d e e. Veja que da mesma 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 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 representar com a base binária praticamente todos os números que você possa imaginar. Por ser a base numérica adotada nas Unidades Lógicas e Aritméticas (ULA) de todos os processadores, esta base numérica é 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

Atenção
Como veremos mais a frente, nem todos os números fracionários podem ser representados na base binária.

Infraestrutura de Hardware

utiliza internamente para representar suas informações, em expressões do tipo: Os processadores Core Duo utilizam palavras de 32 bits. A Figura 14 a seguir demonstra como estes elementos estão presentes na representação dos números representados na base binária.

Atenção
A Unidade Lógica e aritmética é uma das partes mais importantes da Unidade Central de Processamento dos computadores. Ela é responsável por todas as operações lógicas e aritméticas dos programas que são executados.

Figura 14 – Elementos presentes nos números expressos na base binária

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 1 = 00012 2 = 00102 3 = 00112 4 = 01002 5 = 01012 6 = 01102 7 = 01112 8 = 10002 9 = 10012 10 = 10102

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

Fique por Dentro
É comum nos referirmos às posições que os dígitos de um número ocupam como casas. Como, por exemplo, a casa das unidades ou a casa das centenas.

desta forma, como sempre ficamos apenas com o primeiro dígito passando os restantes para as casas seguintes, temos que fazer um “vai um e zero e fica zero”. Muito estranho, não é mesmo? Mas você não tem com o que se assustar, a regra é sempre a mesma, primeiramente some os dígitos da operação parcial, exatamente como se estivesse operando na base decimal, em seguida converta o resultado obtido para binário, por fim preserve apenas o dígito menos significativo do resultado obtido, propagando os demais dígitos em uma operação do tipo vai n.

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. Na base binária além da representação de Magnitude e Sinal temos também uma outra, conhecida como representação de Complemento a Dois. Como já dissemos, dentro da Unidade Lógica e Aritmética de um processador todos os números são representados utilizando apenas as base binária. Nem mesmo os sinais de “+” e “-” existem. De um modo geral, tanto na representação de Magnitude e Sinal quanto na representação de Complemento a Dois, adota-se reservar o dígito mais significativo ou MSB (Most Signficant Bit), para sinalizar se um número é positivo ou negativo. Normalmente utiliza-se o “0” para indicar que o número é positivo e o “1” para indicar que o número é negativo. No sistema de Magnitude e Sinal, a semelhança do que ocorre 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
O termo Magnitude e Sinal indica que temos uma representação baseada na magnitude do número representado, ou seja, o seu módulo, associada a um sinal algébrico que indica se este é um número positivo ou negativo. Normalmente não se exige o uso do sinal “+” para indicar que um número é positivo.

Saiba Mais
Apesar de também possuir uma indicação do sinal algébrico, ou seja, de sinalizar claramente se um número é positivo ou negativo, a representação em complemento a dois, como iremos ver um pouco mais a frente, adota estratégias diferentes para registrar a magnitude ou o tamanho de números negativos e positivos.

Figura 33 – Representação no sistema Magnitude e Sinal

Observe que este sistema apresenta duas incoerências: Em primeiro lugar, permite duas representações distintas para o zero, uma positiva e outra negativa. E, em segundo lugar, se tentarmos operar a soma de um número com o seu inverso, nos moldes do que aprendemos até agora para a base binária, não obteremos zero como resultado. Ou seja, a representação de Magnitude e Sinal é muito útil e interessante para nós seres humanos, mas para os computadores é um verdadeiro 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 Notação de Complemento a Dois 0111 2(N-1)-1 Números Positivos 0110 0101 0100 0011 0010 0001 Zero 0000 1111 2(N-1) Números Negativos 1110 1101 1100 1011 1010 1001 1000 7 2(N-1)-1 Números Positivos 6 5 4 3 2 1 0 -1 -2 2(N-1)-1 Número Negativos -3 -4 -5 -6 -7 -8 Zero - Zero

Representação sem Sinal

Notação de Magnitude e Sinal 0111 0110 0101 0100 0011 0010 0001 0000 1000 1001 1010 1011 1100 1101 1110 1111 7 6 5 4 3

Binário sem Sinal 1111 1110 1101 1100 1011 2(N)-1 Números Positivos 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001 Zero 0000 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

2 1 0 -0 -1 -2 -3 -4 -5 -6 -7

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 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, da base binária. 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:

Atenção
O termo Nibble significa literalmente meio byte, ou seja 4 bits.

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

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 tornamse 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. A lógica digital que iremos trabalhar é baseada em uma área especial da matemática conhecida como álgebra de Boole, ou Álgebra Booleana. A álgebra booleana é muito parecida com a álgebra que aprendemos na escola, a qual está baseada em operadores e/ou funções com a ú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
Saiba Mais
George Boole foi um Cientista Alemão do século 19 considerado o pai da lógica matemática.

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: » A função And, que define que uma resposta só será verdadeira se, e somente se, todas as suas entradas forem verdadeiras. » A função Or, que define que uma resposta só será verdadeira se ao menos uma das sua entradas for verdadeira » 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

Lembrete
Lembre-se que, por convenção, em lógica digital a informação verdadeira está associada ao nível 1 e a falsa ao nível 0.

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 A 0 0 1 1 B 0 1 0 1

Saída X 0 0 0 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 A 0 0 1 1 B 0 1 0 1

Saída X 0 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 A 0 1

Saída X 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 A 0 0 1 1 B 0 1 0 1

Saída X 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 A 0 0 1 1 B 0 1 0 1

Saída X 1 0 0 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 A 0 0 1 1 B 0 1 0 1

Saída X 0 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. Computadores. 5. ed. Arquitetura e Organização de

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. Aumentandose o número de registradores disponíveis no processador, aumentase 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 Odisseia no Espaço, e o computador em questão tinha o nome de HAL 9000. Pois bem, passados aproximadamente 40 anos do lançamento do referido filme, e mais de 70 anos após a construção do primeiro computador digital, mesmo com todo os avanços que estamos 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

Dica de Filme
Saiba mais sobre este filme em http:// pt.wikipedia.org/ wiki/2001_-_Uma_ odisséia_no_ Espaço

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 Processadores de propósito geral Microcontroladores

Aplicação Computadores pessoais (Desktop, Notebooks, etc) Sistemas Embarcados (TVs, DVDs, GPS, Celular, Micro-ondas, Relógios, Console de Jogos, etc) Processamento de Alto desempenho, super computadores Computadores de médio e grande porte Placas gráficas, processamento de realidade virtual Equipamentos médicos, processamento de sinal de satélite, telecomunicações, etc.

Processadores Vetoriais Processadores Super-Escalar Processadores Gráficos Processadores Digitais de Sinal (DSP)

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 demais encontram-se armazenados em registradores. » Instruções Tipo J: Este formato de Instrução é utilizado exclusivamente para representar instruções de desvio, conhecidas como instruções Jump. 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.

Saiba Mais
JUMP é uma palavra inglesa que pode ser traduzida como salto ou pulo.

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 trata38

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 Add Addi Sub And Andi Or Ori

Formato Add rd, rs, rt Add rt, rs, #im Sub rd, rs, rt And rd, rs, rt Andi rt, rs, #im Or rd, rs, rt Ori rt, rs, #im

Tipo R I R R I R I

Operação R[rd] = R[rs] + R[rt] R[rt] = R[rs] + #im R[rd] = R[rs] R[rt] R[rd] = R[rs] & R[rt] R[rd] = R[rs] & #im R[rd] = R[rs] | R[rt] R[rd] = R[rs] | #im

Exemplo → Execução Add R3, R4, R5 → R3=R4 + R5 Addi R3, R3, 23 → R3=R3 + 23 Sub R7, R2, R9 → R7=R2 - R9 Add R9, R6, R3 → R9=R6 & R3 Andi R3, R4, 25 → R3=R4 & 25 Or R2, R5, R7 → R2=R5 | R7 Ori R4, R2, 33 → 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 Lw Sw

Formato Lw rt, #im(rs) Sw rt, #im(rs)

Tipo I I

Operação R[rt] = M[R[rs]+Im] M[R[rs]+Im]=R[rt]

Exemplo → Execução Lw R3, 3(R5) → R3=M[R5+3] Sw R3, 3(R5) → 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 Beq

Formato Beq rs, rt, #im Bneq rs, rt, #im Slt rd, rs, rt

Tipo I

Operação Se rs == rt, desvia para a instrução em #im Se rs != rt, desvia para a instrução em #im Se rs < rt, carrega rd com 1, caso contrario carrega rd com 0

Exemplo → Execução Beq R3, R5, 25 → Se R3 == R5 desvia para a instrução 25 Bneq R3, R5, 29 → Se R3 != R5 desvia para a instrução 29 Slt R3,R4,R5 → Se o conteúdo de R4 for menor que o conteúdo de R5, carrega R3 com 1, caso contrário carrega R3 com 0 Slt R3,R4,34 → Se o conteúdo de R4 for menor que 34, carrega R3 com 1, caso contrário carrega R3 com 0

Benq

I

Slt

R

Slti

Slti rt, rs, #im

I

Se rs < rt, carrega rd com 1, caso contrario carrega rd 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 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á o seu fluxo normal, caso contrário o programa será desviado para o trecho indicado com a Label Else. A Figura 20 a seguir nos traz mais um exemplo. Neste exemplo podemos observar o uso das instruções Beq e Slt juntas para descrever a funcionalidade de uma instrução if um pouco mais elaborada. Observe que primeiro foi utilizada a instrução Slt para verificar se o conteúdo de R3 era menor que o conteúdo de R4, sendo o resultado desta comparação armazenado em R1. Em seguida utilizou-se a instrução Beq para verificar o resultado da comparação anterior e, a depender do resultado obtido, desviar ou não o fluxo de execução do programa. 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.

Saiba Mais
Uma Label é um nome que se insere no inicio de uma linha de código de um programa escrito em linguagem de máquina para poder referenciá-la mais tarde. Durante o processo de montagem todas as Labels são substituídas pelos endereços de memória onde o referido trecho de código ficou armazenado.

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 Jr J Jal

Formato J rs J endereço Jal endereço

Tipo I J J

Operação PC = rs PC = endereço * 4 R31=PC+4, PC = endereço *4

Exemplo → Execução J R31 → PC = R31 J 25 → PC = 100 Jal 25 → R31=PC, 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 calculase 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 Add Addi And Andi Beq Bneq J Jal Lw Sw Sub

Formato R I R I I I J J I I R

Operação R[rd]=R[rs]+R[rt] R[rt]=R[rs]+Im R[rd]=R[rs] & R[rt] R[rt]=R[rs] & Im Desvia p/ a instrução indicada se R[rs]==R[rt] Desvia p/ R[rs]!=R[rt] instrução indicada se

Op./Func. 0/20 8 0/24 C 4 5 2 3 23 2b 0/22

Desvia para a instrução indicada Desvia para a instrução indicada e salva retorno em R31 R[rt]=M[R[rs]+Im] M[R[rs]+Im]=R[rt] R[rd]=R[rs]-R[rt]

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 000 001 010 110 111

Função AND OR Soma Subtração 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. 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 leitura (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. 71

Saiba Mais
Tratador de interrupções é o programa do sistema operacional que indentifica qual o tipo de interrupção que aconteceu.

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; » Configura o registrador PC para iniciar a rotina de interrupção; » O processador procede, buscando a primeira instrução no programa tratador de interrupção. Você pode estar pensando que a introdução de interrupções aumenta a sobrecarga de processamento, já que instruções extras 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.

Saiba Mais
O PC (Program Counter), é um registrador cujo objeivo é armazenar o endereço da próxima instrução.

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-andplay 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 já foi especificado, embora ainda não tenhamos disponibilidade de dispositivos no mercado. Após apresentarmos essa breve evolução dos padrões comerciais e as características principais de cada um, passaremos para o estudo de mais um subsistema que será apresentado no Volume 3: o subsistema de memória. Mas antes de passarmos ao próximo volume, é importante você verificar os exercícios propostos na seção a seguir e tentar resolver 99
Saiba Mais
Você sabia que no final de 2008 foi especificado o padrão USB 3.0? Para consultar as inovações desse padrão consulte: http://www. infowester.com/ usb.php.

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 EISA? Existe alguma compatibilidade entre eles? ISA e

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. Computadores. 5. ed. Arquitetura e Organização de

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 como memória RAM (Random Access Memory)1. ○ Associativo: no acesso associativo pode ser visto como uma junção do acesso direto com o acesso aleatório. Nos sistemas que adotam o acesso associativo cada posição de 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

Saiba Mais Pesquise na Internet o significado da expressão: Random Access Memory
1

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. Disco Magnético Conforme já dissemos, os discos magnéticos recebem esta designação por armazenarem a informação a partir da mudança da orientação magnética de minúsculos partículas Ferri-magnéticas depositadas sobre uma mídia suporte. Desde o seu lançamento, feito pela IBM em meados da década de 50 do século passado, os discos Magnéticos evoluíram2 muito, tendo o seu tamanho sido reduzido a frações do tamanho original ao mesmo tempo em que sua capacidade de armazenamento e velocidade de acesso foram aumentadas de centenas à milhares de vezes a dos primeiros dispositivos. Os primeiros discos apresentados mediam 17

Saiba Mais
2 Conheça um pouco da história, com fotos, dos primeiros discos Magnéticos. Visite o site http:// www-03.ibm. com/ibm/history/ exhibits/storage/ storage_350.html

É realmente muito interessante!

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 ferrimagné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 maior segurança aos dados armazenados.
3

Saiba Mais Conheça um pouco da história dos pen-drivers no link http:// pt.wikipedia.org/ wiki/USB_flash_ drive

Pen-Driver
Conhecido pelos nomes de Pen-Driver, USB Flash Driver, Flash Driver, Thumb-driver entre outros nomes, este dispositivo faz parte 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 pendrivers são a mídia removível preferida pela maioria dos usuários de computadores pessoais.

27

Infraestrutura de Hadware

Saiba Mais Você sabe o que é uma memória FLASH? Conheça um pouco mais sobre este tipo de memória visitando a página
4

Figura 16 - Pen-Driver tipico

Conforme podemos ver pela Figura 17 a seguir, a estrutura interna de um pen-driver é bastante simples, composta basicamente de um controlador UBS e de um ou dois chips de memória FLASH4.

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. Lembrese 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. Computadores. 5. ed Arquitetura e Organização de

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

Sign up to vote on this title
UsefulNot useful