AULA 3 - Microprocessadores - Graduação: mudanças entre as edições

De IFSC
Ir para navegação Ir para pesquisar
imported>Fargoud
Sem resumo de edição
imported>Fargoud
 
(30 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=O MICROPROCESSADOR=


A Lei de Moore
Nesse capítulo vamos estudar a parte mais importante de um computador, que é a '''Unidade Central de Processamento''' (UCP, ou, do inglês, CPU), também conhecida como '''microprocessador''', ou simplesmente, '''processador'''.  
Durante os anos de 1950 e 1965, a industrias do Vale do Silício disputavam pelo domínio do recém-surgido mercado da computação e eletrônica. Naquela época ainda não havia surgido o termo TIC (Tecnologia da Informação e Comunicação), mas ele seria mais apropriado para definir o nicho de clientes e serviços que eles disputavam. Eles dominavam a produção de circuitos eletrônicos digitais, dominados pela Intel e AMD, a produção de computadores e equipamentos de comunicação, como a Dell, Apple, IBM, HP e CISCO, além da indústria e software e serviços, como a Apple, Microsoft e, mais tarde, a Google. A disputa era grande e nem sempre leal.


Nota
[[imagem: MIPcpu.png|center]]
Assista ao filme “Piratas do Vale do Silício” (1999) e tenha uma ideia de como essa guerra estava longe de ser limpa.
Entretanto, não se sabia naquela época onde essa disputa ia parar, nem quem seriam os vencedores, nem mesmo, se haveria sequer vencedores. Até um dos sócios e presidente da Intel, Gordon Moore, lançou um trabalho minucioso onde ele destacava a experiência que ele adquiriu ao longe de alguns anos trabalhando na indústria de fabricação de processadores e circuitos para computadores. Ele percebeu que, sempre a indústria avançava em sua tecnologia e conseguia reduzir o tamanho de cada transistor de um circuito integrado, os computadores tornavam-se também muito mais velozes do que antes. Porém, essa redução no tamanho dos transistores requer uma total atualização nos equipamentos da indústria, tornando os equipamentos anteriores obsoletos. Assim, só seria viável a evolução para transistores menores se o lucro da empresa fosse o suficiente para pagar todas essas despesas. Por outro lado, ele também percebeu que os computadores e equipamentos mais obsoletos ainda possuíam mercado aberto em países menos desenvolvidos economicamente. Ele concluiu então que a indústria seria sim capaz de continuar evoluindo na redução do tamanho dos transistores porque os novos computadores, sendo tornando mais velozes, seriam tão mais eficientes e atrativos, que todos os clientes, principalmente as empresas, fariam de tudo para trocar seus computadores antigos por novos, afim de se tornarem cada vez mais produtivos.


Além dessa análise de mercado, ele analisou como o processo industrial era concebido e como os novos computadores se beneficiariam da redução do tamanho dos transistores. Ao final, ele afirmou que “A cada ano a quantidade de transistores por chip irá dobrar de tamanho, sem alteração em seu preço”. Essa frase pode ser interpretada também pelas consequências da quantidade de transistores por chip. Ou seja, a cada ano, com o dobro dos transistores, os chips se tornarão duas vezes mais rápidos. Um exemplo mais comum de chip são os processadores dos computadores. Então, por consequência, os computadores irão dobrar sua velocidade de processamento a cada ano, e ainda vão permanecer com o mesmo preço.
A CPU é responsável não apenas por executar os programas contidos na memória, mas também por controlar todos os dispositivos de entrada e saída.  


Naquela época essa era uma afirmação muito forte e ambiciosa. Muitos receberam esse estudo com cautela. Mas não demorou muito para todos perceberem que as previsões de Moore estavam se realizando. Foi tanto, e o trabalho dele foi depois chamado de “Lei de Moore” e ela ainda é válida até os dias de hoje. Na [fig_moore] a seguir é possível perceber como a quantidade de transistores por processadores cresceu dos anos 1970 até por volta de 2003 (linha contínua). É possível ver que ela não se afastou muito das previsões de Moore (linha tracejada).
Seu avanço ao longo dos anos tem permitido que programas fossem executados cada vez mais rapidamente. Hoje temos processadores de vários núcleos capazes de executar várias atividades ao mesmo tempo. São esses processadores e funcionalidades que iremos estudar nesse capítulo.


scaledwidth=“30%
Os programas de computador são sequências finitas de passos que foram definidas por um programador para alcançar um objetivo específico.  
Figura 4. Evolução do número de transistores nos processadores em comparação com a Lei de Moore
A Lei de Moore se tornou tão importante que ela não é usada apenas como uma meta a ser buscada e batida a cada ano, mas também como um meio para se verificar se a indústria está evoluindo na velocidade esperada. Apesar de Moore está muito correto em suas previsões, todos sabem, inclusive ele próprio, que esse crescimento não vai durar para sempre. Os transistores hoje estão na escala de 25 nanometros. Essa é a mesma escala de alguns vírus e bactérias. Reduzir mais do que isso está se tornando cada vez mais difícil. Pesquisadores e cientistas buscam outras formas de fazer com que os computadores continuem evoluindo em sua velocidade e reduzindo seu tamanho. Alguns pensam na substituição de transistores de Silício por outros materiais, como Grafeno. Outros até são mais radicais e defendem que a forma de computação deve mudar, talvez através de Computadores Quânticos ou de Bio-Computadores.


Quanto menores forem os transistores, mais rapidamente eles podem ser carregados e descarregados. Isso possibilita que o sistema trabalhe cada vez mais veloz. Mas há ainda outra limitação para a redução do tamanho dos transistores é a dissipação de calor. Quanto menores os transistores, mais deles são adicionados num mesmo circuito. O funcionamento dos transistores, como dito anteriormente, é feito através da passagem de corrente elétrica (elétrons em movimento). Como toda máquina elétrica, nem toda corrente é aproveitada. Muito dela é desperdiçada através da dissipação de calor. Então, uma vez que há milhões desses transistores trabalhando juntos, a dissipação de calor é ainda maior.
Cada passo desse programa é chamado de [https://pt.wikipedia.org/wiki/Instru%C3%A7%C3%A3o_(inform%C3%A1tica) '''instrução'''].  


É muito importante para toda a humanidade que os computadores continuem evoluindo. A redução do tamanho dos computadores, aliada ao aumento de desempenho e sem o crescimento dos preços, permitiu que todas as ciência evoluíssem ao mesmo tempo, com a mesma velocidade. A metereologia, a medicina, as engenharias e até as Ciências Humanas avançaram sempre em conjunto com o avanço da computação. Para se ter um exemplo, foi a evolução dos transistores que permitiu que computadores se comunicassem numa velocidade tão grande que permitiu a formação da rede mundial de computadores, a Internet. Qualquer pessoa hoje consegue em poucos milissegundos fazer uma pesquisa por informações que estão do outro lado do planeta. Algo que antes só era possível viajando até bibliotecas distantes e cheirando bastante mofo e poeira. Hoje, ter em casa bilhões de bytes (Giga bytes) armazenados num minúsculo cartão de memória, é algo corriqueiro. A informação está hoje disponível numa escala tão grande e numa velocidade tão intensa que parece que mais nada é impossível para a humanidade. Após a Revolução Industrial do século XVIII que substitui os trabalhadores braçais por máquinas, o século XX, puxado pela evolução dos transistores, passou pelo o que muitos consideram a Revolução da Informação e o século XXI, já é considerado a “Era do Conhecimento”.
[[imagem: MIPinstrucao.png|center]]


A evolução dos computadores
Não necessariamente, uma instrução escrito em uma linguagem de alto nível, como C, Java, Python, por exemplo, é diretamente transformada em uma instrução de máquina e armazenada em memória para execução da CPU.  
O ENIAC
O primeiro computador criado foi o ENIAC (‘Electronic Numerical Integrator And Computer’), desenvolvido por Eckert e Mauchly na Universidade da Pennsylvania, Estados Unidos. O projeto iniciou em 1943 financiado pelo governo americano. O período era da Segunda Guerra Mundial e o objetivo era poder calcular de forma mais ágil as melhores trajetórias para transporte de armas e mantimentos em meio aos exércitos inimigos. Esse é o tipo de cálculo que pequenos aparelhos celulares fazem hoje para encontrar rotas nas cidades através de GPS (‘Global Positioning System’) e análise de mapa. O projeto só foi concluído em 1946, tarde demais para ser utilizado para a Segunda Guerra, mas foi bastante utilizado até 1955.


O ENIAC ocupava uma área de 4500 metros quadrados, pesava 30 toneladas e consumia cerca de 140KW. Ele era capaz calcular 5000 somas por segundo. A programação era feita manualmente através da manipulação de chaves, ou seja, não havia linguagem de programação, nem compiladores ou interpretadores de comandos. O Sistema Operacional só surgiu bem depois e tomou o emprego de muitos funcionários chamados na época de operadores de computadores. Profissão hoje extinta! O ENIAC ainda não utilizada transistores, mas válvulas que, dependendo de seu nível de carga, representavam um número. Cada válvula precisava estar devidamente aquecida para funcionar corretamente, então o processo de ligar o ENIAC era trabalhoso e levava bastante tempo. Ele trabalhava com o sistema de numeração decimal, o que parecia óbvio naquela época, mas que depois dos transistores, se tornaram complexo demais e foi adotado o sistema binário.
Na verdade, geralmente, uma instrução de uma linguagem de alto nível embute vários comandos e ações a serem executadas pela CPU.  


Após a Segunda Guerra iniciou-se o período chamado de Guerra Fria, quando a espionagem, sabotagem e muito especulação reinava entre os países liderados pela União Sovitética e Estados Unidos. Prato cheio para os computadores. Possuir um computador que fosse capaz de decifrar mensagens codificadas dos inimigos era o sonho de consumo de todo general daquela época.
Essa é a principal razão da criação dessas linguagens de alto nível. O programador deve ter o menor trabalho possível ao escrever um programa. Ele deve se preocupar com o problema que está tentando solucionar, e em memorizar dezenas de comandos de uma linguagem de máquina extensa e repleta de detalhes.


A Arquitetura de von Neumann
[[imagem: MIPcompilacao.png|center]]
Muitas empresas e governos corriam para construir seu próprio computador que fosse mais avançado do que os anteriores. Muitos projetos surgiram depois do ENIAC. Mas todos eles eram barrados por algumas dificuldades e limitações. Como por exemplo, o fato de não serem programados e trabalharem com números decimais. O problema de trabalhar com decimais é que cada algarismo armazenado possui 10 estados possíveis, representando os números de 0 a 9. Dentro de um sistema eletrônico, isso é complicado por que a carga de cada dispositivo, seja transistor, seja válvula, deveria ser medida para verificar se que número ela estava representando. Os erros eram muito frequentes. Bastava que uma válvula estivesse fora da temperatura ideal para que os resultados das operações começassem a sair errado. Von Neumann recomendou em sua arquitetura que os dados e instruções fossem agora armazenados em binário, facilitando a análise dos mesmos e reduzindo a quantidade de erros.


Em 1952, o professor John von Neumann, da Univeridade de Princeton, Estados Unidos, apresentou um projeto inusitado para a arquitetura de um computador. Ele sugeriu que o computador fosse organizado em componentes, cada um executando apenas uma única tarefa e de forma muito mais organizada. Ele propôs que o computador fosse composto por (ver [fig_neumann]):
Após compilado, o programada de linguagem de alto nível é transformado em um programa apenas com instruções de máquina. Cada instrução de máquina contém apenas uma única operação a ser realizada pela CPU. Para ser executado, esse programa deve ser transferido para a Memória Principal.  


Memória Principal: responsável por armazenar os programas a serem executados, assim como os dados a serem processados
Assim que um usuário clica com o mouse, ou pressiona a tecla Enter do teclado solicitando que um determinado programa execute, o Sistema Operacional copia o programa para a memória e solicita que a CPU o execute.


Unidade Lógica e Aritmética (ULA): para realização das operações lógicas e aritméticas
Um programa em linguagem de máquina é formado por instruções em binário. A cada instrução trazida da memória, a CPU lê seu código binário de operação para saber do que se trata, e inicia o processo de execução.


Unidade de Controle: que, baseado nas instruções lidas da memória, enviaria sinais de controle para a ULA para que a mesma executasse as operações devidas
Apesar de existirem diversos fabricantes e famílias de CPUs, ou '''microprocessadores''', pode-se identificar muitos aspectos comuns no que diz respeito à arquitetura desses
componentes.


Unidade Central de Processamento (CPU): que agruparia a ULA e a Unidade de Controle
Em geral, o bom conhecimento de algum deles acelera o aprendizado de outro.


Unidade de Entrada e Saída: responsável pela comunicação com os periféricos do computador (teclado, monitor, memória externa etc.)
Do ponto de vista de funcionamento, basicamente um microprocessador:
# lê, uma-a-uma, as instruções de um programa armazenado na memória,
# obtém os seus operandos quando necessário,
# manipula os dados de acordo com o especificado no código da instrução, podendo ainda,  
# ler dados de dispositivos de entrada e enviar dados para dispositivos de saída.
 
Apesar de cada Microprocessador ter suas peculiaridades, sua estrutura interna é
bastante semelhante e pode ser generalizada.
 
A estrutura interna de um
Microprocessador pode ser ilustrada na figura 2.1.
 
[[imagem: MIPestrutmip.png|center]]
[[imagem: MIPestrutmip2.png|center]]
 
Por exemplo, a arquitetura interna de um processador ARM é:


scaledwidth=“30%
Figura 5. Estrutura da Máquina de von Neumann
A Arquitetura de von Neumann deu tão certo que todos os fabricantes começaram a segui-la. Os computadores utilizados até hoje em dia seguem os preceitos básicos propostos por ele. Muitos avanços surgiram, melhorias foram feitas, mas até hoje os computadores são formados por Unidades de Controle, CPU, ULA, memória e Unidades de Entrada e Saída. John von Neumann deixou um legado para toda a humanidade.


A IBM
[[imagem: MIPestrutarm.png|center]]
A International Business Machines, ou apenas IBM, foi fundada em 1911 com o nome de Computing Tabulating Recording (CTR) e iniciou produzindo e comercializando calculadoras para empresas e empresários. Só em 1924 é que ela muda de nome para International Business Machines ou apenas IBM. Ela é uma das poucas empresas que sobreviveram a todos os avanços da computação e continua sendo uma potência mundial. Apenas em 1953 a IBM entra no mercado de computadores com o IBM 701, tendo sempre as grande organizações como alvos. Só muitos anos depois é que os computadores pessoais foram surgir. O IBM 701 trabalhava com cartões perfurados, ou seja, toda programação dele era feita através de uma perfuradora que marca buracos para representar o bit 1, e deixava ilesa uma área para representar o 0. O mesmo acontecia depois que os programas era lidos e processados. Uma folha de papel era perfurada pelo computador para representar o resultados das operações executadas. Não preciso nem dizer o que isso era trabalhoso!


Em 1955 a IBM lança o IBM 702 que agora não fazia apenas cálculos científicos, mas também aplicações comerciais, visando deixar de ser um equipamento apenas para cientistas, mas também para empresários. Depois desses vários outros computadores foram lançados nas séries 700. Essas máquinas ainda utilizavam válvulas para armazenar os dados. Só em 1957 é que surge a Segunda Geração de computadores, com a utilização de transistores. Isso tornou os computadores mais leves, baratos, velozes e mais energicamente eficientes. Os primeiros computadores dessa geração foram o IBM 7000 e o PDP-1, da DEC, empresa que não existem mais.
Para administrar operações de leitura/escrita da memória ou de uma E/S de dados são
necessárias:
* uma unidade de controle, que orienta a busca ou o envio das informações, faz a decodificação e execução das instruções e fornece os sinais de temporização adequados para as diversas partes do processador e do próprio computador;
* uma pequena capacidade de memória onde estas informações (dados, endereços e instruções) possam ficar temporariamente armazenadas (registrador de uso geral); e
* alguns barramentos (ou vias) onde possam ser manipulados os dados, os endereços e
os sinais de controle.


A IBM lança em 1964 o IBM série 360, substituindo os antigos computadores da série 7000. O IBM 360 inicia a primeira família de planejada de computadores. Isso significava que todos computadores seguintes da série 360 seriam compatíveis com os anteriores. Todos programas desenvolvidos ou adquiridos pelas empresas poderiam ser usados mesmo que a empresa substituísse os computadores pela geração mais nova. Isso tornou a IBM uma das empresas mais poderosas do mundo na época, com filiais e representantes em todos o continentes do planeta.
Para executar operações aritméticas e lógicas é necessária a presença de uma ALU (arithmetic
and logic unit – unidade lógica/aritmética).


As gerações dos computadores
Para interpretar as instruções estabelecidas por um programa devem existir:
As gerações de computadores surgiram com a miniaturização dos transistores e sua integração em chips em escalas cada vez maiores. Podemos então ver as gerações dos computadores como:
* um decodificador de instrução (microcódigo) e;
* um registrador de instrução, no qual a instrução recebida fica temporariamente
armazenada.


1946 a 1957: computadores baseados em tubos de vácuo
Um Microprocessador é a parte principal de um microcomputador e a sua
principal responsabilidade é executar instruções, que em última análise controlam
todas as suas partes.


1958 a 1964: surgimento dos transistores


1965: indústrias atingiram a integração de até 100 transistores num único chip
==Unidade Lógica e Aritmética (ULA)==


1971: chamada de Integração em Média Escala, com até 3000 transistores por chip
A [https://pt.wikipedia.org/wiki/Unidade_l%C3%B3gica_e_aritm%C3%A9tica '''Unidade Lógica e Aritmética'''], ou ULA, se assemelha muito com uma calculadora convencional. Ela executa operações lógicas (NOT, AND, OR, XOR) e aritméticas (geralmente adição, subtração, multiplicação, divisão, dependendo do microprocessador).


1971 a 1977: Integração em Larga Escala, com até 100.000 transistores por chip
[[imagem: MIPula1.png|center]]
[[imagem: MIPula2.png|center]]


1978 a 1991: Integração em Escala Muito Grande (VLSI), com até 100 milhões de transistores por chip
As ULAs modernas executam operações tanto com inteiros, como com números reais. Em algumas arquiteturas, porém, estas operações são realizadas por módulos separados: a ULA, para inteiros, e a [https://pt.wikipedia.org/wiki/Unidade_de_ponto_flutuante '''UPF - Unidade de Ponto Flutuante'''] (ou FPU), para reais.


1991 até a atualidade: Integração Ultra-VLSI, com mais de 100 milhões de transistores por chip
A inclusão da FPU veio permitir a execução de operações antes só possíveis com o auxílio de um coprocessador aritmético (operações em ponto flutuante).


Memórias de semicondutores
[[imagem: MIPupf.png|center]]
Em 1970, uma empresa chamada Fairchild desenvolveu pela primeira vez uma memória utilizando a mesma tecnologia utilizada para fabricar os processadores, os transistores. Isso possibilitou que memórias muito menores, mais rápidas e mais baratas fossem desenvolvidas. E melhor, elas poderiam ser inseridas muito próximas, e até dentro dos processadores, acompanhando sua miniaturização. E foi o que aconteceu. A medida que a tecnologia foi avançando e produzindo transistores cada vez menores, as memórias também foram encolhendo.


Os processadores tornaram-se cada vez menores e mais velozes, mas infelizmente o avanço não ocorreu também com a velocidade das memórias, mas apenas com o seu tamanho. Isso até hoje é um problema. Armazenamentos rápidos são muito complexos de fabricar e, por consequência, caros. Isso vem limitando o avanço da velocidade dos computadores, mas sempre os cientistas vêm encontrando alternativas para manter Gordon Moore e todos nós muito orgulhosos.
A ULA recebe como entrada dois diferentes dados que são trazidos para ela dos registradores.  


A Intel
[[imagem: MIPula3.png|center]]
A Intel Corporation, ou simplesmente Intel, surgiu nos Estados Unidos em 1968, como uma empresa focada no projeto e fabricação de circuitos integrados. Ela foi fundada por Gordon Moore (o mesmo da Lei de Moore) e Robert Noyce. Ela era inicialmente uma concorrente da IBM, mas logo se tornaram parceiras. A Intel fabricava os processadores e memória, e a IBM fazia a composição deles com outros componentes para montar os computadores.


Em 1971 a Intel lança seu primeiro processador, o 4004, que trabalhava com operações e dados de 4 bits. Foi uma revolução, pois todos componentes da CPU estavam num único chip. No ano seguinte eles lançam o 8008, já de 8 bits. Em 1974 é lançado o 8080, primeiro processador de propósito geral. Ou seja, com ela tanto era possível executar aplicações científicas, financeiras, gráficas e jogos. O mesmo princípio dos processadores atuais. Ele foi substituído pelo 8086 de 16 bit. O próximo foi o 80286 que já era capaz de trabalhar com uma memória de 16MBytes. O 80386 trabalhava com 32 bits e tinha suporte a multi-tarefas, ou seja, era finalmente possível executar mais de uma aplicação simultaneamente. Depois veio o 80486 com muito mais memória e bem mais rápido, além de um co-processador específico para aplicações matemáticas. A partir do 80286 as pessoas omitiam o 80 ao falar do processador, chamando-o apenas de 286, 386 e 486.
Quem decide que registradores passarão seus dados para a ULA é a '''Unidade de Controle''', baseada na instrução que está sendo executada.  


Em seguida veio a geração Pentium, focando cada vez mais na execução de tarefas paralelas, adicionando várias unidades de processamento e armazenamento de dados dentro processador. Agora os processadores não teriam apenas uma ULA ou uma memória dentro do processador, mas várias delas. Hoje estamos na geração dos processadores multi-núcleos, ou multi-cores, que nada mais são do que vários processadores replicados dentro de um mesmo chip e coordenadores por uma unidade única.
A Unidade de Controle também envia para a ULA qual operação será realizada (soma, multiplicação, divisão, AND, OR, comparação, etc). Assim que isso é feito, a ULA executa a operação e gera um resultado na sua saída.  


A Apple e a Microsoft
[[imagem: MIPula4.png|center]]
Em 1974 Steve Jobs e Steve Wosniak trabalhavam noites a fio para tentar, pela primeira vez, criar um computador que fosse voltado não a empresas, mas a pessoas também. Seria a ideia de um computador pessoal. Eles compraram todos componentes necessários para montar um computador, fizeram várias improvisações e inovações, acoplaram uma TV e um teclado. Wosniak, um gênio da eletrônica e programação, desenvolveu o software para controlar o computador e ainda alguns aplicativos, como uma planilha de cálculos e alguns jogos. Assim que o protótipo ficou prontos, Steve Jobs, eximiu negociador e vendedor, colocou o computador na mala de seu carro e foi visitar várias empresas para conseguir algum apoio financeiro para poder fabricar o produto em escalas maiores. Foi até na IBM, mas ouviu deles que o mercado de computadores pessoais não era promissor e o negócio deles era a produção de grandes computadores para empresas.


Assim que conseguiram o primeiro cliente, em 1976, Jobs e Wosniak fundaram a Apple e lançaram o Apple I. Um produto mais maduro e melhor acabado. Jobs sempre gostava de produtos de design diferenciado, que fossem não apenas eficientes, mas bonitos e, principalmente, fáceis de usar. Suas apresentações anuais de lançamento de novos produtos eram sempre aguardados com grande expectativa e especulações.
Esse resultado também é passado para um registrador escolhido pela Unidade de Controle, baseando-se na instrução em execução. Normalmente, o resultado de uma operação é armazenado no '''acumulador'''.


A IBM inicialmente também desenvolvia o Sistema Operacional e os programas que iriam ser executados por suas máquinas. Logo ela percebeu que poderia fazer parcerias com outras empresas e agregar ainda mais valor aos seus produtos. Foi aí que surgiu a Microsoft, liderada pelo seu fundador, Bill Gates, com o seu sistema operacionais MS-DOS. Não demorou muito para que todos computadores lançados pela IBM trouxessem também o MS-DOS integrados e eles. Depois surgiram as evoluções do MS-DOS, o Windows e suas várias gerações. A Microsoft se beneficiou bastante dessa parceria, já que todos a grande maioria dos computadores do mundo executavam seu sistema, as pessoas teriam que aprender e se familiarizar com seu sistema operacional. As empresas de desenvolvimento de aplicativos e jogos tinham que fazê-los compatíveis com o MS-DOS e Windows e foi aí que a Microsoft se tornou uma das líderes do mercado e, por muitos anos, a mais rica empresa do mundo.
==Registradores==


Steve Jobs sempre acusou o Bill Gates de ter copiado dele o código principal para o funcionamento do MS-DOS. Gates nunca negou. Eles sempre trocavam acusações e isso gerou muito assunto para a impressa e fanáticos por tecnologia. A verdade é que a Microsoft cresceu bastante e a Apple passou por vários apertos. Só no ano 2000, quando Jobs retornou à Apple depois de ter sido expulso da própria empresa que ele fundou, foi que as coisas melhoraram para a Apple. Eles lançaram produtos em outras linhas que não fossem computadores pessoais, como o iPod para ouvir música e o telefone celular iPhone. A Apple passou então a dominar o mercado de música online com sua loja de músicas, iTunes e o iPhone é o Smartphone mais vendido do mundo.
Os registradores são um conjunto de memórias locais rápidas do microprocessador, destinada ao armazenamento de dados e instruções.  


Steve Jobs seguia a filosofia não de fazer clientes, mas de criar fãs. E deu certo. Hoje há vários ``Apple Maniamos” que compram seus produtos antes mesmo deles serem apresentados ao público. Nos dias em que esse livro está sendo escrito, a Apple ultrapassou a IBM e a Microsoft em valor, e é a empresa mais valiosa do mundo.
São elaboradas com o mínimo de transistores possível, utilizando o que há de mais moderno em tecnologia de armazenamento.  


Recapitulando
São as memórias mais rápidas que podem ser construídas e por isso são também as mais caras. Por essa razão, aparecem numa quantidade muito pequena em um computador, na casa de alguns KBytes.  
Ao final desse capítulo vimos o que é a arquitetura de um computador e porque é tão importante estudá-la. Vimos que o transistor é o dispositivo básico para todo o funcionamento de um computador. Estudar seu funcionamento e sua evolução, é estudar a própria Ciência da Computação e a eletrônica digital. Depois de seu surgimento, os computadores foram possíveis e avançaram a medida que eles encolhiam de tamanho e aumentavam de velocidade, consumindo menos energia. Com a evolução dos computadores, cada vez mais rápidos, menores e mais baratos, toda a humanidade avançou na mesma velocidade. No próximo capítulo vamos estudar mais a fundo como os processadores funcionam. Como os programas são executados e o que é feito nos dias de hoje para que eles sejam cada vez mais eficientes.


Atividades
Eles podem ser divididos em dois grupos: Os registradores de propósito geral, e os de propósito específico.
Quais as quatro funções básicas que todos os computadores executam? Dê um exemplo de operação de cada uma delas.


Quais os elementos básicos de um computador e quais as funcionalidades de cada um deles?
* De propósito geral: como o próprio nome diz, são utilizados pelos programas para quaisquer objetivos gerais, como por exemplo, para as operações de movimentação de dados e operações lógicas e aritméticas.
* Especiais: são registradores com funções específicas para determinados fins e tarefas.


Quais as diferenças entre um sinal analógico e um digital? Apresente os pontos fortes e fracos de cada um deles. Na sua opinião, qual dos dois sinais apresentam maior qualidade?
Os registradores de propósito geral são utilizados para guardar as variáveis dos programas. Como eles estão presentes em quantidades muito pequenas, são poucas as variáveis que ficam armazenadas em registradores. As demais ficam na Memória Principal.


Caracterize o que é uma Máquina de von Neumann


O que são transistores? Quais as vantagens na concepção de computadores com o surgimento dos transistores?
[[imagem: MIPbancoregisPPG.png|center]]


Por que quantos menores os transistores, mais velozes os computadores? Há desvantagens nessa miniaturização das máquinas? Quais?


O que diz a Lei de Moore? Em sua opinião, há um limite para esse crescimento? Onde vamos chegar?
Quando uma operação precisa ser realizada e seus dados estão nos Registradores de Propósito Geral, a CPU não precisa buscá-los na memória e o processamento torna-se muito mais rápido.


Que outras técnicas podem ser utilizadas para aumento do desempenho dos processadores que não pela redução do tamanho dos transistores? Explique cada uma delas.


'''Nota 1'''
Lembre-se que as memórias são muito mais lentas do que os processadores! Da ordem de 10 x mais lentas. A CPU tenta ao máximo manter as variáveis mais utilizadas nos registradores. Ela faz isso guardando aquelas mais usadas nas últimas operações. Nem sempre isso funciona, mas no geral, é a melhor solução.


'''Nota 2'''
O modificador ''register'' da linguagem C obriga a CPU a armazenar uma determinada variável inteira (por exemplo, contadora) no banco de registradores PPG.
Os registradores especiais são utilizados para funções específicas. Normalmente, para armazenar palavras especiais ou para sinalizar status do processador.


Apesar de existirem diversos fabricantes e famílias de microprocessadores, podese
identificar muitos aspectos comuns no que diz respeito à arquitetura desses
componentes. Em geral, o bom conhecimento de algum deles acelera o
aprendizado de outro.
Do ponto de vista de funcionamento, basicamente um microprocessador lê uma-auma
as instruções de um programa armazenado na memória, obtém os seus
operandos quando necessário, manipula os dados de acordo com o especificado
no código da instrução, podendo ainda, ler dados de dispositivos de entrada e
enviar dados para dispositivos de saída.
Apesar de cada Microprocessador ter suas peculiaridades, sua estrutura interna é
bastante semelhante e pode ser generalizada. A estrutura interna de um
Microprocessador pode ser ilustrada na figura 2.1.
Um Microprocessador é a parte principal de um microcomputador e a sua
principal responsabilidade é executar instruções, que em última análise controlam
todas as suas partes. Ele possui duas unidades básicas: a Unidade Lógica
Aritmética (ULA), responsável pela realização das operações lógicas e
aritméticas, e a Unidade de Controle (UC), responsável pela decodificação e
execução das instruções, fornecendo os sinais de temporização adequados
para as diversas partes do processador e do próprio computador além de
Registradores para armazenamento da Informação Binária (dados, endereços
e instruções).
2.1. UNIDADE CENTRAL DE PROCESSAMENTO - CPU
Esta parte do processador realiza todas as operações lógicas e aritméticas,
possuindo além da própria Unidade Lógica e Aritmética, os registradores
(Acumulador, registradores de propósito gerais e especiais) e a Unidade de
Controle.
a) Registradores: corresponde a uma memória local rápida do
microprocessador, destinada ao armazenamento de dados e instruções. Um
registrador pode ser:
Figura 2.1 - Estrutura interna de um Microprocessador
• De propósito geral: utilizado por exemplo, para as operações de
movimentação de dados e operações lógicas e aritméticas.
• Especiais: são registradores com funções específicas para determinados fins.
São exemplos de registradores especiais:
São exemplos de registradores especiais:
o Acumulador: é o principal registrador dentro de um processador,
participando da maioria das operações lógicas e aritméticas, sendo em
geral fonte de um dos operandos, e destino dos resultados das
operações, além de participar das operações de entrada e saída de
dados.
o Registrador de Flags: armazena os indicadores de estado do
processador (1 bit cada estado), como a ocorrência de um estouro numa
operação aritmética, ou a ocorrência de um resultado nulo, dentre
outros.
o Contador do Programa: (“Program Counter” - PC) é um registrador que
armazena o endereço de memória do início da próxima instrução a ser
executada. Após a leitura de um byte de uma instrução, o contador do
programa é incrementado, apontando para o seu próximo byte (se
houver). Ao final da instrução, o contador do programa sempre
armazena o endereço da próxima instrução a ser executada. O valor do
contador do programa pode mudar de forma não seqüencial quando
alguma instrução de desvio ou chamada de sub-rotina é executada,
sendo um novo endereço carregado neste registrador.
o Ponteiro da Pilha: (“Stack Pointer” - SP) armazena o endereço da
última posição ocupada da pilha (topo da pilha). A pilha é uma estrutura
do tipo LIFO (“Last In First Out”), sendo utilizada para armazenamento
temporário de dados, como o endereço de retorno de uma sub-rotina ou
o salvamento de registradores do microprocessador. Em muitos
microprocessadores, quando um dado é inserido na pilha, o Stack
Pointer é decrementado, ocorrendo o inverso quando um dado é
retirado
b) Unidade Lógica e Aritmética - ALU: implementa as operações lógicas (NOT,
AND, OR, XOR) e aritméticas (geralmente adição, subtração, multiplicação,
divisão, dependendo do microprocessador). Em geral, o resultado de uma
operação é armazenado no acumulador.
c) Unidade de Controle – UC: Todos as funções de um microprocessador são
controladas pela UC. Ela retira cada instrução da memória (operação de busca ou
“fetch”), interpretando-a (operação chamada de decodificação), fornecendo os
sinais de controle necessários à sua execução. A UC em geral é constituída pelas
seguintes partes:
• Circuitos de Temporização (Gerador de Clock): implementam o
funcionamento síncrono do processador, indicando os instantes onde cada
etapa da execução de uma instrução deve ocorrer. Em geral, o sinal de
temporização (“clock”) é fornecido por um circuito oscilador a cristal
associado a um circuito quadrador do sinal.
• Controle e Decodificação (Memória de Microprogramas): memória
apenas leitura que possui as atividades internas que devem ser realizadas
para a execução de cada instrução.
• Decodificador de Instrução: recebe a instrução que estava armazenada
na memória e gera os códigos do Microprograma que realizará a tarefa
definida por ela.
2.2. BARRAMENTOS INTERNOS
Os barramentos internos ou vias internas interligam os diversos componentes do
microprocessador, conduzindo dados e endereços.


===Acumulador===


É o principal registrador dentro de um processador, participando da maioria das operações lógicas e aritméticas, sendo em geral fonte de um dos operandos, e destino dos resultados das operações, além de participar das operações de entrada e saída de dados.


===Registrador de Flags===


Unidade Central de Processamento (CPU)
Armazena os indicadores de estado do processador (1 bit cada estado), como a ocorrência de um estouro numa
Objetivos do capítulo
operação aritmética, ou a ocorrência de um resultado nulo, dentre outros.
Ao final deste capítulo você deverá ser capaz de:


Identificar os principais componentes de uma CPU
===Contador do Programa: (“Program Counter” - PC)===


Conhecer o funcionamento de uma CPU
O PC contém o endereço de memória que será utilizado para buscar a próxima instrução a ser executada pela CPU. Antes de executar qualquer instrução, a CPU envia o conteúdo de PC para a memória, através do Barramento de Endereço, a memória envia o conteúdo da memória nesse endereço, através do Barramento de Dados. Esse conteúdo é então armazenado no IR.


Saber como um programa é executado em ciclos
É o registrador, então, que armazena o endereço de memória do início da próxima instrução a ser executada. Após a leitura de um byte de uma instrução, o contador do programa é incrementado, apontando para o seu próximo byte (se houver).


Definir e explicar o que é uma interrupção e suas consequências
Ao final da instrução, o contador do programa sempre armazena o endereço da próxima instrução a ser executada. O valor do contador do programa pode mudar de forma não seqüencial quando alguma instrução de desvio ou chamada de sub-rotina é executada, sendo um novo endereço carregado neste registrador.


Argumentar sobre aspectos que influenciam no desempenho de uma CPU
===Registrador de Instruções ("Instruction Register" - IR)===


Nesse capítulo vamos estudar a parte mais importante de um computador, que é a Unidade Central de Processamento, ou UCP, ou, do inglês, CPU. A CPU é responsável não apenas por executar os programas contidos na memória, mas também de controlar todos os dispositivos de entrada e saída. Seu avanço ao longo dos anos tem permitido que programas fossem executados cada vez mais rapidamente. Hoje temos processadores de vários núcleos capazes de executar várias atividades ao mesmo tempo. São esses processadores e funcionalidades que iremos estudar nesse capítulo.
Já o IR, que recebeu a instrução que veio da memória, tem o objetivo de guardar a instrução e passá-la para a Unidade de Controle, que é quem vai lê-la e tomar as decisões necessárias para para que ela seja executada pela Unidade de Ciclo de Dados.  


O que é um programa?
Por se tratar do processo de busca de instruções, o PC e o IR ficam instalados na Unidade de Controle. O PC possui conexão direta com o Barramento de Endereços, e o IR, com o Barramento de Instruções.
Nesse momento, você não apenas deve saber o que é um programa, como já deve ter até já escrito seus próprios programas e entendido um pouco como o computador funciona. Os programas são sequências finitas de passos que foram definidas por um programador para alcançar um objetivo específico. Cada passo desse programa é chamado de instrução. Não necessariamente, uma instrução escrito em uma linguagem de alto nível, como C, Java, Python, por exemplo, é diretamente transformada em uma instrução de máquina e armazenada em memória para execução da CPU. Na verdade, geralmente, uma instrução de uma linguagem de alto nível embute vários comandos e ações a serem executadas pela CPU. Essa é a principal razão da criação dessas linguagens de alto nível. O programador deve ter o menor trabalho possível ao escrever um programa. Ele deve se preocupar com o problema que está tentando solucionar, e em memorizar dezenas de comandos de uma linguagem de máquina extensa e repleta de detalhes.


Após compilado, o programada de linguagem de alto nível é transformado em um programa apenas com instruções de máquina. Cada instrução de máquina contém apenas uma única operação a ser realizada pela CPU. Para ser executado, esse programa deve ser transferido para a Memória Principal. No princípio, um Operador de Máquina, copiada todas instruções para a memória de maneira quase que manual. Hoje em dia essa operação é realizada pelo Sistema Operacional (Windows, Linux etc.). Assim que um usuário clica com o mouse, ou pressiona a tecla Enter do teclado solicitando que um determinado programa execute, o Sistema Operacional copia o programa para a memória e solicita que a CPU o execute.
===Registrador de Endereço de Memória ("Memory Address Register" - MAR) e Registrador de Buffer de Memória ("Memory Buffer Register" - MBR)===


Não podemos esquecer que a memória do computador apenas armazena números binários. Então, podemos dizer que um programa em linguagem de máquina é formado por instruções em binário. A cada instrução trazida da memória, a CPU lê seu código binário de operação para saber do que se trata, e inicia o processo de execução. Dependendo da operação, que pode ser de movimentação de dados, uma operação lógica, ou aritmética, ou uma operação de armazenamento de dados, a CPU envia ordens para que os outros dispositivos do computador atuem de forma a completar a operação. Essas ordens são enviadas através de pulsos elétricos passados por fios dentro do computador. Esses fios são chamados de Barramento de Controle.
Com relação ao MAR e ao MBR, eles possuem funções análogas ao PC e IR, respectivamente, mas referentes a dados e não a instruções.  


Software X Hardware
Quando uma operação precisa ser realizada com algum dado que está na memória (e não em um registrador), o endereço desse dado é passado para o MAR.  
O computador é composto por dois elementos, o software e o hardware. Tanto o hardware quando o software foram escritos por um programador, ou engenheiro, para se resolver um determinado problema. O início é sempre o mesmo. O profissional se depara com um problema e projeta uma solução algorítmica para ele. A diferença está na concepção. O hardware é concebido em chip, utilizando transistores interconectados. Uma vez elaborado, o hardware não pode mais ser modificado. Ele é uma solução rígida (do inglês, Hard) para o problema. Já o software é elaborado para ser armazenado numa memória e ser executado com um processador de propósito geral. Ele é uma solução flexível (do inglês, Soft) para o problema, já que o programador pode, a cada momento, modificar seu programa afim de torná-lo cada vez melhor.


Soluções em software são sempre mais lentas do que soluções equivalentes em hardware. Isso porque para executar um programa, cada instrução deve antes ser armazenada em memória, transferidas para a CPU (lembre-se que memórias são muito mais lentas do que CPUs) e, só então, ser executada pela CPU. Já as soluções em hardware não utilizam instruções, elas executam as operações diretamente.
A CPU então passa o conteúdo de MAR para a memória através do Barramento de Endereço, que retornará o conteúdo da memória nesse endereço através do Barramento de Dados.  


Por outro lado, as soluções em software ganham em flexibilidade, já que os programas podem ser facilmente modificados. Já as soluções em hardware, não. Uma vez concebido, um hardware não pode mais ser modificado, ele deve ser descartado para dar lugar a uma versão mais nova. Isso torna projetos em hardware muito mais caros.
O conteúdo trazido pela memória será armazenado em MBR. Só então o dado poderá ser utilizado para o processamento inicialmente planejado.  


Para entender melhor, podemos citar alguns exemplos de implementações em hardware comumente utilizadas. Todas são escolhidas devido ao seu caráter de pouca necessidade de modificação, mas muito demanda por alto desempenho. Por exemplo, chips de criptografia para celulares (geralmente smartphones), processadores aritméticos para acelerar o cálculos, aceleradores gráficos para gerar gráficos mais rápidos, alguns chips para fazer edições rápidas em fotos, geralmente acoplados às câmeras digitais. As implementações são feitas em software quando a demanda por desempenho não é tanta, ao mesmo tempo em que as atualizações são frequentes, como os Sistemas Operacionais, os jogos e aplicativos em geral.
O MBR e MAR possuem, respectivamente, conexões diretas com os Barramentos de Dados e de Endereços. Ambos são situados na Unidade de Ciclo de Dados, por serem utilizados nas fases de processamento das instruções.


Apesar de não ser tão rápida quanto gostaríamos, a CPU é uma solução muito boa por permitir a execução de, praticamente, qualquer tipo de programa, se tornando uma máquina de propósito geral.
===Ponteiro da Pilha: (“Stack Pointer” - SP)===


Estrutura de uma CPU
Armazena o endereço da última posição ocupada da pilha (topo da pilha).
Toda CPU é formada por duas unidades, como podem ser vistas na [fig_CPU]:


Unidade de Controle (UC)
A pilha é uma estrutura de dados do tipo LIFO (“Last In First Out”), sendo utilizada para armazenamento
temporário de dados, como o endereço de retorno de uma sub-rotina ou o salvamento de registradores do microprocessador.


Unidade de Ciclo de Dados (UCD)
[[imagem: MIPstack.png|center]]


scaledwidth=“30%
Em muitos microprocessadores, quando um dado é inserido na pilha, o Stack Pointer é decrementado, ocorrendo o inverso quando um dado é retirado
Figura 6. Estrutura de uma CPU
A Unidade de Controle é responsável por receber instruções pelo Barramento de Instruções. As instruções vêem da memória de acordo com o endereço enviado pela UC para a memória através do Barramento de Endereço das Instruções (à esquerda da UC na [fig_CPU]). Já Unidade de Ciclo de Dados, como o próprio nome deixa entender, é responsável por tratar os dados propriamente ditos. A Unidade de Controle não executa as instruções. Ela as lê, decodifica e passa os comandos para a UCD determinando como as instruções devem ser executadas e com quais dados. Baseada nessas comandos, a UCD pode ir buscar os dados necessários na memória, executa as devidas operações e envia o resultado de volta para a memória para ser armazenado. Tudo controlado de acordo com os comandos internos enviados pela Unidade de Controle, que por sua vez se baseia na instrução decodificada. Os dados lidos, ou enviados para a memória, são transmitidos através do Barramento de Dados. Os endereços são enviados para a memória através do Barramento de Endereço.


Tudo isso é controlado por um sinal síncrono de relógio (clock, do inglês). A cada batida do relógio a unidade sabe que deve executar um passo, passar os dados para quem deve, e se preparar para o próximo passo. Quanto mais rápido é o relógio mais operações por segundo o processador consegue executar e mais rápido pode se tornar. A velocidade do relógio é medida em frequência, utilizando a unidade Herz (abreviatura é Hz). Um Herz significa um passo por segundo. Os processadores atuais trabalham na faixa dos poucos GHz (leia-se Giga Herz), entre 1 GHz e 5 GHz. Um Giga Herz significa um bilhão de passos por segundo. É por isso que os computadores são tão incríveis. Eles não executam operações extraordinárias. Pelo contrário. Executam operações extremamente simples, como somas, subtrações e multiplicações, mas fazem isso numa velocidade incrível.


Os papéis dos barramentos e da memória
Saindo um pouco de dentro da CPU, podemos enxergar os barramentos e a Memória Principal, como é apresentado na [fig_CPU_com_barramento]. Para facilitar a visualização, os Barramentos de Dados e de Endereço são apresentados replicados, tanto do lado esquerdo, quanto do direito da figura.


scaledwidth=“30%
Figura 7. Estrutura de uma CPU com barramentos
A comunicação da Unidade de Controle e da Unidade de Ciclo de Dados é feita sempre com a Memória Principal através dos barramentos. Os endereços são transmitidos sempre via Barramento de Endereços para a memória, sempre de forma unidirecional da CPU para a memória. Quando as instruções são transmitidas da memória para a Unidade de Controle, elas utilizam o Barramento de Dados. Isso porque as instruções são tratadas pela memória como um conteúdo como um outro qualquer. Ela não faz distinção entre dados e instruções. O mesmo Barramento de Dados é utilizado pela Unidade de Ciclo de Dados para receber os operando das operações a serem realizadas e para enviar os resultados de volta para a memória.


Fica claro então a importância da Memória Principal. Todo e qualquer programa só poderá ser executado a partir dela. Quando você, por exemplo, deseja executar um programa de um pendrive conectado pela USB do computador, ele antes precisa ser copiado para a Memória Principal. Só então ele será executado. A memória precisa ser grande o bastante para armazenar a maior quantidade possível de programas, e também precisa ser rápida o suficiente para buscar os dados e enviá-los o mais rapidamente possível à CPU, e também salvá-los no menor tempo possível. A velocidade das memórias é determinada essencialmente pela tecnologia de transistores utilizada. Essa tecnologia é relacionada ao preço. Quanto mais rápidas, mais caras elas são.
O tamanho e quantidade dos registradores de uma CPU é uma das principais decisões de projeto. Se forem grandes demais, ou em quantidade maior do que a necessária, podem resultar em desperdício e aumento desnecessário no preço do processador. Já se forem pequenos, ou em pouca quantidade, com certeza vão tornar o computador muito mais lento do que o desejado. Encontrar o tamanho e quantidade ideias é trabalhoso e geralmente é feito através de simuladores e de muito testes e anos de experiência.


Os registradores
===Registradores do ARM7===
Os registradores são memórias elaboradas com o mínimo de transistores possível, utilizando o que há de mais moderno em tecnologia de armazenamento. Elas são as memórias mais rápidas que podem ser construídas e por isso são também as mais caras. Por essa razão, elas aparecem numa quantidade muito pequena em um computador, na casa de alguns Kilo Bytes. Eles podem ser divididos em dois grupos. Os registradores de propósito geral, e os de propósito específico. Como o próprio nome diz, os primeiros podem ser utilizados pelos programas para quaisquer objetivos, já os segundos são específicos para algumas tarefas. Por exemplo, há um registrador na CPU para controlar se o processador deve continuar em execução, ou entrar em modo de espera por nova ordem. Se esse registrador receber um valor diferente de zero, o processador entrará em modo de espera, até que receba a ordem de modificar esse valor. Na [fig_arq_detalhada] os registradores de propósito específico apresentados são:


Program Counter (PC): Contador de Programas
O processador ARM tem 37 registradores, mas apenas 17 (ou 18, em alguns modos de operação) são acessíveis a cada momento.


Instruction Register (IR): Registrador de Instrução
Dos registradores acessíveis, 13 são registradores de propósito geral (r0 a r12).


Memory Address Register (MAR): Registrador de Endereço
Os outros quatro registradores têm funções específicas:


Memory Buffer Register (MBR): Registrador de Dados
* sp (do inglês stack pointer), apontador de pilha, também acessado pelo nome r13.
* lr (do inglês link register), registrador de ligação, também acessado pelo nome r14. Esse registrador recebe o endereço de retorno em chamadas de procedimento.
* pc (do inglês program counter), contador de programa, também acessado pelo nome r15. Indica o endereço da próxima instrução a ser executada.
* CPSR (do inglês ''current program status register'', registrador de estado corrente do programa), similar ao registrador de bits de status.


scaledwidth=“30%
Os registradores acessíveis em um dado momento formam o “banco” de registradores disponíveis ao programador.  
Figura 8. Estrutura de uma CPU com registradores
O PC contém o endereço de memória que será utilizado para buscar a próxima instrução a ser executada pela CPU. Antes de executar qualquer instrução, a CPU envia o conteúdo de PC para a memória através do Barramento de Endereço, a memória envia o conteúdo da memória nesse endereço através do Barramento de Dados. Esse conteúdo é então armazenado no IR. Já o IR, que recebeu a instrução que veio da memória, tem o objetivo de guardar a instrução e passá-la para a Unidade de Controle, que é quem vai lê-la e tomar as decisões necessárias para para que ela seja executada pela Unidade de Ciclo de Dados. Por se tratarem do processo de busca de instruções, o PC e o IR ficam instalados na Unidade de Controle. O PC possui conexão direta com o Barramento de Endereços, e o IR com o Barramento de Instruções.


Com relação ao MAR e ao MBR, eles possuem funções análogas ao PC e IR, respectivamente, mas referentes a dados e não a instruções. Quando uma operação precisa ser realizada com algum dado que está na memória (e não em um registrador), o endereço desse dado é passado para o MAR. A CPU então passa o conteúdo de MAR para a memória através do Barramento de Endereço, que retornará o conteúdo da memória nesse endereço através do Barramento de Dados. O conteúdo trazido pela memória será armazenado em MBR. Só então o dado poderá ser utilizado para o processamento inicialmente planejado. O MBR e MAR possuem, respectivamente, conexões diretas com os Barramentos de Dados e de Endereços. Ambos são situados na Unidade de Ciclo de Dados, por serem utilizados nas fases de processamento das instruções.
O banco de registradores, em momentos diferentes de execução, é constituído por diferentes registradores físicos.  


O tamanho e quantidade dos registradores de uma CPU é uma das principais decisões de projeto. Se forem grandes demais, ou em quantidade maior do que a necessária, podem resultar em desperdício e aumento desnecessário no preço do processador. Já se forem pequenos, ou em pouca quantidade, com certeza vão tornar o computador muito mais lento do que o desejado. Encontrar o tamanho e quantidade ideias é trabalhoso e geralmente é feito através de simuladores e de muito testes e anos de experiência.
O modo de operação corrente determina a composição dos registradores que formam o banco.
 
A Figura abaixo ilustra a composição do banco de registradores para cada modo de operação do processador.  
 
Na Figura, os registradores estão numerados de 0 a 36 (canto superior direito de cada registrador), indicando os 37 registradores físicos.
 
[[imagem: MIPbancoregistarm7.png|center]]
 
==UNIDADE DE CONTROLE (UC)==
 
Todos as funções de um microprocessador são controladas pela UC.
 
Ela retira cada instrução da memória (operação de busca ou ''fetch''), interpretando-a (operação chamada de decodificação), fornecendo os sinais de controle necessários à sua execução.
 
A UC em geral é constituída pelas seguintes partes:
 
* Circuitos de Temporização (Gerador de Clock): implementam o funcionamento síncrono do processador, indicando os instantes onde cada etapa da execução de uma instrução deve ocorrer. Em geral, o sinal de temporização (“clock”) é fornecido por um circuito oscilador a cristal associado a um circuito quadrador do sinal.
 
[[imagem: MIPxtal.png|center]]
[[imagem: MIPxtal2.png|center]]
 
* Controle e Decodificação (Memória de Microprogramas): memória de apenas leitura que possui as atividades internas que devem ser realizadas para a execução de cada instrução.
 
* Decodificador de Instrução: recebe a instrução que estava armazenada na memória e gera os códigos do Microprograma que realizará a tarefa definida por ela.
 
Em outras palavras:
 
A Unidade de Controle é responsável por receber instruções pelo Barramento de Instruções. Ao receber a instrução que está armazenada em IR, a decodifica e envia os sinais de controle para onde for necessário.
 
Decodificar nada mais é do que ler um código em binário e interpretar a operação relativa a esse código. Dependendo da operação, os sinais de controle podem ser internos, por exemplo, para a ULA executar uma soma, ou para o conteúdo de um registrador ser transferido para a ULA. Ou pode ser externo, para um dispositivo de entrada e saída, por exemplo, ou mesmo para a Memória Principal. Tudo isso depende da instrução a ser executada.
 
A Unidade de Controle não executa as instruções.
 
Ela as lê, decodifica e passa os comandos para a Unidade de Ciclo de Dados (UCD) determinando como as instruções devem ser executadas e com quais dados.
 
Baseada nessas comandos, a UCD pode ir buscar os dados necessários na memória, executa as devidas operações e envia o resultado de volta para a memória para ser armazenado. Tudo controlado de acordo com os comandos internos enviados pela Unidade de Controle, que por sua vez se baseia na instrução decodificada. Os dados lidos, ou enviados para a memória, são transmitidos através do Barramento de Dados. Os endereços são enviados para a memória através do Barramento de Endereço.
 
Tudo isso é controlado por um sinal síncrono de relógio (''clock'', do inglês).
 
A cada ciclo do relógio a unidade sabe que deve executar um passo, passar os dados para quem deve, e se preparar para o próximo passo.  


Os registradores de propósito geral são utilizados para guardar as variáveis dos programas. Como eles estão presentes em quantidades muito pequenas, são poucas as variáveis que ficam armazenadas em registradores. As demais ficam na Memória Principal. Quando uma operação precisa ser realizada e seus dados estão nos Registradores de Propósito Geral, a CPU não precisa buscá-los na memória e o processamento torna-se muito mais rápido.
Quanto mais rápido é o relógio mais operações por segundo o processador consegue executar e mais rápido pode se tornar. A velocidade do relógio é medida em frequência, utilizando a unidade Herz (abreviatura é Hz).  


Nota
Um Herz significa um passo por segundo.  
Lembre-se que as memórias são muito mais lentas do que os processadores!
A CPU tenta ao máximo manter as variáveis mais utilizadas nos registradores. Ela faz isso guardando aquelas mais usadas nas últimas operações. Nem sempre isso funciona, mas no geral, é a melhor solução.


Nota
Os processadores atuais trabalham na faixa dos poucos GHz, entre 1 GHz e 5 GHz. Um Giga Herz significa um bilhão de passos por segundo.  
Faça suas variáveis mais importantes serem bastante utilizadas. Usando-as em repetições, por exemplo. Isso aumentará as chances delas serem armazenadas em registradores, podendo acelerar a execução dos seus programas.
Unidade Lógica e Aritmética (ULA)
A Unidade Lógica e Aritmética, ou ULA, se assemelha muito com uma calculadora convencional. Ela executa operações lógicas e aritméticas. As ULAs modernas executam operações tanto com inteiros, como com números reais. A ULA recebe como entrada dois diferentes dados que são trazidos para ela dos registradores (de propósito geral, ou específicos) (veja a [fig_arq_detalhada]). Quem decide que registradores passarão seus dados para a ULA é a Unidade de Controle baseada instrução que está sendo executada. A Unidade de Controle também envia para a ULA qual operação será realizada (soma, multiplicação, divisão, AND, OR etc.). Assim que isso é feito, a ULA executa a operação e gera um resultado na sua saída. Esse resultado também é passado para um registrador escolhido pela Unidade de Controle, baseando-se na instrução em execução.


Unidade de Controle (UC)
A Unidade de Controle, ao receber a instrução que está armazenada em IR, a decodifica e envia os sinais de controle para onde for necessário. Decodificar nada mais é do que ler um código em binário e interpretar a operação relativa a esse código. Dependendo da operação, os sinais de controle podem ser internos, por exemplo, para a ULA executar uma soma, ou para o conteúdo de um registrador ser transferido para a ULA. Ou pode ser externo, para um dispositivo de entrada e saída, por exemplo, ou mesmo para a Memória Principal. Tudo isso depende da instrução a ser executada.


Na próxima seção será apresentada a execução de instruções em mais detalhes, o que facilitará o entendimento do funcionamento das CPUs.
Na próxima seção será apresentada a execução de instruções em mais detalhes, o que facilitará o entendimento do funcionamento das CPUs.


Ciclo de Instrução
===Ciclo de Instrução===
Toda CPU trabalha em dois ciclos principais, o Ciclo de Busca e o Ciclo de Execução, como pode ser visto na [fig_ciclo_instrucao]. Assim que o computador é iniciado, a CPU entra no Ciclo de Busca, em seguida passa para o Ciclo de Execução e depois volta para o Ciclo de Busca. Ela continua nesse processo até que precise ser desligada, saindo do Ciclo de Execução para o estado final.
 
Toda CPU trabalha em dois ciclos principais, o '''Ciclo de Busca''' e o '''Ciclo de Execução''', como pode ser visto na figura abaixo. Assim que o computador é iniciado, a CPU entra no Ciclo de Busca, em seguida passa para o Ciclo de Execução e depois volta para o Ciclo de Busca. Ela continua nesse processo até que precise ser desligada, saindo do Ciclo de Execução para o estado final.
 
[[imagem: MIPcicloinstr.png|center]]
 


scaledwidth=“30%
Figura 9. Ciclo de Instrução
Durante o Ciclo de Busca, é a Unidade de Controle que atua. Uma nova instrução é busca da Memória para que possa ser decodificada. Nessa fase os registradores PC e IR são utilizados, como apresentados na seção anterior. O PC é logo lido para se saber que instrução será executada, essa instrução é trazida para o IR e, finalmente, é decodificada pela Unidade de Controle. Assim que esse processo termina, caso a instrução não diga respeito à um laço, ou à uma repetição, o conteúdo de PC é incrementado. Ou seja, PC recebe PC + 1. Assim, no próximo Ciclo de Busca a instrução do endereço seguinte será carregada da memória e executada. Esse comportamento garante a característica de execução sequencial dos programas.
Durante o Ciclo de Busca, é a Unidade de Controle que atua. Uma nova instrução é busca da Memória para que possa ser decodificada. Nessa fase os registradores PC e IR são utilizados, como apresentados na seção anterior. O PC é logo lido para se saber que instrução será executada, essa instrução é trazida para o IR e, finalmente, é decodificada pela Unidade de Controle. Assim que esse processo termina, caso a instrução não diga respeito à um laço, ou à uma repetição, o conteúdo de PC é incrementado. Ou seja, PC recebe PC + 1. Assim, no próximo Ciclo de Busca a instrução do endereço seguinte será carregada da memória e executada. Esse comportamento garante a característica de execução sequencial dos programas.


No passo seguinte a CPU entra em Ciclo de Execução. Nessa etapa atua a Unidade de Ciclo de Dados. Agora a Unidade de Controle já sabe exatamente que operação será executada, com quais dados e o que fazer com o resultado. Essa informação é passada para a ULA e os registradores envolvidos. Durante o Ciclo de Execução há cinco possíveis tipos de operação que podem ser executadas:
No passo seguinte a CPU entra em Ciclo de Execução. Nessa etapa atua a Unidade de Ciclo de Dados. Agora a Unidade de Controle já sabe exatamente que operação será executada, com quais dados e o que fazer com o resultado. Essa informação é passada para a ULA e os registradores envolvidos. Durante o Ciclo de Execução há cinco possíveis tipos de operação que podem ser executadas:


Processador e memória
* Processador e memória - trata simplesmente da transferência de dados entre CPU e memória principal;
trata simplesmente da transferência de dados entre CPU e memória principal;
 
* Processador e Entrada e Saída - diz respeito à transferência de dados entre a CPU e um dispositivo de Entrada e Saída, como teclado, mouse, monitor, rede, impressora etc.;
 
* Processamento de Dados - são operações simplesmente de processamento dos dados, como operação aritmética ou lógica sobre os registradores da CPU;


Processador e Entrada e Saída
* Controle - são instruções que servem para controlar os dispositivos do computador, como para ligar um periférico, iniciar uma operação do disco rígido, ou transferir um dado que acabou de chegar pela Internet para a Memória Principal;
diz respeito à transferência de dados entre a CPU e um dispositivo de Entrada e Saída, como teclado, mouse, monitor, rede, impressora etc.;


Processamento de Dados
* Operações compostas - são operações que combinam uma ou mais instruções das outras em uma mesma operação.
são operações simplesmente de processamento dos dados, como operação aritmética ou lógica sobre os registradores da CPU;


Controle
===Busca de Dados===
são instruções que servem para controlar os dispositivos do computador, como para ligar um periférico, iniciar uma operação do disco rígido, ou transferir um dado que acabou de chegar pela Internet para a Memória Principal;


Operações compostas
Em operações entre Processador e Memória, é necessário que dados sejam trazidos da memória para servirem de entrada para a ULA, e/ou o resultado seja levado para armazenamento na memória no final da execução.  
são operações que combinam uma ou mais intrusões das outras em uma mesma operação.


Busca de Dados
Para isso acontecer, é executada uma Busca de Dados.  
Em operações entre Processador e Memória, é necessário que dados sejam trazidos da memória para servirem de entrada para a ULA, e/ou o resultado seja levado para armazenamento na memória no final da execução. Para isso acontecer, é executada uma Busca de Dados. Isso é determinado durante a decodificarão da instrução, no ciclo de Busca de Instrução. Isso acontece quando um dos parâmetros de uma operação aritmética é um endereço de memória, e não um valor diretamente, nem um registrador. Para isso, parte do conteúdo de IR é transferido para o MAR. Essa parte é justamente o endereço do parâmetro da instrução. Em seguida a Unidade do Controle requisita à memória uma leitura. Assim, o endereço, agora em MAR, é passado para a memória e o conteúdo lido da memória é passado para o MBR. Agora o conteúdo é transferido para a ULA para que a operação seja executada (lógica ou aritmética).
 
Isso é determinado durante a decodificarão da instrução, no ciclo de Busca de Instrução.  
 
Isso acontece quando um dos parâmetros de uma operação aritmética é um endereço de memória, e não um valor diretamente, nem um registrador.  
 
Para isso, parte do conteúdo de IR é transferido para o MAR. Essa parte é justamente o endereço do parâmetro da instrução. Em seguida a Unidade do Controle requisita à memória uma leitura. Assim, o endereço, agora em MAR, é passado para a memória e o conteúdo lido da memória é passado para o MBR. Agora o conteúdo é transferido para a ULA para que a operação seja executada (lógica ou aritmética).


Se a instrução tiver dois ou mais parâmetros de memória, serão necessárias outras Buscas de Dados. Como a memória é sempre mais lenta do que a CPU, instruções que necessitam Buscas de Dados são muito mais lentas do que instruções de Processamento de Dados.
Se a instrução tiver dois ou mais parâmetros de memória, serão necessárias outras Buscas de Dados. Como a memória é sempre mais lenta do que a CPU, instruções que necessitam Buscas de Dados são muito mais lentas do que instruções de Processamento de Dados.


Perceba que cada instrução pode exigir mais tempo de execução do que outras. Isso depende de quantos acessos à memória ela exigirá. Quanto mais acessos à memória, mais lenta a instrução. O ideal é sempre usar registradores. Mas nem sempre é possível utilizar registradores. Eles estão sempre em poucas quantidades e em menores tamanhos. Principalmente por serem caros. O que os computadores sempre tentam fazer é passar os dados da memória para os registradores assim que puderem, para que as próximas instruções sejam aceleradas.
Perceba que cada instrução pode exigir mais tempo de execução do que outras. Isso depende de quantos acessos à memória ela exigirá. Quanto mais acessos à memória, mais lenta a instrução. O ideal é sempre usar registradores. O que os computadores sempre tentam fazer é passar os dados da memória para os registradores assim que puderem, para que as próximas instruções sejam aceleradas.
 
===Interrupções===
 
Além do ciclo básico de instrução apresentado anteriormente, a CPU pode ainda executar outro tipo de tarefa.
 
Ela diz respeito ao processamento de pedidos oriundos dos dispositivos de Entrada e Saída.
 
Como o Ciclo de Instrução da CPU que vimos até o momento é fechado, ou seja, a CPU sempre fica em estado de repetição até que seja desligada, ela não pode atender a nenhum evento externo que não seja a execução de um programa.
 
Por exemplo, quando um usuário pressiona uma tecla do teclado, ou faz um movimento com o mouse, ou mesmo, quando uma mensagem chega pela Internet através da placa de rede.
 
O que a CPU deve fazer? Se ela estiver em um Ciclo de Instrução fechado como mostrado anteriormente, nada. Ela precisa parar o que está fazendo para atender ao evento ocorrido e, só então, voltar ao Ciclo de Instruções. Esse processo de parar o Ciclo de Instrução para atender a um evento externo é chamado de '''Interrupção'''.
 
O Ciclo de Instrução pode agora ser visto modificado na figura abaixo para atender às Interrupções. Todas interrupções são recebidas e armazenadas internamente por um dispositivo chamado '''Gerenciador de Interrupções'''. Esse dispositivo é um chip, semelhante à uma CPU, mas bem mais simples.
 
[[imagem: MIPinstrcominter.png|center]]
 
Sempre que uma nova interrupção chega nesse gerenciador, ele armazena esse código em sua memória e manda um sinal para CPU através do Barramento e Controle. Durante seu Ciclo de Instrução, sempre que uma instrução é executada, antes de voltar para o Ciclo de Busca, a CPU chega de algum sinal de interrupção foi enviado pelo Gerenciador de Interrupção.
 
Quando não há uma interrupção, a execução volta ao Ciclo de Busca e o programa em execução continua a ser executado. Mas se houver uma interrupção, a CPU agora vai parar a execução do programa atual para atender a interrupção.
 
Por exemplo, vamos supor que o usuário pressionou uma tecla do teclado. O código armazenado pelo Gerenciador de Interrupção indica que a interrupção veio do teclado. A CPU para sua execução do programa anterior e vai iniciar a execução de um programa especial, o Tratador de Interrupção.
 
O código do dispositivo (aqui seria o teclado) serve para a CPU saber o endereço do Tratador de Interrupção ela vai buscar da memória.
 
Então, ao sair do Checagem de Interrupção, a CPU muda o endereço do PC para o endereço do Tratador de Instrução. Assim, no Ciclo de Busca a próxima instrução a ser trazida da memória e posteriormente executada será a do tratador do teclado.
 
Cada tipo de interrupção precisa de um tratamento específico a ser feito. No caso do teclado, o tratador vai checar que tecla foi pressionada. Isso é feito através de uma leitura à memória do teclado (sim, todos dispositivos possuem uma pequena memória) para saber que tecla foi pressionada. Dependendo da tecla, uma operação diferente será executada.
 
Geralmente, a CPU adiciona o código da tecla pressionada num endereço específico de memória. Cada programa, lendo essa informação, tomará sua própria decisão sobre o que deve ser feito. O que acontece é que apenas o programa ativo no momento, vai ler esse conteúdo, executar a ação da tecla e limpar essa área de memória. Se o programa for um editor de texto, por exemplo, o código pode representar escrever a letra pressionada na posição atual do cursor dentro do texto.
 
Quando esse processo encerra, o tratamento é encerrado, e a CPU deve voltar a execução do programa que havia sido interrompido. Isso só é possível porque, antes de passar a execução do Tratador de Interrupção, a CPU '''salva os conteúdos de todos os registradores da CPU (inclusive o PC e o IR)'''.
 
Então, antes de devolver a execução para o programa, CPU restaura todos os valores dos registradores antes salvos. Dessa forma, o programa retoma exatamente do ponto em que parou.
 
As interrupções também ocorrem se o próprio programa em execução executar uma operação ilegal.
 
Isso é feito para evitar que a CPU entre em erro.
 
Por exemplo, se um programa tentar acessar uma área da memória que é proibida para ele, como a área de outro programa ou do Sistema Operacional.
 
Nesse caso, o programa é interrompido e não volta mais a executar, ele é finalizado e a execução é devolvida ao Sistema Operacional.
 
Algo semelhante ocorre em caso de defeitos em alguns dispositivos.  


Interrupções
Por exemplo, se um programa estiver lendo um arquivo que está em um pendrive, e esse ''pendrive'' é removido subitamente, uma interrupção é lançada e o programa é encerrado, já que ele não faz mais sentido estar em execução.
Além do ciclo básico de intrusão apresentado anteriormente, a CPU pode ainda executar outro tipo de tarefa. Ela diz respeito ao processamento de pedidos oriundos dos dispositivos de Entrada e Saída. Como o Ciclo de Instrução da CPU que vimos até o momento é fechado, ou seja, a CPU sempre fica em estado de repetição até que seja desligada, ela não pode atender a nenhum evento externo que não seja a execução de um programa. Por exemplo, quando um usuário pressiona uma tecla do teclado, ou faz um movimento com o mouse, ou mesmo, quando uma mensagem chega pela Internet através da placa de rede. O que a CPU deve fazer? Se ela estiver em um Ciclo de Instrução fechado como mostrado anteriormente, nada. Ela precisa parar o que está fazendo para atender ao evento ocorrido e, só então, voltar ao Ciclo de Instruções. Esse processo de parar o Ciclo de Instrução para atender a um evento externo é chamado de Interrupção.


O Ciclo de Instrução pode agora ser visto modificado na [fig_ciclo_com_interrupcao] para atender às Interrupções. Todas interrupções são recebidas e armazenadas internamente por um dispositivo chamado Gerenciador de Interrupções. Esse dispositivo é um chip, semelhante à uma CPU, mas bem mais simples.
==Sobre o desempenho==


scaledwidth=“30%
É possível agora perceber que o desempenho das CPUs depende de muito outros fatores além da velocidade do seu clock.
Figura 10. Ciclo de Instruções com interrupções
Na maioria dos computadores eles vêm soldados na Placa-Mãe, mas podem também vir dentro do chip da CPU. Toda interrupção possui um código de identificação. Sempre que uma nova interrupção chega nesse gerenciador, ele armazena esse código em sua memória e manda um sinal para CPU através do Barramento e Controle. Durante seu Ciclo de Instrução, sempre que uma instrução é executada, antes de voltar para o Ciclo de Busca, a CPU chega de algum sinal de interrupção foi enviado pelo Gerenciador de Interrupção.


Quando não há uma interrupção, a execução volta ao Ciclo de Busca e o programa em execução continua a ser executado. Mas se houver uma interrupção, a CPU agora vai parar a execução do programa atual para atender a interrupção. Por exemplo, vamos super que o usuário pressionou uma tecla do teclado. O código armazenado pelo Gerenciador de Interrupção indica que a interrupção veio do teclado. A CPU para sua execução do programa anterior e vai iniciar a execução de um programa especial, o Tratador de Interrupção. O código do dispositivo (aqui seria o teclado) serve para a CPU saber o endereço do Tratador de Interrupção ela vai buscar da memória. Então, ao sair do Checagem de Interrupção, a CPU muda o endereço do PC para o endereço do Tratador de Instrução. Assim, no Ciclo de Busca a próxima instrução a ser trazida da memória e posteriormente executada será a do tratador do teclado.
O computador precisa ter memórias rápidas para reduzir o tempo dos Ciclos de Busca, precisa de mais registradores para usar menos a memória e também que poucas interrupções ocorram.  


Cada tipo de interrupção precisa de um tratamento específico a ser feito. No caso do teclado, o tratador vai checar que tecla foi pressionada. Isso é feito através de uma leitura à memória do teclado (sim, todos dispositivos possuem uma pequena memória) para saber que tecla foi pressionada. Dependendo da tecla, uma operação diferente será executada. Geralmente, a CPU adiciona o código da tecla pressionada num endereço específico de memória. Cada programa, lendo essa informação, tomará sua própria decisão sobre o que deve ser feito. O que acontece é que apenas o programa ativo no momento, vai ler esse conteúdo, executar a ação da tecla e limpar essa área de memória. Se o programa for um editor de texto, por exemplo, o código pode representar escrever a letra pressionada na posição atual do cursor dentro do texto.
Cada vez que uma interrupção ocorre, o programa deve ser interrompido e a chamada deve ser atendida.  


Quando esse processo encerra, o tratamento é encerrado, e a CPU deve voltar a execução do programa que havia sido interrompido. Isso só é possível porque, antes de passar a execução do Tratador de Interrupção, a CPU salva os conteúdos de todos os registradores da CPU (inclusive o PC e o IR). Então, antes de devolver a execução para o programa, CPU restaura todos os valores dos registradores antes salvos. Dessa forma, o programa retoma exatamente do ponto em que parou.
Isso vai atrasar demais o tempo de execução dos programas, dando a impressão de baixo desempenho.


As interrupções também ocorrem se o próprio programa em execução executar uma operação ilegal. Isso é feito para evitar que a CPU entre em erro. Por exemplo, se um programa tentar acessar uma área da memória que é proibida para ele, como a área de outro programa ou do Sistema Operacional. Nesse caso, o programa é interrompido e não volta mais a executar, ele é finalizado e a execução é devolvida ao Sistema Operacional. Algo semelhante ocorre em caso de defeitos em alguns dispositivos. Por exemplo, se um programa estiver lendo um arquivo que está em um pendrive, e esse pendrive é removido subitamente, uma interrupção é lançada e o programa é encerrado, já que ele não faz mais sentido estar em execução.
Basicamente, há dois tipos programas, os orientados à CPU e os orientados a Entrada e Saída. Na figura abaixo, o comportamento dos primeiros é mostrado na parte a) e o dos segundos na parte b).


Sobre o desempenho
[[imagem: MIPexecio.png|center]]
É possível agora perceber que o desempenho das CPUs depende de muito outros fatores além da velocidade do seu clock. O computador precisa ter memórias rápidas para reduzir o tempo dos Ciclos de Busca, precisam de mais registradores para usar menos a memória e também que poucas interrupções ocorram. Cada vez que uma interrupção ocorre, o programa deve ser interrompido e a chamada deve ser atendida. Isso vai atrasar demais o tempo de execução dos programas, dando a impressão de baixo desempenho.


Basicamente, há dois tipos programas, os orientados à CPU e os orientados a Entrada e Saída. Na [fig_entrada_saida] o comportamento dos primeiros é mostrado na parte a) e o dos segundos na parte b).
Quando um programa é orientado à CPU, há momentos longos de processamento de CPU e curtos momentos de espera por um evento de Entrada e Saída.  


scaledwidth=“30%
É o exemplo de programas que fazem muitos cálculos matemáticos, como ferramentas de simulação, projetos de engenharia, computação gráfica e planilhas de cálculos. Inicialmente os dados de entrada são passados por um dispositivo de entrada, há longos momentos de cálculos e depois os resultados são passados para um dispositivo de entrada e saída.
Figura 11. Execução com várias interrupções
Quando um programa é orientado à CPU, há momentos longos de processamento de CPU e curtos momentos de espera por um evento de Entrada e Saída. É o exemplo de programas que fazem muitos cálculos matemáticos, como ferramentas de simulação, projetos de engenharia, computação gráfica e planilhas de cálculos. Inicialmente os dados de entrada são passados por um dispositivo de entrada, há longos momentos de cálculos e depois os resultados são passados para um dispositivo de entrada e saída.


Já nos programas orientados à Entrada e Saída (b), são aqueles chamados também de interativos. Há muitos momentos de interação e uso de dispositivos de Entrada e Saída, e poucos momentos de uso de CPU. Como é o caso de programas que usam muito de mouse e teclado, como os jogos e a própria navegação na internet.
Já nos programas orientados à Entrada e Saída (b), são aqueles chamados também de '''interativos'''.  


O que temos que ter em mente é que o desempenho de um computador está muito ligado ao perfil de cada usuário. Os Sistemas Operacionais são os responsáveis por escolher que tarefa colocar para executar a cada momento e por quanto tempo ela deve executar até que uma nova tarefa entre em execução. Assim, o papel do Sistema Operacional também é fundamental e determinante no desempenho do sistema. O que ele tenta fazer no máximo que pode, é tentar ocupar os tempos de espera de um programa com a execução de outro. Tarefa nada fácil!
Há muitos momentos de interação e uso de dispositivos de Entrada e Saída, e poucos momentos de uso de CPU. Como é o caso de programas que usam muito de mouse e teclado, como os jogos e a própria navegação na internet.


Exemplo de execução de um programa
O que temos que ter em mente é que o desempenho de um computador está muito ligado ao perfil de cada usuário.  
Suponha que queiramos executar uma instrução de máquina que soma dois números que estão na memória e salve o resultado em outro endereço de memória. Para tal, vamos indicar que a memória (M) se comporta como um vetor (um array) e entre colchetes indicaremos o endereço do dado, ou da instrução. Sendo assim, a instrução que gostaríamos de executar seria:


200: M[100] = M[101] + M[102]
Os Sistemas Operacionais são os responsáveis por escolher que tarefa colocar para executar a cada momento e por quanto tempo ela deve executar até que uma nova tarefa entre em execução. Assim, o papel do Sistema Operacional também é fundamental e determinante no desempenho do sistema. O que ele tenta fazer no máximo que pode, é tentar ocupar os tempos de espera de um programa com a execução de outro. Tarefa nada fácil!
Nesse caso, vamos ler que no endereço 200 da memória há uma instrução que precisa somar o conteúdo do endereço 101, com o conteúdo do endereço 102 e salvar o resultado no endereço 100 da memória. Supondo que M[101] contenha o valor 10, e M[102] contenha o valor 20, ao final da execução, o endereço 100 de memória (M[100]) deverá conter o valor 30.


Como uma instrução como essa será executada depende de cada arquitetura. Aqui vamos utilizar uma abordagem que quebra as instruções em pequenos passos simples, que facilitam o trabalho de decodificarão da CPU.
==Exemplo de execução de um programa==
 
Suponha que queiramos executar uma instrução de máquina que soma dois números que estão na memória e salve o resultado em outro endereço de memória. :
'''Exemplo'''
 
int x=10, y=20, z; // x foi criado no endereço 101, y, no 102 e z, no 100
...
z = x + y;
 
Para tal, vamos indicar que a memória (M) se comporta como um vetor (um array) e entre colchetes indicaremos o endereço do dado, ou da instrução.
 
Sendo assim, a instrução que gostaríamos de executar seria:
 
200: M[100] = M[101] + M[102]
 
Nesse caso, vamos ler que no endereço 200 da memória há uma instrução que precisa somar o conteúdo do endereço 101, com o conteúdo do endereço 102 e salvar o resultado no endereço 100 da memória.
 
Supondo que M[101] contenha o valor 10, e M[102] contenha o valor 20, ao final da execução, o endereço 100 de memória (M[100]) deverá conter o valor 30.
 
Como uma instrução como essa será executada depende de cada arquitetura.  
 
Aqui vamos utilizar uma abordagem que quebra as instruções em pequenos passos simples, que facilitam o trabalho de decodificarão da CPU.


Sendo assim, esse programa seria transformado na seguinte sequência de instruções e executado.
Sendo assim, esse programa seria transformado na seguinte sequência de instruções e executado.


PC = 200;
PC = 200;
//Envia comando de leitura de instrução para a memória
IR <- (M[100] = M[101] + M[102]) // Busca instrução da memória
PC = PC + 1
//Instrução é passada do IR para a Unidade de Controle


//Envia comando de leitura de instrução para a memória
A primeira ação seria realizar o Ciclo de Busca, visando trazer a instrução a ser executada da memória para o processador.


IR <- (M[100] = M[101] + M[102]) // Busca instrução da memória
O endereço da instrução (200) seria passado para o PC e um comando de leitura de instrução seria passado para a memória.


PC = PC + 1
Baseada no endereço trazido por PC, a memória localizaria a instrução e a enviaria para o processador, que a armazenaria no registrador IR.


//Instrução é passada do IR para a Unidade de Controle
Antes de passar a instrução para a Unidade de Controle para dar início à execução, o registrador PC é atualizado para o próximo endereço de memória, no caso, 201.
A primeira ação seria realizar o Ciclo de Busca, visando trazer a instrução a ser executada da memória para o processador. O endereço da instrução (200) seria passado para o PC e um comando de leitura de instrução seria passado para a memória. Baseada no endereço trazido por PC, a memória localizaria a instrução e a enviaria para o processador, que a armazenaria no registrador IR. Antes de passar a instrução para a Unidade de Controle para dar início à execução, o registrador PC é atualizado para o próximo endereço de memória, no caso, 201.


O próximo passo será iniciar o Ciclo de Execução:
O próximo passo será iniciar o Ciclo de Execução:


//O primeiro dado é trazido da memória para o registrador R1
//O primeiro dado é trazido da memória para o registrador R1
MAR = 101
//Envia comando de leitura de dado para a memória
MBR <- 10
R1 = MBR    // valor lido da memória é passado para o registrador R1
 
Como os dados a serem operados estão também na memória, é antes necessário executar uma operação de Busca de Operando, ou Busca de Dado.
 
O primeiro operando está no endereço 101. Sendo assim, o endereço 101 é passado para o registrador de endereço (MAR). Esse endereço é passado para a memória e é enviado um comando de leitura de dado.
 
O conteúdo, o valor 10, é então localizado pela memória e enviado para o processador, que o armazena no registrador de dados (MBR). Como o MBR será utilizado nas próximas etapas de execução, seu conteúdo é salvo em um registrador de propósito específico, o R1.
 
Em seguida, a Unidade de Controle passa para a busca do segundo operando, contido no endereço 102:
 
//O segundo dado é trazido da memória para o registrador R1
MAR = 102
//Envia comando de leitura de dado para a memória
MBR <- 20
R2 = MBR  // valor lido da memória é passado para o registrador R2
 
Essa etapa ainda faz parte do Ciclo de Execução, e também diz respeito à uma Busca de Dado. A busca é mesma do passo anterior, mas agora o endereço buscado é o 102, e o conteúdo é o 20, que é repassado para o registrador R2.
 
O próximo passo do Ciclo de Execução é executar a operação aritmética propriamente dita.
Isso geralmente é feito entre registradores de propósito geral, por serem mais rápidos do que se fosse tratar dados da memória.


MAR = 101
Os conteúdos de R1 e R2 são somados e armazenados em R3:


//Envia comando de leitura de dado para a memória
R3 = R1 + R2


MBR <- 10
Para finalizar o processo, o resultado deve ser armazenado de volta na memória:


R1 = MBR    // valor lido da memória é passado para o registrador R1
MAR = 100  // Endereço é passado para MAR
Como os dados a serem operados estão também na memória, é antes necessário executar uma operação de Busca de Operando, ou Busca de Dado. O primeiro operando está no endereço 101. Sendo assim, o endereço 101 é passado para o registrador de endereço (MAR). Esse endereço é passado para a memória e é enviado um comando de leitura de dado. O conteúdo, o valor 10, é então localizado pela memória e enviado para o processador, que o armazena no registrador de dados (MBR). Como o MBR será utilizado nas próximas etapas de execução, seu conteúdo é salvo em um registrador de propósito específico, o R1.
MBR = R3    // Resultado da operação é passado para MBR
// Comando de escrita é passado para a memória
M[100] <- 30    // Endereço 100 da memória recebe o valor 30


Em seguida, a Unidade de Controle passa para a busca do segundo operando, contido no endereço 102:
Para isso ser realizado, é preciso executar uma operação de escrita na memória.
 
O endereço 100 é então passado para MAR e o resultado da operação, salvo em R3 é passado para MBR.
 
Quando o comando de escrita é enviado pela Unidade de Controle para a memória, ela lê o endereço 100 pelo Barramento de Endereço e o valor 30 pelo Barramento de Dados e salva, então, o valor 30 no endereço 100.
 
Com isso a operação é finalizada. Essa operação foi executada em aproximadamente 14 passos.
 
Esse valor é aproximado porque alguns deles são apenas o envio de sinal para a memória, e isso geralmente é feito em paralelo com o passo seguinte.
 
Se cada passo for executado dentro um ciclo do relógio (ou ciclo de ''clock''), teremos 14 ciclos de ''clock'' para uma única instrução.
 
Mas perceba que o acesso à memória é sempre mais lento do que a execução do processador. Se cada acesso à memória levar 3 ciclos de ''clock'', teremos um total de 20 ciclos de ''clock''.
 
'''Nota'''
 
Apenas uma memória tipo Cache poderia ser acessada com apenas 3 ciclos de clock. Uma memória principal convencional precisa de entre 10 e 15 ciclos de clock para ser lida. Depende de sua tecnologia (e preço!). Parece bastante, mas algumas instruções podem levar muito mais ciclos do que isso, como operações com Ponto Flutuante (números reais), ou de acesso à um periférico, como o disco rígido. Isso depende muito de como o projeto do computador é elaborado.
 
Apesar do computador parecer pouco efetivo na execução de uma simples soma, como ele executa numa frequência de ''clock'' muito alta, ele acaba executando muitas operações por segundo.
 
Então, utilizar apenas a frequência de ''clock'' como medida de desempenho não é uma boa ideia.
 
O mais utilizado é medir a quantidade de operações aritméticas que o processador é capaz de executar por segundo.
 
Hoje em dia um computador pessoal está na escala dos alguns '''Milhões de Instruções por Segundo (ou MIPS)'''.
 
Nos capítulos a seguir vamos estudar como essas e outras medidas de despenho podem ser calculadas.
 
==BARRAMENTOS INTERNOS==
 
Um '''barramento''' ou '''via''' ou '''bus''' é um conjunto de pinos/conexões do microprocessador por onde trafegam um ou mais sinais de hardware.
 
Um microprocessador possui três tipos de barramentos utilizados para transporte: bus de dados, bus de endereços e bus de controle.
 
Os barramentos internos ou vias internas interligam os diversos componentes do microprocessador, conduzindo dados e endereços.
 
Para facilitar a visualização, os Barramentos de Dados e de Endereço são apresentados replicados, tanto do lado esquerdo, quanto do direito da figura.
 
[[imagem: MIPbusint.png|center]]
 
 
===Barramento de dados===
 
Barramento bidirecional, utilizado para realizar o intercâmbio de dados e instruções com o exterior. Uma das principais características de um microprocessador é o número de bits que o barramento de dados pode transferir, que determina se o processador é de 8, 16, 32 ou 64 bits.
 
Determina o número de bits da palavra de dados que pode ser transferida de/para o microprocessador e, também (quase sempre) o tamanho da palavra de dados que pode ser operada pela ALU.
 
===Barramento de endereços===
 
Barramento unidirecional, constituído de um conjunto de linhas de endereço que indicam a posição de memória onde se encontra o dado requisitado. Uma vez dada a posição, a informação armazenada na memória passará à CPU através do barramento de dados.
 
Define a quantidade de posições de memória e/ou de portas de entrada/saída que podem ser acessadas pelo microprocessador (para n bits do barramento de endereços, 2n bytes de memória podem ser endereçados, ou seja, 2n endereços físicos podem ser acessados – capacidade de endereçamento).
 
 
===Barramento de controle===


//O segundo dado é trazido da memória para o registrador R1
Barramento bidirecional, formado por um número variável de linhas, através das quais se controlam as unidades complementares (habilitação e desabilitação das memórias para leitura e escrita, permissão para periféricos ou coprocessadores acessarem as vias de dados e endereços).


MAR = 102
Transfere, para as diversas partes do sistema, sinais que definem e orientam toda a sua operação.
Sinais de controle típicos de um microprocessador são:


//Envia comando de leitura de dado para a memória
# leia de uma posição de memória (memory read);
# leia de uma porta de E/S (I/O read);
# escreva em uma posição de memória (memory write);
# escreva em uma porta de E/S (I/O write);
#  pedido de interrupção de programa (interruption request);
pedido de uso de vias (bus request ou hold request);
#  pedido de espera (wait ou ready);
#  sinal de relógio (clock); e
#  sinal de partida/reinício (reset).


MBR <- 20


R2 = MBR  // valor lido da memória é passado para o registrador R2
Essa etapa ainda faz parte do Ciclo de Execução, e também diz respeito à uma Busca de Dado. A busca é mesma do passo anterior, mas agora o endereço buscado é o 102, e o conteúdo é o 20, que é repassado para o registrador R2.


O próximo passo do Ciclo de Execução é executar a operação aritmética propriamente dita. Isso geralmente é feito entre registradores de propósito geral, por serem mais rápidos do que se fosse tratar dados da memória. Os conteúdos de R1 e R2 são somados e armazenados em R3:
A comunicação da Unidade de Controle e da Unidade de Ciclo de Dados é feita sempre com a Memória Principal através dos barramentos.  


R3 = R1 + R2
Os endereços são transmitidos sempre via Barramento de Endereços para a memória, sempre de forma unidirecional da CPU para a memória.
Para finalizar o processo, o resultado deve ser armazenado de volta na memória:


MAR = 100  // Endereço é passado para MAR
Quando as instruções são transmitidas da memória para a Unidade de Controle, elas utilizam o Barramento de Dados. Isso porque as instruções são tratadas pela memória como um conteúdo como um outro qualquer. Ela não faz distinção entre dados e instruções. O mesmo Barramento de Dados é utilizado pela Unidade de Ciclo de Dados para receber os operando das operações a serem realizadas e para enviar os resultados de volta para a memória.


MBR = R3    // Resultado da operação é passado para MBR
Fica claro então a importância da Memória Principal.


// Comando de escrita é passado para a memória
Todo e qualquer programa só poderá ser executado a partir dela.


M[100] <- 30    // Endereço 100 da memória recebe o valor 30
Quando você, por exemplo, deseja executar um programa de um pendrive conectado pela USB do computador, ele antes precisa ser copiado para a Memória Principal.  
Para isso ser realizado, é preciso executar uma operação de escrita na memória. O endereço 100 é então passado para MAR e o resultado da operação, salvo em R3 é passado para MBR. Quando o comando de escrita é enviado pela Unidade de Controle para a memória, ela lê o endereço 100 pelo Barramento de Endereço e o valor 30 pelo Barramento de Dados e salva, então, o valor 30 no endereço 100.


Com isso a operação é finalizada. Essa operação foi executada em aproximadamente 14 passos. Esse valor é aproximado porque alguns deles são apenas o envio de sinal para a memória, e isso geralmente é feito em paralelo com o passo seguinte. Se cada passo for executado dentro uma batida do relógio (ou ciclo de clock), teremos 14 ciclos de clock para uma única instrução. Mas perceba que o acesso à memória é sempre mais lento do que a execução do processador. Se cada acesso à memória levar 3 ciclos de clock, teremos um total de 20 ciclos de clock.
Só então ele será executado. A memória precisa ser grande o bastante para armazenar a maior quantidade possível de programas, e também precisa ser rápida o suficiente para buscar os dados e enviá-los o mais rapidamente possível à CPU, e também salvá-los no menor tempo possível. A velocidade das memórias é determinada essencialmente pela tecnologia de transistores utilizada. Essa tecnologia é relacionada ao preço. Quanto mais rápidas, mais caras elas são.


Nota
Apenas uma memória tipo Cache poderia ser acessada com apenas 3 ciclos de clock. Uma memória principal convencional precisa de entre 10 e 15 ciclos de clock para ser lida. Depende de sua tecnologia (e preço!).
Parece bastante, mas algumas instruções podem levar muito mais ciclos do que isso, como operações com Ponto Flutuante (números reais), ou de acesso à um periférico, como o disco rígido. Isso depende muito de como o projeto do computador é elaborado.


Apesar do computador parecer pouco efetivo na execução de uma simples soma, como ele executa numa frequência de clock muito alta, ele acaba executando muitas operações por segundo. Então, utilizar apenas a frequência de clock como medida de desempenho não é uma boa ideia. O mais utilizado é medir a quantidade de operações aritméticas que o processador é capaz de executar por segundo. Hoje em dia um computador pessoal está na escala dos alguns Milhões de Instruções por Segundo (ou MIPS). Mais a seguir vamos estudar como essas e outras medidas de despenho podem ser calculadas.
[[media: historproc.ppt| Histórico figuras]]


O que vem por aí
Até o momento vimos como um processador básico trabalha. Nas próximas seções desse capítulo vamos ver como o desempenho pode ser ainda mais aumentando adicionando técnicas avançadas de execução paralela e de técnicas de análise de programas.


Last updated 2014-02-17 22:58:57 BRT
-------------
{| border="1" cellpadding="5" cellspacing="0"
! style="background: #cdc5bf;" | [[MIP| << Página da disciplina ]]
! style="background: #cdc5bf;" | Aula 3 - O Processador
! style="background: #cdc5bf;" | [[AULA 4 - Microprocessadores - Graduação | Aritmética computacional>> ]]
|}

Edição atual tal como às 14h19min de 20 de agosto de 2019

O MICROPROCESSADOR

Nesse capítulo vamos estudar a parte mais importante de um computador, que é a Unidade Central de Processamento (UCP, ou, do inglês, CPU), também conhecida como microprocessador, ou simplesmente, processador.

MIPcpu.png

A CPU é responsável não apenas por executar os programas contidos na memória, mas também por controlar todos os dispositivos de entrada e saída.

Seu avanço ao longo dos anos tem permitido que programas fossem executados cada vez mais rapidamente. Hoje temos processadores de vários núcleos capazes de executar várias atividades ao mesmo tempo. São esses processadores e funcionalidades que iremos estudar nesse capítulo.

Os programas de computador são sequências finitas de passos que foram definidas por um programador para alcançar um objetivo específico.

Cada passo desse programa é chamado de instrução.

MIPinstrucao.png

Não necessariamente, uma instrução escrito em uma linguagem de alto nível, como C, Java, Python, por exemplo, é diretamente transformada em uma instrução de máquina e armazenada em memória para execução da CPU.

Na verdade, geralmente, uma instrução de uma linguagem de alto nível embute vários comandos e ações a serem executadas pela CPU.

Essa é a principal razão da criação dessas linguagens de alto nível. O programador deve ter o menor trabalho possível ao escrever um programa. Ele deve se preocupar com o problema que está tentando solucionar, e em memorizar dezenas de comandos de uma linguagem de máquina extensa e repleta de detalhes.

MIPcompilacao.png

Após compilado, o programada de linguagem de alto nível é transformado em um programa apenas com instruções de máquina. Cada instrução de máquina contém apenas uma única operação a ser realizada pela CPU. Para ser executado, esse programa deve ser transferido para a Memória Principal.

Assim que um usuário clica com o mouse, ou pressiona a tecla Enter do teclado solicitando que um determinado programa execute, o Sistema Operacional copia o programa para a memória e solicita que a CPU o execute.

Um programa em linguagem de máquina é formado por instruções em binário. A cada instrução trazida da memória, a CPU lê seu código binário de operação para saber do que se trata, e inicia o processo de execução.

Apesar de existirem diversos fabricantes e famílias de CPUs, ou microprocessadores, pode-se identificar muitos aspectos comuns no que diz respeito à arquitetura desses componentes.

Em geral, o bom conhecimento de algum deles acelera o aprendizado de outro.

Do ponto de vista de funcionamento, basicamente um microprocessador:

  1. lê, uma-a-uma, as instruções de um programa armazenado na memória,
  2. obtém os seus operandos quando necessário,
  3. manipula os dados de acordo com o especificado no código da instrução, podendo ainda,
  4. ler dados de dispositivos de entrada e enviar dados para dispositivos de saída.

Apesar de cada Microprocessador ter suas peculiaridades, sua estrutura interna é bastante semelhante e pode ser generalizada.

A estrutura interna de um Microprocessador pode ser ilustrada na figura 2.1.

MIPestrutmip.png
MIPestrutmip2.png

Por exemplo, a arquitetura interna de um processador ARM é:


MIPestrutarm.png

Para administrar operações de leitura/escrita da memória ou de uma E/S de dados são necessárias:

  • uma unidade de controle, que orienta a busca ou o envio das informações, faz a decodificação e execução das instruções e fornece os sinais de temporização adequados para as diversas partes do processador e do próprio computador;
  • uma pequena capacidade de memória onde estas informações (dados, endereços e instruções) possam ficar temporariamente armazenadas (registrador de uso geral); e
  • alguns barramentos (ou vias) onde possam ser manipulados os dados, os endereços e

os sinais de controle.

Para executar operações aritméticas e lógicas é necessária a presença de uma ALU (arithmetic and logic unit – unidade lógica/aritmética).

Para interpretar as instruções estabelecidas por um programa devem existir:

  • um decodificador de instrução (microcódigo) e;
  • um registrador de instrução, no qual a instrução recebida fica temporariamente

armazenada.

Um Microprocessador é a parte principal de um microcomputador e a sua principal responsabilidade é executar instruções, que em última análise controlam todas as suas partes.


Unidade Lógica e Aritmética (ULA)

A Unidade Lógica e Aritmética, ou ULA, se assemelha muito com uma calculadora convencional. Ela executa operações lógicas (NOT, AND, OR, XOR) e aritméticas (geralmente adição, subtração, multiplicação, divisão, dependendo do microprocessador).

MIPula1.png
MIPula2.png

As ULAs modernas executam operações tanto com inteiros, como com números reais. Em algumas arquiteturas, porém, estas operações são realizadas por módulos separados: a ULA, para inteiros, e a UPF - Unidade de Ponto Flutuante (ou FPU), para reais.

A inclusão da FPU veio permitir a execução de operações antes só possíveis com o auxílio de um coprocessador aritmético (operações em ponto flutuante).

MIPupf.png

A ULA recebe como entrada dois diferentes dados que são trazidos para ela dos registradores.

MIPula3.png

Quem decide que registradores passarão seus dados para a ULA é a Unidade de Controle, baseada na instrução que está sendo executada.

A Unidade de Controle também envia para a ULA qual operação será realizada (soma, multiplicação, divisão, AND, OR, comparação, etc). Assim que isso é feito, a ULA executa a operação e gera um resultado na sua saída.

MIPula4.png

Esse resultado também é passado para um registrador escolhido pela Unidade de Controle, baseando-se na instrução em execução. Normalmente, o resultado de uma operação é armazenado no acumulador.

Registradores

Os registradores são um conjunto de memórias locais rápidas do microprocessador, destinada ao armazenamento de dados e instruções.

São elaboradas com o mínimo de transistores possível, utilizando o que há de mais moderno em tecnologia de armazenamento.

São as memórias mais rápidas que podem ser construídas e por isso são também as mais caras. Por essa razão, aparecem numa quantidade muito pequena em um computador, na casa de alguns KBytes.

Eles podem ser divididos em dois grupos: Os registradores de propósito geral, e os de propósito específico.

  • De propósito geral: como o próprio nome diz, são utilizados pelos programas para quaisquer objetivos gerais, como por exemplo, para as operações de movimentação de dados e operações lógicas e aritméticas.
  • Especiais: são registradores com funções específicas para determinados fins e tarefas.

Os registradores de propósito geral são utilizados para guardar as variáveis dos programas. Como eles estão presentes em quantidades muito pequenas, são poucas as variáveis que ficam armazenadas em registradores. As demais ficam na Memória Principal.


MIPbancoregisPPG.png


Quando uma operação precisa ser realizada e seus dados estão nos Registradores de Propósito Geral, a CPU não precisa buscá-los na memória e o processamento torna-se muito mais rápido.


Nota 1

Lembre-se que as memórias são muito mais lentas do que os processadores! Da ordem de 10 x mais lentas. A CPU tenta ao máximo manter as variáveis mais utilizadas nos registradores. Ela faz isso guardando aquelas mais usadas nas últimas operações. Nem sempre isso funciona, mas no geral, é a melhor solução.

Nota 2

O modificador register da linguagem C obriga a CPU a armazenar uma determinada variável inteira (por exemplo, contadora) no banco de registradores PPG.

Os registradores especiais são utilizados para funções específicas. Normalmente, para armazenar palavras especiais ou para sinalizar status do processador.

São exemplos de registradores especiais:

Acumulador

É o principal registrador dentro de um processador, participando da maioria das operações lógicas e aritméticas, sendo em geral fonte de um dos operandos, e destino dos resultados das operações, além de participar das operações de entrada e saída de dados.

Registrador de Flags

Armazena os indicadores de estado do processador (1 bit cada estado), como a ocorrência de um estouro numa operação aritmética, ou a ocorrência de um resultado nulo, dentre outros.

Contador do Programa: (“Program Counter” - PC)

O PC contém o endereço de memória que será utilizado para buscar a próxima instrução a ser executada pela CPU. Antes de executar qualquer instrução, a CPU envia o conteúdo de PC para a memória, através do Barramento de Endereço, a memória envia o conteúdo da memória nesse endereço, através do Barramento de Dados. Esse conteúdo é então armazenado no IR.

É o registrador, então, que armazena o endereço de memória do início da próxima instrução a ser executada. Após a leitura de um byte de uma instrução, o contador do programa é incrementado, apontando para o seu próximo byte (se houver).

Ao final da instrução, o contador do programa sempre armazena o endereço da próxima instrução a ser executada. O valor do contador do programa pode mudar de forma não seqüencial quando alguma instrução de desvio ou chamada de sub-rotina é executada, sendo um novo endereço carregado neste registrador.

Registrador de Instruções ("Instruction Register" - IR)

Já o IR, que recebeu a instrução que veio da memória, tem o objetivo de guardar a instrução e passá-la para a Unidade de Controle, que é quem vai lê-la e tomar as decisões necessárias para para que ela seja executada pela Unidade de Ciclo de Dados.

Por se tratar do processo de busca de instruções, o PC e o IR ficam instalados na Unidade de Controle. O PC possui conexão direta com o Barramento de Endereços, e o IR, com o Barramento de Instruções.

Registrador de Endereço de Memória ("Memory Address Register" - MAR) e Registrador de Buffer de Memória ("Memory Buffer Register" - MBR)

Com relação ao MAR e ao MBR, eles possuem funções análogas ao PC e IR, respectivamente, mas referentes a dados e não a instruções.

Quando uma operação precisa ser realizada com algum dado que está na memória (e não em um registrador), o endereço desse dado é passado para o MAR.

A CPU então passa o conteúdo de MAR para a memória através do Barramento de Endereço, que retornará o conteúdo da memória nesse endereço através do Barramento de Dados.

O conteúdo trazido pela memória será armazenado em MBR. Só então o dado poderá ser utilizado para o processamento inicialmente planejado.

O MBR e MAR possuem, respectivamente, conexões diretas com os Barramentos de Dados e de Endereços. Ambos são situados na Unidade de Ciclo de Dados, por serem utilizados nas fases de processamento das instruções.

Ponteiro da Pilha: (“Stack Pointer” - SP)

Armazena o endereço da última posição ocupada da pilha (topo da pilha).

A pilha é uma estrutura de dados do tipo LIFO (“Last In First Out”), sendo utilizada para armazenamento temporário de dados, como o endereço de retorno de uma sub-rotina ou o salvamento de registradores do microprocessador.

MIPstack.png

Em muitos microprocessadores, quando um dado é inserido na pilha, o Stack Pointer é decrementado, ocorrendo o inverso quando um dado é retirado



O tamanho e quantidade dos registradores de uma CPU é uma das principais decisões de projeto. Se forem grandes demais, ou em quantidade maior do que a necessária, podem resultar em desperdício e aumento desnecessário no preço do processador. Já se forem pequenos, ou em pouca quantidade, com certeza vão tornar o computador muito mais lento do que o desejado. Encontrar o tamanho e quantidade ideias é trabalhoso e geralmente é feito através de simuladores e de muito testes e anos de experiência.

Registradores do ARM7

O processador ARM tem 37 registradores, mas apenas 17 (ou 18, em alguns modos de operação) são acessíveis a cada momento.

Dos registradores acessíveis, 13 são registradores de propósito geral (r0 a r12).

Os outros quatro registradores têm funções específicas:

  • sp (do inglês stack pointer), apontador de pilha, também acessado pelo nome r13.
  • lr (do inglês link register), registrador de ligação, também acessado pelo nome r14. Esse registrador recebe o endereço de retorno em chamadas de procedimento.
  • pc (do inglês program counter), contador de programa, também acessado pelo nome r15. Indica o endereço da próxima instrução a ser executada.
  • CPSR (do inglês current program status register, registrador de estado corrente do programa), similar ao registrador de bits de status.

Os registradores acessíveis em um dado momento formam o “banco” de registradores disponíveis ao programador.

O banco de registradores, em momentos diferentes de execução, é constituído por diferentes registradores físicos.

O modo de operação corrente determina a composição dos registradores que formam o banco.

A Figura abaixo ilustra a composição do banco de registradores para cada modo de operação do processador.

Na Figura, os registradores estão numerados de 0 a 36 (canto superior direito de cada registrador), indicando os 37 registradores físicos.

MIPbancoregistarm7.png

UNIDADE DE CONTROLE (UC)

Todos as funções de um microprocessador são controladas pela UC.

Ela retira cada instrução da memória (operação de busca ou fetch), interpretando-a (operação chamada de decodificação), fornecendo os sinais de controle necessários à sua execução.

A UC em geral é constituída pelas seguintes partes:

  • Circuitos de Temporização (Gerador de Clock): implementam o funcionamento síncrono do processador, indicando os instantes onde cada etapa da execução de uma instrução deve ocorrer. Em geral, o sinal de temporização (“clock”) é fornecido por um circuito oscilador a cristal associado a um circuito quadrador do sinal.
MIPxtal.png
MIPxtal2.png
  • Controle e Decodificação (Memória de Microprogramas): memória de apenas leitura que possui as atividades internas que devem ser realizadas para a execução de cada instrução.
  • Decodificador de Instrução: recebe a instrução que estava armazenada na memória e gera os códigos do Microprograma que realizará a tarefa definida por ela.

Em outras palavras:

A Unidade de Controle é responsável por receber instruções pelo Barramento de Instruções. Ao receber a instrução que está armazenada em IR, a decodifica e envia os sinais de controle para onde for necessário.

Decodificar nada mais é do que ler um código em binário e interpretar a operação relativa a esse código. Dependendo da operação, os sinais de controle podem ser internos, por exemplo, para a ULA executar uma soma, ou para o conteúdo de um registrador ser transferido para a ULA. Ou pode ser externo, para um dispositivo de entrada e saída, por exemplo, ou mesmo para a Memória Principal. Tudo isso depende da instrução a ser executada.

A Unidade de Controle não executa as instruções.

Ela as lê, decodifica e passa os comandos para a Unidade de Ciclo de Dados (UCD) determinando como as instruções devem ser executadas e com quais dados.

Baseada nessas comandos, a UCD pode ir buscar os dados necessários na memória, executa as devidas operações e envia o resultado de volta para a memória para ser armazenado. Tudo controlado de acordo com os comandos internos enviados pela Unidade de Controle, que por sua vez se baseia na instrução decodificada. Os dados lidos, ou enviados para a memória, são transmitidos através do Barramento de Dados. Os endereços são enviados para a memória através do Barramento de Endereço.

Tudo isso é controlado por um sinal síncrono de relógio (clock, do inglês).

A cada ciclo do relógio a unidade sabe que deve executar um passo, passar os dados para quem deve, e se preparar para o próximo passo.

Quanto mais rápido é o relógio mais operações por segundo o processador consegue executar e mais rápido pode se tornar. A velocidade do relógio é medida em frequência, utilizando a unidade Herz (abreviatura é Hz).

Um Herz significa um passo por segundo.

Os processadores atuais trabalham na faixa dos poucos GHz, entre 1 GHz e 5 GHz. Um Giga Herz significa um bilhão de passos por segundo.


Na próxima seção será apresentada a execução de instruções em mais detalhes, o que facilitará o entendimento do funcionamento das CPUs.

Ciclo de Instrução

Toda CPU trabalha em dois ciclos principais, o Ciclo de Busca e o Ciclo de Execução, como pode ser visto na figura abaixo. Assim que o computador é iniciado, a CPU entra no Ciclo de Busca, em seguida passa para o Ciclo de Execução e depois volta para o Ciclo de Busca. Ela continua nesse processo até que precise ser desligada, saindo do Ciclo de Execução para o estado final.

MIPcicloinstr.png


Durante o Ciclo de Busca, é a Unidade de Controle que atua. Uma nova instrução é busca da Memória para que possa ser decodificada. Nessa fase os registradores PC e IR são utilizados, como apresentados na seção anterior. O PC é logo lido para se saber que instrução será executada, essa instrução é trazida para o IR e, finalmente, é decodificada pela Unidade de Controle. Assim que esse processo termina, caso a instrução não diga respeito à um laço, ou à uma repetição, o conteúdo de PC é incrementado. Ou seja, PC recebe PC + 1. Assim, no próximo Ciclo de Busca a instrução do endereço seguinte será carregada da memória e executada. Esse comportamento garante a característica de execução sequencial dos programas.

No passo seguinte a CPU entra em Ciclo de Execução. Nessa etapa atua a Unidade de Ciclo de Dados. Agora a Unidade de Controle já sabe exatamente que operação será executada, com quais dados e o que fazer com o resultado. Essa informação é passada para a ULA e os registradores envolvidos. Durante o Ciclo de Execução há cinco possíveis tipos de operação que podem ser executadas:

  • Processador e memória - trata simplesmente da transferência de dados entre CPU e memória principal;
  • Processador e Entrada e Saída - diz respeito à transferência de dados entre a CPU e um dispositivo de Entrada e Saída, como teclado, mouse, monitor, rede, impressora etc.;
  • Processamento de Dados - são operações simplesmente de processamento dos dados, como operação aritmética ou lógica sobre os registradores da CPU;
  • Controle - são instruções que servem para controlar os dispositivos do computador, como para ligar um periférico, iniciar uma operação do disco rígido, ou transferir um dado que acabou de chegar pela Internet para a Memória Principal;
  • Operações compostas - são operações que combinam uma ou mais instruções das outras em uma mesma operação.

Busca de Dados

Em operações entre Processador e Memória, é necessário que dados sejam trazidos da memória para servirem de entrada para a ULA, e/ou o resultado seja levado para armazenamento na memória no final da execução.

Para isso acontecer, é executada uma Busca de Dados.

Isso é determinado durante a decodificarão da instrução, no ciclo de Busca de Instrução.

Isso acontece quando um dos parâmetros de uma operação aritmética é um endereço de memória, e não um valor diretamente, nem um registrador.

Para isso, parte do conteúdo de IR é transferido para o MAR. Essa parte é justamente o endereço do parâmetro da instrução. Em seguida a Unidade do Controle requisita à memória uma leitura. Assim, o endereço, agora em MAR, é passado para a memória e o conteúdo lido da memória é passado para o MBR. Agora o conteúdo é transferido para a ULA para que a operação seja executada (lógica ou aritmética).

Se a instrução tiver dois ou mais parâmetros de memória, serão necessárias outras Buscas de Dados. Como a memória é sempre mais lenta do que a CPU, instruções que necessitam Buscas de Dados são muito mais lentas do que instruções de Processamento de Dados.

Perceba que cada instrução pode exigir mais tempo de execução do que outras. Isso depende de quantos acessos à memória ela exigirá. Quanto mais acessos à memória, mais lenta a instrução. O ideal é sempre usar registradores. O que os computadores sempre tentam fazer é passar os dados da memória para os registradores assim que puderem, para que as próximas instruções sejam aceleradas.

Interrupções

Além do ciclo básico de instrução apresentado anteriormente, a CPU pode ainda executar outro tipo de tarefa.

Ela diz respeito ao processamento de pedidos oriundos dos dispositivos de Entrada e Saída.

Como o Ciclo de Instrução da CPU que vimos até o momento é fechado, ou seja, a CPU sempre fica em estado de repetição até que seja desligada, ela não pode atender a nenhum evento externo que não seja a execução de um programa.

Por exemplo, quando um usuário pressiona uma tecla do teclado, ou faz um movimento com o mouse, ou mesmo, quando uma mensagem chega pela Internet através da placa de rede.

O que a CPU deve fazer? Se ela estiver em um Ciclo de Instrução fechado como mostrado anteriormente, nada. Ela precisa parar o que está fazendo para atender ao evento ocorrido e, só então, voltar ao Ciclo de Instruções. Esse processo de parar o Ciclo de Instrução para atender a um evento externo é chamado de Interrupção.

O Ciclo de Instrução pode agora ser visto modificado na figura abaixo para atender às Interrupções. Todas interrupções são recebidas e armazenadas internamente por um dispositivo chamado Gerenciador de Interrupções. Esse dispositivo é um chip, semelhante à uma CPU, mas bem mais simples.

MIPinstrcominter.png

Sempre que uma nova interrupção chega nesse gerenciador, ele armazena esse código em sua memória e manda um sinal para CPU através do Barramento e Controle. Durante seu Ciclo de Instrução, sempre que uma instrução é executada, antes de voltar para o Ciclo de Busca, a CPU chega de algum sinal de interrupção foi enviado pelo Gerenciador de Interrupção.

Quando não há uma interrupção, a execução volta ao Ciclo de Busca e o programa em execução continua a ser executado. Mas se houver uma interrupção, a CPU agora vai parar a execução do programa atual para atender a interrupção.

Por exemplo, vamos supor que o usuário pressionou uma tecla do teclado. O código armazenado pelo Gerenciador de Interrupção indica que a interrupção veio do teclado. A CPU para sua execução do programa anterior e vai iniciar a execução de um programa especial, o Tratador de Interrupção.

O código do dispositivo (aqui seria o teclado) serve para a CPU saber o endereço do Tratador de Interrupção ela vai buscar da memória.

Então, ao sair do Checagem de Interrupção, a CPU muda o endereço do PC para o endereço do Tratador de Instrução. Assim, no Ciclo de Busca a próxima instrução a ser trazida da memória e posteriormente executada será a do tratador do teclado.

Cada tipo de interrupção precisa de um tratamento específico a ser feito. No caso do teclado, o tratador vai checar que tecla foi pressionada. Isso é feito através de uma leitura à memória do teclado (sim, todos dispositivos possuem uma pequena memória) para saber que tecla foi pressionada. Dependendo da tecla, uma operação diferente será executada.

Geralmente, a CPU adiciona o código da tecla pressionada num endereço específico de memória. Cada programa, lendo essa informação, tomará sua própria decisão sobre o que deve ser feito. O que acontece é que apenas o programa ativo no momento, vai ler esse conteúdo, executar a ação da tecla e limpar essa área de memória. Se o programa for um editor de texto, por exemplo, o código pode representar escrever a letra pressionada na posição atual do cursor dentro do texto.

Quando esse processo encerra, o tratamento é encerrado, e a CPU deve voltar a execução do programa que havia sido interrompido. Isso só é possível porque, antes de passar a execução do Tratador de Interrupção, a CPU salva os conteúdos de todos os registradores da CPU (inclusive o PC e o IR).

Então, antes de devolver a execução para o programa, CPU restaura todos os valores dos registradores antes salvos. Dessa forma, o programa retoma exatamente do ponto em que parou.

As interrupções também ocorrem se o próprio programa em execução executar uma operação ilegal.

Isso é feito para evitar que a CPU entre em erro.

Por exemplo, se um programa tentar acessar uma área da memória que é proibida para ele, como a área de outro programa ou do Sistema Operacional.

Nesse caso, o programa é interrompido e não volta mais a executar, ele é finalizado e a execução é devolvida ao Sistema Operacional.

Algo semelhante ocorre em caso de defeitos em alguns dispositivos.

Por exemplo, se um programa estiver lendo um arquivo que está em um pendrive, e esse pendrive é removido subitamente, uma interrupção é lançada e o programa é encerrado, já que ele não faz mais sentido estar em execução.

Sobre o desempenho

É possível agora perceber que o desempenho das CPUs depende de muito outros fatores além da velocidade do seu clock.

O computador precisa ter memórias rápidas para reduzir o tempo dos Ciclos de Busca, precisa de mais registradores para usar menos a memória e também que poucas interrupções ocorram.

Cada vez que uma interrupção ocorre, o programa deve ser interrompido e a chamada deve ser atendida.

Isso vai atrasar demais o tempo de execução dos programas, dando a impressão de baixo desempenho.

Basicamente, há dois tipos programas, os orientados à CPU e os orientados a Entrada e Saída. Na figura abaixo, o comportamento dos primeiros é mostrado na parte a) e o dos segundos na parte b).

MIPexecio.png

Quando um programa é orientado à CPU, há momentos longos de processamento de CPU e curtos momentos de espera por um evento de Entrada e Saída.

É o exemplo de programas que fazem muitos cálculos matemáticos, como ferramentas de simulação, projetos de engenharia, computação gráfica e planilhas de cálculos. Inicialmente os dados de entrada são passados por um dispositivo de entrada, há longos momentos de cálculos e depois os resultados são passados para um dispositivo de entrada e saída.

Já nos programas orientados à Entrada e Saída (b), são aqueles chamados também de interativos.

Há muitos momentos de interação e uso de dispositivos de Entrada e Saída, e poucos momentos de uso de CPU. Como é o caso de programas que usam muito de mouse e teclado, como os jogos e a própria navegação na internet.

O que temos que ter em mente é que o desempenho de um computador está muito ligado ao perfil de cada usuário.

Os Sistemas Operacionais são os responsáveis por escolher que tarefa colocar para executar a cada momento e por quanto tempo ela deve executar até que uma nova tarefa entre em execução. Assim, o papel do Sistema Operacional também é fundamental e determinante no desempenho do sistema. O que ele tenta fazer no máximo que pode, é tentar ocupar os tempos de espera de um programa com a execução de outro. Tarefa nada fácil!

Exemplo de execução de um programa

Suponha que queiramos executar uma instrução de máquina que soma dois números que estão na memória e salve o resultado em outro endereço de memória. : Exemplo

int x=10, y=20, z; // x foi criado no endereço 101, y, no 102 e z, no 100
...
z = x + y;

Para tal, vamos indicar que a memória (M) se comporta como um vetor (um array) e entre colchetes indicaremos o endereço do dado, ou da instrução.

Sendo assim, a instrução que gostaríamos de executar seria:

200: M[100] = M[101] + M[102]

Nesse caso, vamos ler que no endereço 200 da memória há uma instrução que precisa somar o conteúdo do endereço 101, com o conteúdo do endereço 102 e salvar o resultado no endereço 100 da memória.

Supondo que M[101] contenha o valor 10, e M[102] contenha o valor 20, ao final da execução, o endereço 100 de memória (M[100]) deverá conter o valor 30.

Como uma instrução como essa será executada depende de cada arquitetura.

Aqui vamos utilizar uma abordagem que quebra as instruções em pequenos passos simples, que facilitam o trabalho de decodificarão da CPU.

Sendo assim, esse programa seria transformado na seguinte sequência de instruções e executado.

PC = 200;
//Envia comando de leitura de instrução para a memória
IR <- (M[100] = M[101] + M[102]) // Busca instrução da memória
PC = PC + 1
//Instrução é passada do IR para a Unidade de Controle

A primeira ação seria realizar o Ciclo de Busca, visando trazer a instrução a ser executada da memória para o processador.

O endereço da instrução (200) seria passado para o PC e um comando de leitura de instrução seria passado para a memória.

Baseada no endereço trazido por PC, a memória localizaria a instrução e a enviaria para o processador, que a armazenaria no registrador IR.

Antes de passar a instrução para a Unidade de Controle para dar início à execução, o registrador PC é atualizado para o próximo endereço de memória, no caso, 201.

O próximo passo será iniciar o Ciclo de Execução:

//O primeiro dado é trazido da memória para o registrador R1
MAR = 101
//Envia comando de leitura de dado para a memória
MBR <- 10
R1 = MBR    // valor lido da memória é passado para o registrador R1

Como os dados a serem operados estão também na memória, é antes necessário executar uma operação de Busca de Operando, ou Busca de Dado.

O primeiro operando está no endereço 101. Sendo assim, o endereço 101 é passado para o registrador de endereço (MAR). Esse endereço é passado para a memória e é enviado um comando de leitura de dado.

O conteúdo, o valor 10, é então localizado pela memória e enviado para o processador, que o armazena no registrador de dados (MBR). Como o MBR será utilizado nas próximas etapas de execução, seu conteúdo é salvo em um registrador de propósito específico, o R1.

Em seguida, a Unidade de Controle passa para a busca do segundo operando, contido no endereço 102:

//O segundo dado é trazido da memória para o registrador R1
MAR = 102
//Envia comando de leitura de dado para a memória
MBR <- 20
R2 = MBR   // valor lido da memória é passado para o registrador R2

Essa etapa ainda faz parte do Ciclo de Execução, e também diz respeito à uma Busca de Dado. A busca é mesma do passo anterior, mas agora o endereço buscado é o 102, e o conteúdo é o 20, que é repassado para o registrador R2.

O próximo passo do Ciclo de Execução é executar a operação aritmética propriamente dita.

Isso geralmente é feito entre registradores de propósito geral, por serem mais rápidos do que se fosse tratar dados da memória.

Os conteúdos de R1 e R2 são somados e armazenados em R3:

R3 = R1 + R2

Para finalizar o processo, o resultado deve ser armazenado de volta na memória:

MAR = 100   // Endereço é passado para MAR
MBR = R3    // Resultado da operação é passado para MBR
// Comando de escrita é passado para a memória
M[100] <- 30    // Endereço 100 da memória recebe o valor 30

Para isso ser realizado, é preciso executar uma operação de escrita na memória.

O endereço 100 é então passado para MAR e o resultado da operação, salvo em R3 é passado para MBR.

Quando o comando de escrita é enviado pela Unidade de Controle para a memória, ela lê o endereço 100 pelo Barramento de Endereço e o valor 30 pelo Barramento de Dados e salva, então, o valor 30 no endereço 100.

Com isso a operação é finalizada. Essa operação foi executada em aproximadamente 14 passos.

Esse valor é aproximado porque alguns deles são apenas o envio de sinal para a memória, e isso geralmente é feito em paralelo com o passo seguinte.

Se cada passo for executado dentro um ciclo do relógio (ou ciclo de clock), teremos 14 ciclos de clock para uma única instrução.

Mas perceba que o acesso à memória é sempre mais lento do que a execução do processador. Se cada acesso à memória levar 3 ciclos de clock, teremos um total de 20 ciclos de clock.

Nota

Apenas uma memória tipo Cache poderia ser acessada com apenas 3 ciclos de clock. Uma memória principal convencional precisa de entre 10 e 15 ciclos de clock para ser lida. Depende de sua tecnologia (e preço!). Parece bastante, mas algumas instruções podem levar muito mais ciclos do que isso, como operações com Ponto Flutuante (números reais), ou de acesso à um periférico, como o disco rígido. Isso depende muito de como o projeto do computador é elaborado.

Apesar do computador parecer pouco efetivo na execução de uma simples soma, como ele executa numa frequência de clock muito alta, ele acaba executando muitas operações por segundo.

Então, utilizar apenas a frequência de clock como medida de desempenho não é uma boa ideia.

O mais utilizado é medir a quantidade de operações aritméticas que o processador é capaz de executar por segundo.

Hoje em dia um computador pessoal está na escala dos alguns Milhões de Instruções por Segundo (ou MIPS).

Nos capítulos a seguir vamos estudar como essas e outras medidas de despenho podem ser calculadas.

BARRAMENTOS INTERNOS

Um barramento ou via ou bus é um conjunto de pinos/conexões do microprocessador por onde trafegam um ou mais sinais de hardware.

Um microprocessador possui três tipos de barramentos utilizados para transporte: bus de dados, bus de endereços e bus de controle.

Os barramentos internos ou vias internas interligam os diversos componentes do microprocessador, conduzindo dados e endereços.

Para facilitar a visualização, os Barramentos de Dados e de Endereço são apresentados replicados, tanto do lado esquerdo, quanto do direito da figura.

MIPbusint.png


Barramento de dados

Barramento bidirecional, utilizado para realizar o intercâmbio de dados e instruções com o exterior. Uma das principais características de um microprocessador é o número de bits que o barramento de dados pode transferir, que determina se o processador é de 8, 16, 32 ou 64 bits.

Determina o número de bits da palavra de dados que pode ser transferida de/para o microprocessador e, também (quase sempre) o tamanho da palavra de dados que pode ser operada pela ALU.

Barramento de endereços

Barramento unidirecional, constituído de um conjunto de linhas de endereço que indicam a posição de memória onde se encontra o dado requisitado. Uma vez dada a posição, a informação armazenada na memória passará à CPU através do barramento de dados.

Define a quantidade de posições de memória e/ou de portas de entrada/saída que podem ser acessadas pelo microprocessador (para n bits do barramento de endereços, 2n bytes de memória podem ser endereçados, ou seja, 2n endereços físicos podem ser acessados – capacidade de endereçamento).


Barramento de controle

Barramento bidirecional, formado por um número variável de linhas, através das quais se controlam as unidades complementares (habilitação e desabilitação das memórias para leitura e escrita, permissão para periféricos ou coprocessadores acessarem as vias de dados e endereços).

Transfere, para as diversas partes do sistema, sinais que definem e orientam toda a sua operação. Sinais de controle típicos de um microprocessador são:

  1. leia de uma posição de memória (memory read);
  2. leia de uma porta de E/S (I/O read);
  3. escreva em uma posição de memória (memory write);
  4. escreva em uma porta de E/S (I/O write);
  5. pedido de interrupção de programa (interruption request);

pedido de uso de vias (bus request ou hold request);

  1. pedido de espera (wait ou ready);
  2. sinal de relógio (clock); e
  3. sinal de partida/reinício (reset).


A comunicação da Unidade de Controle e da Unidade de Ciclo de Dados é feita sempre com a Memória Principal através dos barramentos.

Os endereços são transmitidos sempre via Barramento de Endereços para a memória, sempre de forma unidirecional da CPU para a memória.

Quando as instruções são transmitidas da memória para a Unidade de Controle, elas utilizam o Barramento de Dados. Isso porque as instruções são tratadas pela memória como um conteúdo como um outro qualquer. Ela não faz distinção entre dados e instruções. O mesmo Barramento de Dados é utilizado pela Unidade de Ciclo de Dados para receber os operando das operações a serem realizadas e para enviar os resultados de volta para a memória.

Fica claro então a importância da Memória Principal.

Todo e qualquer programa só poderá ser executado a partir dela.

Quando você, por exemplo, deseja executar um programa de um pendrive conectado pela USB do computador, ele antes precisa ser copiado para a Memória Principal.

Só então ele será executado. A memória precisa ser grande o bastante para armazenar a maior quantidade possível de programas, e também precisa ser rápida o suficiente para buscar os dados e enviá-los o mais rapidamente possível à CPU, e também salvá-los no menor tempo possível. A velocidade das memórias é determinada essencialmente pela tecnologia de transistores utilizada. Essa tecnologia é relacionada ao preço. Quanto mais rápidas, mais caras elas são.


Histórico figuras



<< Página da disciplina Aula 3 - O Processador Aritmética computacional>>