Posted by : ADM
O CPU
(Microprocessador)
O CPU é, como o seu próprio nome indica - Central Processing Unit - um processador de instruções.
No seu interior, bits e bytes são processados sem parar, num contínuo ciclo indiferente à linguagem de programação que lhes deu origem: no que ao CPU diz respeito há apenas uma única linguagem... o código máquina. Estranhos códigos binários de zeros e uns que afastarão a maioria dos programadores, mas que são a verdadeira "língua" que o CPU entende. Toda e qualquer linguagem de programação tem que ser, de uma forma ou de outra, compilada ou interpretada, até que se torne em algo que o CPU entenda.
Para todos aqueles que mesmo assim gostam de trabalhar com o CPU a este nível, existe em versão mais humanizada... o Assembly/Assembler/ASM. Representação simbólica desse código máquina e que permite mais facilmente visualizar, manipular e programar!
Por exemplo, em vez de terem que lidar com isto:
11001010 00000001 00000000 00000000
O Assembly permite que isso se traduza em algo mais amigável, como isto:
ld %r4,%r5
O CPU tem no seu interior vários registos onde guarda várias informações. Uma delas, talvez a mais importante, é aquela que lhe diz qual a posição da próxima instrução a executar. É esse registo que serve de fio condutor a tudo o que será executado pelo CPU.
O Funcionamento
A eletricidade começa a fluir; o CPU "acorda", e começa a procurar o que fazer, e dirige-se à instrução número zero. Executa-a, passa para a instrução seguinte, e assim sucessivamente até que alguém o desligue... ou algo de muito grave aconteça (Como superaquecimento).
Dependendo do tipo de CPU, este poderá ter um conjunto de instruções que vão de apenas algumas dúzias de instruções, às centenas.
Olhando para um qualquer pedaço de assembly, de qualquer processador, torna-se evidente que grande parte das instruções existentes na maioria dos programas, são movimentações de pedaços de informação de um lado para o outro e operações aritméticas.
- Moves, adds, ands, ors, etc. etc. etc. Tudo instruções que recorrentemente encontrarão em toda e qualquer listagem de assembly de todo e qualquer CPU.
CISC e RISC
Os cpus se dividem-se principalmente em duas grandes famílias: os CISC(Complex Instruction Set Computing) e os RISC (Reduced Instruction Set Computing).
Com a evolução da microelectrónica, os CPUs foram ficando cada vez mais complexos e evoluídos. O tal número de instruções que um CPU podia executar não parava de crescer e aumentar.
Começam a surgir instruções que permitiam, num só comando, ir buscar um valor ao endereço de memória "X", ir buscar outro ao endereço "Y", somar ambos os valores e colocar o resultado no endereço "Z"!
Rapidamente, estes CPUs se tornaram em sistemas altamente complexos.
Chegou-se ao ponto - como nos casos dos nossos bem conhecidos processadores x86 (cuja evolução nos trouxe do "PC Compatível" com o seu Intel 8086 até aos mais recentes Intel Core i7 actuais) - em que os CPUs eram já tão complexos, que cada instrução era internamente subdividida em várias micro-instruções mais pequenas que eram executadas pelo CPU!
Isto fez com que alguns investigadores decidissem regressar às origens e simplificar tudo novamente, com os processadores RISC. A ideia era simples: simplificar e reduzir. Em vez de instruções complexas, o CPU seria apenas capaz de fazer as operações mais básicas e essenciais.
Em vez de termos uma única instrução, de ir buscar dois valores a dois sítios diferentes e colocar a soma num terceiro sítio; num CPU RISC temos que fazer todos esses passos expressamente:
- ir buscar o valor 1 e guardar num registo temporário A;
- ir buscar o valor 2 e colocá-lo noutro registo B;
- somar o registo A com o registo B (ficando aqui o resultado);
- guardar o registo B na posição de destino 3.
A vantagem é que o CPU tem um processo de fabrico muito mais simples; e em grande parte dos casos, pode até correr mais depressa. Em vez de instruções complexas que têm que ser convertidas em microcódigo e podem demorar dezenas ou centenas de ciclos de relógio, num processador RISC quase sempre cada instrução pode ser executada num único ciclo.
Para além disso, todo esse trabalho extra acaba por ser feito pelos compiladores, já que a programação será feita numa linguagem de mais alto nível, como C.
Até aqui relegados para papeis menos mediáticos, os CPUs RISC começam agora a mostrar todo o seu valor nos Android, iPhones e demais tablets e dispositivos mobile, onde oferecem uma eficiência que não tem sido possível igualar com os mais complexos e mais gastadores CPU Cisc.
Pipeline
Até o 386, os processadores da família x86 eram capazes de processar apenas uma instrução de cada vez. Uma instrução simples podia ser executada em apenas um ciclo de clock, enquanto instruções mais complexas demoravam vários ciclos de clock para serem concluídas. Seria mais ou menos como montar um carro de maneira artesanal, peça por peça.
Para melhorar o desempenho do 486, a Intel resolveu usar o pipeline, uma técnica inicialmente usada em processadores RISC, que consiste em dividir o processador em vários estágios distintos. O 486, possui um pipeline de 5 níveis, ou seja, é dividido em 5 estágios.
Quando é carregada uma nova instrução, ela primeiramente passa pelo primeiro estágio, que trabalha nela durante apenas um ciclo de clock, passando-a adiante para o segundo estágio. A instrução continua então sendo processada sucessivamente pelo segundo, terceiro, quarto e quinto estágios do processador. A vantagem desta técnica, é que o primeiro estágio não precisa ficar esperando a instrução passar por todos os demais para carregar a próxima, e sim carregar uma nova instrução assim que se livra da primeira, ou seja, depois do primeiro pulso de clock.
As instruções trafegam dentro do processador na ordem em que são processadas. Mesmo que a instrução já tenha sido processada ao passar pelo primeiro ou segundo estágio, terá que continuar seu caminho e passar por todos os demais. Se por acaso a instrução não tenha sido completada mesmo após passar pelos 5, voltará para o primeiro e será novamente processada, até que tenha sido concluída.
Desta maneira, conseguimos que o processador seja capaz de processar simultaneamente, em um único ciclo de clock, várias instruções que normalmente demorariam vários ciclos para serem processadas. Voltando ao exemplo do carro, seria como se trocássemos a produção artesanal por uma linha de produção, onde cada departamento cuida de uma parte da montagem, permitindo montar vários carros simultaneamente. O uso dos 5 estágios de pipeline no 486 não chegava a multiplicar por cinco a performance do processador, na verdade a performance não chegava nem mesmo a dobrar, mas o ganho é bem significativo.
Os processadores atuais utilizam um número muito maior de estágios de pipeline. O Pentium II possui 10, o Athlon Thunderbird possui 12 e o Pentium 4 possui 20. No Pentium 4 por exemplo, cada estágio processa uma pequena parte da instrução, que só são concluídas pelo último estágio, a cada ciclo, cada um dos estágios passa a instrução para a frente e recebe uma nova. Cada instrução demora 20 ciclos para ser processada, mas em compensação são processadas 20 instruções ao mesmo tempo, em fila. Mais estágios permitem que o processador seja capaz de atingir frequências mais altas, já que cada estágio fará menos trabalho por ciclo, suportando mais ciclos por segundo, mas, por outro lado, o uso de muitos estágios pode prejudicar o desempenho do processador nas operações de tomada de decisão, já que cada instrução demorará mais ciclos para ser concluída.