Baixe o app para aproveitar ainda mais
Prévia do material em texto
Prof. Rômulo Nunes MICROS ● Processadores de 32 bits – Maior necessidade por velocidade, memória e barramento de dados mais amplos conduziram a uma revisão na estrutura dos processadores. – Uso de sistemas baseados em GUI (graphical user Interface), uso de dados em single precision floating point etc... – Lançamento em 1986 do 80386 pela Intel revisa de forma profunda a estrutura de processadores de 16 bits implementando o primeiro processador, prático, com 32 bits para barramentos de dados e de memória. – OBS: Intel iapx-432 fracassou como solução – 80386 capaz de endereçar até 4Gb de memória – Versões modificadas ● 80386SX → 16Mb de memoria e barramentos de 16 e 24 bits para dados e endereços ● 80386SL/80386SLC → 32Mb; barramentos de 16 e 25; Onde a versão SLC impelmentava sistema de memoria cache interna Prof. Rômulo Nunes MICROS ● Processadores de 32 bits – Versões modificadas ● 80386EX → chamado de PC embarcado, continha todos os componentes de um computador pessoal AT em um único chip; ● 24 bits para dados e 26 bits para endereços e seleção para programação lógica do chip Prof. Rômulo Nunes MICROS ● 80386 – Além de uma maior velocidade de clock o 80386 incluiu em seu projeto em hardware uma unidade de gerenciamento de memória que permitia o gerenciamento dos recursos pelo sistema operacional ao invés de deixar o gerenciamento de memória inteiramente via software – O conjunto de instruções era compatível com os antecessores 8086, 8088 e 80286 permitindo assim softwares de 16bits operarem no processador Prof. Rômulo Nunes MICROS ● 80486 – Lançado em 1989 pela intel que apesar de não introduzir mudanças radicais na arquitetura de processadores incluiu substanciais alterações que proporcionaram que mais da metade do conjunto de instruções pudesse ser executada em apena um ciclo de clock. Desta forma através da disponibilidade de seu clock com 50Mhz o mesmo executava a maioria de suas instruções em 25ns, ou seja, 50MIPs melhorando assim o desempenho de cerca de 50% em relação ao 80386 de mesmo clock. – Sua estrutura incorporava algo como um processador 80386 associado a um coprocessador numérico com uma memória cache de 8k, tudo isso integrado ao chip. – Versões subsequentes como o 80486DX2 possuía um coclk dobrado que permitia a execução de instruções a 66Mhz com uma taxa de transferência em memória de 33MHz – Versões como o 80486DX4 elevaram a execução interna até 100MHz Prof. Rômulo Nunes MICROS ● Pentium – Em 93 originalmente batizado de 80586 ou P5 a Intel lançou o Pentium cujo nome surgiu devido a impossibilidade de copyright para um numero. – Com uma espessura entre 250 a 800nm, fazia uso dos soquetes P5, o P54C, o P54CS, o P55C e o Tillamook. Continha ainda cerca de 3,2 milhões de transístores e suas duas versões iniciais funcionavam com clock de 60 ou 66 MHz com velocidade de 150MIPs Prof. Rômulo Nunes MICROS ● Pentium – Outro incremento introduzido pelo Pentium foi tamanho da memória cache de 16Kb em contrapartida aos 8Kb encontrados na versão basica do 80496. O Pentium continha 8Kb para cache de instruções e 8kb para cache de dados. – Com memória de até 4Gb possuía um barramento de dados que aumentou dos 32 bits do 80386 e 80486 para os 64 bits podendo acessar dados em ponto flutuante com precisão dupla usadas em gráficos vetoriais de alta velocidade e permitindo a transferência de dados entre processador e memória e possibilitando video full-frame que operam displays a uma taxa de 30Hz ou superior – comparável ao sistema de TV comercial da época Prof. Rômulo Nunes MICROS ● Pentium – Para o barramento de 64 bits, apesar desta modificação duplicar a quantidade de informação em cada operação de leitura da memória isto não quer dizer que o Pentium pode executar aplicações de 64 bits uma vez que seus registradores ainda são de 32 bits. – O Pentium introduziu ainda dois canais de execução de dados ("pipelines") que lhe permitem completar mais do que uma instrução por ciclo de clock. Um canal (denominado "U") lida com qualquer tipo de instrução, enquanto o outro (denominado "V") lida apenas com as instruções mais simples e comuns. O uso de mais do que um canal de dados era uma característica quase exclusiva dos processadores RISC. A sua adopção no Pentium foi uma novidade significativa na linha da plataforma x86 que até então era totalmente CISC. Depois seguiram-se outras melhorias inspiradas em tecnologias já conhecidas das máquinas RISC, mostrando ser possível combinar as duas filosofias. Prof. Rômulo Nunes MICROS ● Pentium – Modelo MMX → Uma extensão com um conjunto básico de instruções SIMD desenhadas para uso em aplicações multimídia. ● Com o MMX foram adicionadas 57 poderosas instruções especificamente projetadas para manipular e processar dados de vídeo, de áudio e gráficos eficientemente. Essas instruções são orientadas às sequências altamente repetitivas e paralelas geralmente existentes nas operações de multimídia ● Estas instruções são capazes de manipular dados agrupados em pacotes de 64 bits enquanto que a instruções existentes até então manipulavam dados de 8 ou 16 bits ● Por fim as instruções usam um processo chamado Instrução Única de Múltiplos Dados (SIMD) permite que uma instrução execute a mesma função em múltiplas partes dos dados, ou seja, ela permite que uma operação em vez de ser executada em um único bloco possa ser executada ao mesmo tempo em vários blocos de 8 e 16 bits (8 bits para imagem e 16 bits para som). Assim será reduzido o número de voltas intensivas de computação comuns com vídeo, áudio, gráficos e animação, tornando o processamento muito mais rápido. ● Foi dobrado o tamanho do cache L1 no chip para 32K no processador, assim mais instruções e dados podem ser armazenados no chip, reduzindo o número de vezes que o processador tem para acessar áreas de memória mais lentas para obter informação. ● Clock's 166, 200,233 Mhz. Prof. Rômulo Nunes MICROS ● Pentium – Modelo PRO → Otimizado para aplicações 32 bits ● Cache L1 de 8K/8K separado entre dados e instruções; possui separação entre o barramento se sistema externo e o barramento de cache de alta velocidade interno ● Cache L2 interno: possui cache de nível 2 interno, podendo trabalhar na mesma velocidade do processador ● Capacidade de realizar três instruções em um único ciclo de clock (Pentium permitia 2 instruções), agilizando o trabalho em sistemas que utilizam processamento paralelo. ● Arquitetura Dual Independent Bus: O barramento interno é dividido em dois barramentos um para o cache L2 e o outro do sistema do processador para a memória principal. Esta arquitetura de barramento resolve o problema de limitação da largura de banda do barramento, oferecendo largura de banda de desempenho até três vezes superior à dos processadores de barramento único como o existente no processador Pentium. ● Execução dinâmica: é uma técnica que usa a combinação de 3 processos para aumentar a velocidade de execução do software: 1 → O processador monitora passos a frente no software (20 a 30 instruções a frente do contador de programa) antecipando-os. 2 → O processador analisa quais instruções são dependentes de cada resultado, criando uma lista otimizada dessas instruções; 3 → Baseada nesta lista, instruções são carregadas especulativamente. Prof. Rômulo Nunes MICROS ● Pentium – Séries subsequentes → A Intel manteve a marca Pentium ao dar nome a outras gerações de arquiteturas de processadores, que eram internamente bem diferentes do próprio Pentium ● Pentium II ● Pentium III ● Pentium 4 ● Pentium M ● Pentium D – A partir deste ponto tem-se que a marca está apenas superficialmente relacionada com a arquitetura interna do processador.A marca Pentium é agora usada em desktops e notebooks, a marca Celeron é usada em sistemas de relativo baixo custo (tipicamente um Pentium de velocidade e preço reduzidos, similarmente ao que ocorria com os 486 "DX" e "SX"), e marca Xeon é usada em computadores de alta performance, geralmente servidores ou outros usos "pesados". A mesma arquitetura pode ser usada em todos eles, diferindo apenas em clock, cache, encapsulamentos e soquetes. A marca "Itanium" é usada em processadores para servidores 64 bits da arquitetura IA-64, não compatível com a x86 (e a mais recente x86 64 bits). Prof. Rômulo Nunes MICROS ● AMD – A Advance Micro Device (AMD) produzia processadores 286 sob licença da Intel, e posteriormente reivindicou a extensão da licença para os 386 e 486. Bem sucedida, nos mercados do 286, 386DX e 386SX, eles ofereciam dispositivos compatíveis em termos funcionais e pinagem a taxas mais altas de clock's, com menor dissipação de energia SMM aprimoradas. – A AMD não encontrou o mesmo sucesso nos mercados do 486, seus dispositivos 486 eram atrasados para o mercado, e não ofereciam vantagem funcional ou de desempenho concreta sobre os dispositivos da Intel. A estratégia da AMD para os produtos 486 era competir em preço oferecendo versões de velocidade de clock não aceitas pela Intel. – Antecipando-se a uma regulamentação adversa relativa ao seu status de licenciada ,a AMD tinha dois design's de 486, um baseado na tecnologia Intel e outro no seu próprio design (Nx586). Prof. Rômulo Nunes MICROS ● AMD – 586 ● Em termos de funcionamento é igual ao 486DX4 mudando apenas com duplicação do clock, acréscimo de algumas instruções RISC ,execução superescalar, pinagem Socket3, simplesmente um 486DX4 melhorado → 486 Dx5. ● Foi através dele que Intel "rompeu" com a AMD. – K5 ● Primeiro processador CISC verdadeiramente não Intel a AMD afirmou que ele iria superar o desempenho do Pentium a velocidades semelhantes de clock, essa vantagem se deva a um design superescalar superior. ● Os pipelines duplos do K5 possuem menos restrições para a execução de instruções simultâneas, e não só aceitam previsão de desvio como também realizam uma execução especulativa. ● Possui um cache de pré-decodificação de 16Kb e outro de dados 8Kb, instruções RISC, usava Socket5 para conexão com a placa mãe Prof. Rômulo Nunes MICROS ● AMD – K6 ● Cache L1 de 64 KB, dividido em dois de 32 KB, um para dados e outro para instruções ● Núcleo RISC com decodificador CISC, similarmente ao K5 (5K86), ao 6x86 (M1), M2 e Pentium Pro. ● Decodificador funciona bem tanto para código de 16 bits quanto para código de 32 bits (diferentemente do Pentium Pro onde o decodificador não funciona bem para código de 16 bits). ● O decodificador CISC/RISC consegue decodificar até 2 instruções por pulso de clock, dependendo da complexidade da mesma. Ou seja, consegue decodificar até 2 instruções simples por pulso de clock. Vale lembrar que programas utilizam instruções simples 80% das vezes. ● Conjunto de Instruções MMX (segundo a AMD, compatível com o MMX da Intel). ● O Co-processador integrado do K6 não é tão bom quanto o do Pentium Pro ou quanto do Pentium II. Demais características internas similares ao Pentium Pro: execução fora de ordem, execução especulativa, previsão de desvio, etc. ● A previsão de desvio do K6 é bem melhor que a do Pentium Pro. Prof. Rômulo Nunes MICROS ● AMD – Séries Subsequentes ● K6-II ● K6-III ● Duron ● Atlhon – Em uma tentativa de ganhar uma posição de liderança a AMD lançou o K5, mas acabou se dando mau, o processador tinha problema de aquecimento e não atendeu aos resultados esperados – O K6 e tinha o mesmo problema do K5, com esse processadores a AMD ficou com má reputação, no entanto a AMD evoluiu seu projeto com o K6II assim se tornando um potencial problema para a Intel. – AMD se firmou de vez com o lançamento do Athon onde pela primeira vez a imponente Intel foi superada em termos de desempenho. Prof. Rômulo Nunes MICROS ● A lei de MOORE – Em 1965, Gordon Moore, um dos fundadores da Intel, afirmou que o número de transistores em um chip dobraria, sem custo adicional, a cada 18 meses. Tal afirmação ficou conhecida como a Lei de Moore, a qual foi válida durante anos, principalmente no final da década de 90. – Sempre que uma empresa lançava um modelo de processador, o concorrente a superava meses depois. Isso ficou muito evidente nos anos de 1999 e 2000, quando o Pentium III e o AMD Atlhon (K7) estavam guerreando pelo maior clock. Por um período de tempo, a AMD liderou a disputa, pois o Atlhon, que trabalhava com frequências maiores do que 1 GHz, superou o Pentium III. – A reviravolta da Intel veio com o lançamento do Pentium 4, em 2001, que trabalhava com até 2 GHz e levou a empresa de volta ao topo do mercado. As versões de baixo custo dessas CPUs, Celeron (Intel) e Duron (AMD), também disputavam fortemente o lugar mais alto no ranking do processador “B” mais vendido. Prof. Rômulo Nunes MICROS ● Arquitetura Multicore: fim da lei de Moore – Conforme a tecnologia dos processadores foi progredindo, o tamanho de seus transistores foi diminuindo de forma significativa. Contudo, após o lançamento do Pentium 4, eles já estavam tão pequenos (0,13 micrômetros) e numerosos (120 milhões) que se tornou muito difícil aumentar o clock por limitações físicas, principalmente pelo superaquecimento gerado. – A principal solução para esse problema veio com o uso de mais de um núcleo ao mesmo tempo, através da tecnologia multicore. Assim, cada núcleo não precisa trabalhar numa frequência tão alta. Se o esquema de escalonamento de tarefas funcionasse de maneira eficiente, seria possível trabalhar com quase o dobro do clock. Um processador dual-core de 1,5 GHz, por exemplo, poderia ter um desempenho semelhante a uma CPU de núcleo único de 3 GHz. – Uma cestrutura denominada escalonador determina em qual dos núcleos uma tarefa deve ser executada. Mas como o escalonador demora certo tempo para fazer essa decisão, na prática fica quase impossível atingir o dobro exato de desempenho. Portanto, com o advento do processador multicore, a lei de Moore tornou-se inválida, visto que já não era mais possível aumentar a frequência do processador como antes. Prof. Rômulo Nunes MICROS ● Processamento paralelo – Sabemos então que devemos usar uma grande quantidade de processadores, mas como controlá- los de forma a que façam alguma coisa de útil? Existem grandes problemas! Para iniciar, vamos trabalhar o conceito de processamento paralelo através de um exemplo bem simples. Se um pedreiro constrói uma casa em um ano, então dois pedreiros constroem a mesma casa em meio ano. – Este é conceito básico do processamento paralelo: a divisão das tarefas. Podemos seguir adiante e concluir que cem pedreiros gastam apenas 3,6 dias. Será isto um absurdo? É claro que há um limite, pois o trabalho dos pedreiros só será eficiente se estiverem perfeitamente sincronizados e equilibrados. Este ponto é importante: todos os pedreiros devem ter a mesma carga de trabalho. Em termos técnicos, usa-se a expressão “Balanceamento da Carga de Trabalho”. – Esse balanceamento pode ser feito de dois modos. No primeiro modo, o trabalho de cada pedreiro é idêntico, ou seja, cada um faz 1/100 da casa. No outro modo é usado a especialização, ou seja, alguns pedreiros “viram” cimento enquanto outros assentam tijolos e outros tratam do encanamento, e assim por diante. – Ao imaginarmos todas as tarefas que devam ser executadas para a construção da casa, fica claro que algumas delas não poderão ser paralelizadas. Imagine 100 pedreiros para colocar um porta, ou 100 pedreiros em cima da casa tentando montar o telhado. Além disso, deve haver um limite para a quantidade de pedreirosque podem trabalhar em paralelo. A partir deste limite, quanto mais pedreiros colocamos, pioramos o desempenho e em consequência, aumentamos o tempo de construção. Prof. Rômulo Nunes MICROS ● Processamento paralelo – Tarefa → Classificação dos processadores paralelos Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – O diagrama de blocos da figura refere-se ao computador pessoal e pode ser utilizado para descrever tanto os antigos sistemas de computadores baseados em mainframe como soluções baseadas em processadores intel modernos. Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● Bloco com capacidade de realizar tarefas (controlar sinais de controle e temporização do sistema, bem como barramentos de dados e endereço) orientadas por instruções. É o principal elemento de decisão do computador. ● Quando a C.P.U. está encapsulada em um único chip, temos um MICROPROCESSADOR. As aplicações típicas de microprocessadores são voltadas a multimídia, onde temos processamento de som, imagem e comunicação simultaneamente. ● Consiste de várias subunidades cujas as mais importantes são: – Decodificador de instruções: é a parte física que reconhece as instruções de programa e determina o funcionamento dos outros subsistemas com base nisso. Coordena as atividades da CPU de forma a executar a instrução da máquina atraés de diversas microoperações – ALU: Unidade lógica e aritmética responsável por todas as operações lógicas e matemáticas. Consiste em uma série de máquinas digitais como seletores, registradores de deslocamento, somadores, complementos, etc... – Registros: São uma forma de memória interna a CPU, usados para especificação de endereços da próxima instrução (PC), manter o resultado de uma instrução ou fornecer seus operandos (Acumulador ou WORK), a validade de determinadas operações (Status, FLAGs) Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● A arquitetura da CPU determina se as instruções da maquina e os dados podem ser armazenados no mesmo espeço de memória e se eles são acessados através do mesmo mecanismo (Arquitetura Von Neumann vs. Harvard). ● A arquitetura também determina se a CPU pode manipular ou operar dados direto da memória ou se os mesmo devem ser carregado em uma posição interna ao CPU antes da manipulação dos dados ( working register ou accumulator ), (memory-based vs. Load-and- store) ● Estruturas baseadas em acumulador utilizam um único registro em conjunto com dados advindos da memória ou outros registros e retornam o resultado para o acumulador ● Arquiteturas em pilha executa operações nos itens da pilha e depositam seus resultados na mesma. Desta forma o tamanho da pilha limita o numero de instruções e argumentos. ● Arquitetura baseadas em registros fornecem um numero limitado de registros especiais ao programado onde cada registro pode ser mapeado como um argumento ou destino para determinada instrução Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● Um programa executado na CPU é uma sequencia de instruções de máquina executadas em sequencia. Um ciclo de uma destas instruções pode ser dividido em determinadas ações que devem ser realizadas a cada instrução. ● São elas: fetch, decode (indirect), execute, write ● O decodificador de instruções é o responsável por coletar a instrução de memória, decodificá-la obter qualquer operador adicional necessário, operá-la e escrever seu resultado final em uma memória alocada para tal. ● Cada parte deste processo é executado através de micro operações diretas no hardware ● EX: Fetch – Um endereço deve ser movido do contador de programa para o barramento de endereços e um sinal de leitura requisitado – O contador de programa deve incrementar – Quando a solicitação de leitura é aceita a instrução deve ser copiada do barramento de dados para o registrador de instrução Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● Enquanto que o processo de aquisição da instrução e escrita do resultado sempre utilizam as mesma micro operações, a decodificação e a execução utilizam operações que dependem das instruções em específico ● Desta forma a logica para a instrução dependerá da “largura” em bits do operando bem como da complexidade da instrução (numero e tipos de operando) ● O seu tempo de execução depende da sequencia de sinais de controle necessários e o tempo para a resposta destes vários sinais ● EX Adição – O decodificador deve passar os operandos para a unidade de lógica e aritmética, disparar a condição para operação de adição e armazenar o resultado (3 micro operações). ● EX salto(branch) – O decodificador deve passar o novo endereço ao contador de programa (apenas uma micro operação) ● O numero de micro operações utilizadas para capturar a instrução, decodificá-la e executá- la determina a duração do que se conhece como ciclo de instrução. ● Onde existe grande disparidade em certas instruções estas são especificadas como utilizando mais de um ciclo de instrução. Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● A sequencia de micro operações necessárias para implementar uma instrução em particular depende da organização/layout da CPU. Como cada operação se traduz em efeito de modificação em um sinal de controle particular na CPU o numero de micro operações pode ser reduzida adicionando-se hardware de uso específico de instruções (inclusão de um multiplicador na ULA) ou através da duplicação de estruturas de uso intenso (multiplas unidades de Soma em uma ULA) ● As micro operações de uma determinada instrução podem ser – “hard-wired” → os sinais de controle são fixos e organizados de forma estrutural no dispositivo – Ou podem ser implementado em micro-code → operações para uma instrução em particular são pesquisadas em uma memória interna do decodificador (alocadas em um outo nível de programação) Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● Operações em Microcode são mais associadas a arquiteturas com conjunto complexo de instruções (CISC) onde o grande número de instruções longas com múltiplos operandos tornam o hard-wire impraticavel. ● A arquitetura CISC se sobressai quando o tempo para a busca da instrução excede plenamente o tempo para o CPU processá-la. Desta forma tem-se uma vantagem presumida reduzir o numero de fetches proporcionando instruções mais complexas e longas. ● Em contraste uma vez que tem-se velocidade no acesso a memória a filosofia de intruções reduzidas (RISC) tem a vantagem de fornecer poucas instruções pequenas, simples e rápidas ao invés de uma grande variedade de instruções a um custo de elocidade e eficiência. ● Pelo numero restrito de instruções não há a necessidade de uma decodificação complexa e desta forma o microcode raramente é utilizado. Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● PIPELINING – Trata-se de uma técnica para aumento de performance através da sobreposição de operações que podem ser realizadas de forma concorrente. – Pode ser aplicado as quatropartes do ciclo de instrução: Fetch, decode, execute e write – Processadores sem pipeline executam uma única instrução inteira antes de iniciar um novo processo de nova instrução, no entanto se cada estágio puder ser simplificado e se seu hardware puder operar de forma independente então um pipeline pode ser implementado a saída de um estágio é a entrada do próximo. – Mesmo que cada instrução leve o mesmo tempo para ser executada, instruções consecutivas serão executadas mais rapidamente. – O Pipeline funciona melhor se todas as instruções tiverem o mesmo tempo de execução. Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – Unidade Central de Processamento – CPU ● A arquitetura RISC possui maior propensão a implementação do pipeline devido a suas instruções simples e com foco na velocidade (executadas em apenas 1 ciclo) ● O pipline assim como qualquer outro método de busca futura não terá sucesso se ocorrerem frequentes saltos no programa ou se instruções consecutivas utilizarem interdependência. ● Do ponto de vista conceitual deve-se evidenciar que o conjunto de instruções como determinado pela arquitetura do CPU não é necessariamente dependente da implementação física da CPU. Insto pode ser referenciado como diferença entre arquitetura e organização de um CPU. – Arquitetura refere-se a atributos do sistema visíveis ao programador, ou de outra forma, aqueles atributos com impacto direto na lógica de execução do programa. A organização refere-se as unidades operacionais e suas interconexões de forma a realizarem as especificações da arquitetura. ● Assim para programar um microprocessador em nível de instruções de máquina é necessário o entendimento de sua arquitetura em particular mas não se sua organização. Prof. Rômulo Nunes MICROS ● Estrutura básica do computado pessoal baseado em microprocessador – EXERCÍCIOS: – Diferencie ciclo de instrução e clico de máquina – Arquiteturas RISC e CISC – Acumuladores e registradores – Instrução de máquina e micro operação – Decodificador de instruções e ULA – Arquitetura e organização de um microprocessador Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29
Compartilhar