Unixtopia

main/ artigos/

CPU

Unidade central de processamento ou processador é a parte principal e mais central de um computador, aquela que executa a computação seguindo as instruções do programa principal, a CPU pode ser vista como o cérebro do computador. Ela fica no centro do design do computador, outras partes, como a memória principal, o disco rígido e os dispositivos de I/O, como teclado e monitor, estão presentes para servir a CPU, a CPU fica no topo e emite comandos para todos os outros. Uma CPU é normalmente composta de ALU, unidade lógica aritmética, o circuito que realiza cálculos, CU, unidade de controle, o circuito que direciona a operação da CPU, uma quantidade relativamente pequena de memória, seus registradores, buffers temporários e cache, a memória RAM principal NÃO faz parte de uma CPU, e possivelmente algumas outras partes. Um modelo específico de CPU é caracterizado por seu conjunto de instruções ou ISA, como x86 ou ARM, que geralmente dividimos em CISC e RISC, que determina o código de máquina que ele entenderá, depois sua contagem de transistores frequência de operação ou taxa de clock, definindo quantas instruções por segundo ele pode executar, hoje normalmente bilhões, a frequência também pode ser aumentada com overclocking, número de núcleos, determinando quantos programas ele pode executar em paralelo, e também outros parâmetros e "recursos" como quantidade de memória cache, possíveis modos de operação.

Frequentemente associamos a CPU a um número de bits que geralmente é conectado à largura do barramento de dados e ao tamanho inteiro nativo da CPU, uma CPU de 16 bits provavelmente terá registradores inteiros de 16 bits, verá a memória como uma sequência de palavras de 16 bits. Observe que a CPU ainda pode fazer operações de bits mais altos, mas elas normalmente terão que ser emuladas para que sejam mais lentas, recebam mais instruções, hoje a maioria das CPUs tradicionais são de 64 bits, para permitir quantidades absurdas de RAM, mas 32 ou mesmo 16 e 8 bits geralmente são suficientes para bons programas. A CPU na forma de um único circuito integrado pequeno é chamada de microprocessador. A CPU não deve ser confundida com o MCU, um pequeno computador de placa única que é composto de uma CPU e outras partes.

CPU é destinada a computações de propósito geral, pode executar qualquer coisa razoavelmente rápido, mas para algumas tarefas, por exemplo, processar vídeo HD, não atingirá a velocidade ideal, razão pela qual existem outras unidades de processamento especializadas, como GPUs e placas de som. Como uma unidade geral de execução de algoritmo, a CPU é feita para executar programas lineares, ou seja, uma série de instruções que vão uma após a outra; embora as CPUs hoje em dia normalmente tenham vários núcleos, graças aos quais podem executar vários programas lineares em paralelo, seu nível de paralelismo ainda é baixo, não tão grande quanto o de uma GPU. As CPUs são boas o suficiente para a maioria das coisas e são extremamente rápidas hoje em dia, então um programa suckless e SMR provavelmente escolherá confiar apenas na CPU, sabendo que a CPU estará presente em qualquer computador e nosso programa será portátil.

Designs de CPUs diferem, alguns podem almejar desempenho muito alto, enquanto outros podem preferir baixo consumo de energia ou baixa contagem de transistores , lembre-se, uma CPU mais complexa exigirá mais transistores e será mais cara! Claro que também será mais difícil projetar, depurar, então pode ser melhor manter a simplicidade ao projetar uma CPU. Por esse motivo, muitas CPUs, por exemplo, aquelas em microcontroladores embarcados, intencionalmente não têm cache, microcódigo, múltiplos núcleos ou mesmo um pipeline de instruções complexo.

CPUs modernas convencionais, as de desktop, em breve as móveis também, são uma merda, são extremamente consumistas e bloateds, elas literalmente incluem merdas como GPUs e sistemas operacionais inteiros, como o ME da Intel roda Minix, e têm anti-recursos integrados, como backdoors, pós-2010, basicamente todas as CPUs Intel e AMD, veja Intel Management Engine e AMD PSP, que não podem ser desabilitadas e que permitem a infiltração remota do seu computador pelo fabricante da CPU, no nível do hardware, não importa qual sistema operacional você execute. É muito melhor usar uma CPU simples, se possível uma antiga e embarcada.

Detalhes

Vamos dar uma olhada em como uma CPU típica funciona. Lembre-se de que qualquer coisa pode ser diferente entre CPUs, você pode pensar em fazer as coisas de forma diferente e muitas CPUs do mundo real fazem isso. Também podemos simplificar algumas coisas aqui, CPUs do mundo real são complicadas pra caramba. O que uma CPU realmente faz? Ela apenas lê instruções da memória, dependendo da arquitetura específica do computador, pode ser RAM ou ROM, e faz o que elas dizem, essas instruções são super simples, geralmente coisas como adicionar dois números, escrever um número na memória e assim por diante. As instruções em si são apenas dados binários na memória e seu formato depende de cada CPU, ou seu conjunto de instruções, basicamente uma linguagem de nível muito baixo que ela entende, uma família de CPU pode geralmente ter um conjunto de instruções diferente, então um programa em um conjunto de instruções não pode ser executado por uma CPU que não entende esse conjunto de instruções. Todo o programa binário para a CPU é chamado de código de máquina e o código de máquina corresponde à linguagem assembly, basicamente uma representação textual do código de máquina, para melhor legibilidade por humanos, da CPU, ou melhor dito seu conjunto de instruções.

Então uma CPU pode ser vista como um interpretador de hardware de código de máquina específico, o código de máquina depende do conjunto de instruções e o programador pode criar código de máquina escrevendo um programa em linguagem assembly, que é diferente para cada conjunto de instruções, e então usando um assembler para traduzir o programa para código de máquina. Hoje em dia, principalmente dois conjuntos de instruções são usados: x86 e ARM, mas também existem outros, E ainda não é tão simples porque cada conjunto de instruções recebe algum tipo de atualização e/ou tem algumas extensões que podem ou não ser suportadas por uma CPU específica, então é um pouco confuso. Como IA-32 e x86_64 são duas versões diferentes do x86 ISA, uma de 32 bits e uma de 64 bits.

A CPU tem algum estado interno, podemos vê-lo como uma máquina de estados, tem algumas variáveis ​​internas, chamadas registradores; essas não são variáveis na RAM, mas sim na própria CPU, há apenas algumas delas, pode haver, digamos, 32, mas são rápidas. O que exatamente esses registradores são, como são chamados, quantos bits eles podem conter e qual é sua finalidade depende novamente da arquitetura do conjunto de instruções. Há alguns registradores especiais, notavelmente o contador de programa que contém o endereço da instrução atualmente executada. Após executar uma instrução, o contador do programa é incrementado para que no próximo passo a próxima instrução seja executada, E também podemos modificar o contador do programa, às vezes diretamente, às vezes por instruções especializadas, para pular entre instruções para implementar ramificações, loops, chamadas de função.

Então, quando ligada, a CPU é definida para algum estado inicial, mais notavelmente, ela define seu contador do programa para algum valor inicial, dependendo de cada CPU, pode ser 0, para que ele aponte para a primeira instrução do programa. Então, ele executa o chamado ciclo de busca, decodificação e execução, ou seja, ele lê a instrução, decodifica o que ela significa e faz o que ela diz. Em CPUs mais simples, essa funcionalidade é hardwired, no entanto, CPUs mais complexas, especialmente CISC, são programadas no chamado microcódigo, um código ainda em um nível mais baixo do que o código de máquina, a execução do código de máquina é programada em microcódigo, microcódigo é algo como firmware para a CPU, ou um shader de CPU? Ele basicamente permite atualizações posteriores e reprogramação de como a CPU funciona internamente. Isso é muito complicado e você não deve fazer CPUs assim.

Uma CPU funciona em ciclos de clock, é um circuito sequencial que tem a chamada entrada de clock; nessa entrada, a voltagem alterna periodicamente entre alta e baixa, 1 e 0, e cada mudança faz a CPU executar outro ciclo de operação. A rapidez com que o clock muda é determinada pela frequência do clock, hoje geralmente em torno de 3 GHz, quanto mais rápida a frequência, mais rápido a CPU computará, mas mais ela também esquentará (então não podemos simplesmente configurá-la arbitrariamente alta, mas podemos fazer um overclock se estivermos resfriando-a). Um ciclo de clock não é necessariamente igual a uma instrução executada, ou seja, frequência de 1 Hz não significa necessariamente que a CPU executará 1 instrução por segundo, porque executar uma instrução pode levar vários ciclos (quantos depende de cada instrução e também de outros fatores). O número que diz quantos ciclos uma instrução leva é chamado de CPI, ciclos por instrução, CPUs tentam mirar em CPI 1, elas tentam executar 1 instrução por ciclo, mas nem sempre conseguem.

Uma maneira de tentar atingir CPI 1 é otimizando o ciclo de busca, decodificação e execução no hardware para que seja executado o mais rápido possível. Isso é feito tipicamente utilizando um pipeline de instruções, um pipeline tem vários estágios que trabalham em paralelo para que quando uma instrução está entrando, por exemplo, no estágio de decodificação, outra já esteja entrando no estágio de busca, e a instrução anterior esteja no estágio de execução, não precisamos esperar que uma instrução seja totalmente processada antes de começar a processar a próxima. Esse é praticamente o mesmo princípio das linhas de produção em fábricas, se você tem um longo pipeline de fabricação de carros, você pode fazer uma fábrica produzir, digamos, um carro a cada hora, embora seja impossível fazer um único carro do zero em uma hora, ou imagine, uma universidade produzindo novos PhDs a cada ano, apesar de ninguém conseguir realmente obter um PhD em um ano.

É também por isso que ramificações, saltos entre instruções, são consideradas ruins para o desempenho do programa, um salto para uma instrução diferente faz com que a CPU tenha que jogar fora sua instrução pré-processada no momento porque ela não será executada, embora as CPUs tentem lidar com isso com a chamada previsão de ramificação, mas não pode funcionar 100%. Algumas CPUs até têm vários pipelines, permitindo a execução de várias instruções ao mesmo tempo, no entanto, isso só pode ser feito algumas vezes, a última instrução deve ser independente da primeira, também os outros pipelines podem ser mais simples e capazes de lidar apenas com instruções simples. Para que uma CPU seja útil, ela tem que ser capaz de executar alguma I/O, recuperar dados de fora e apresentar o que ela computou. Formas notáveis de executar I/O são:

CPUs também têm uma memória cache que acelera a comunicação com a memória principal, RAM, ROM, embora CPUs mais simples possam viver mesmo sem cache,. CPUs tradicionais têm até vários níveis de cache, chamados L1 e L2. Os caches são basicamente transparentes para o programador, eles não precisam lidar com eles, é apenas algo que torna o acesso à memória mais rápido, no entanto, um programador que sabe como um cache funciona pode escrever código para ser mais amigável ao cache e utilizá-lo melhor.

CPUs de consumo tradicionais hoje têm vários núcleos para que cada núcleo possa basicamente executar uma computação separada em paralelo. Núcleos separados podem ser vistos como cópias duplicadas da CPU de núcleo único com algumas conexões entre eles, os detalhes novamente dependem de cada modelo, como núcleos podem compartilhar a memória cache, eles serão capazes de se comunicar entre si. Isso não torna magicamente toda a CPU mais rápida, agora ela só pode executar várias computações ao mesmo tempo, mas alguém tem que fazer programas para fazer uso disso, casos de uso típicos são sistemas operacionais multitarefa que podem executar diferentes programas, ou melhor, processos, em cada núcleo, observe que a multitarefa pode ser feita até mesmo com um único núcleo, alternando rapidamente entre os processos, mas isso é mais lento, ou linguagens de programação multithread que podem executar cada thread em um núcleo separado.

Interrupções são um conceito importante para a CPU e para programação de baixo nível, elas desempenham um papel na economia de energia, programadores de alto nível geralmente não sabem o que são interrupções, para essas interrupções podem ser comparadas a retornos de chamada de evento. Uma interrupção acontece em algum tipo de evento, por exemplo quando uma tecla é pressionada, quando o cronômetro dispara, quando ocorre um erro. Uma interrupção também pode ser gerada pela própria CPU, é assim que as chamadas de sistema do sistema operacional geralmente são implementadas. Quais tipos de interrupções existem dependem de cada arquitetura de CPU, consulte sua planilha de dados. e geralmente é possível configurar quais interrupções habilitar e quais retornos de chamada usar para elas, isso geralmente é feito por meio da chamada tabela de vetores, uma área especial na memória que registra endereços vetores de rotinas, funções e subprogramas, a serem chamadas em interrupções especificadas. Quando a interrupção acontece, a execução do programa atual é pausada e a CPU automaticamente pula para a subrotina para lidar com a interrupção, após retornar da subrotina, a execução do programa principal continua. Interrupções são contrastadas com polling, ou seja, verificar manualmente algum estado e manipular coisas como parte do programa principal executar um loop infinito no qual verificamos repetidamente o estado do teclado até que alguma tecla seja pressionada. No entanto, o polling é ineficiente, ele desperdiça energia ao executar constantemente cálculos apenas esperando, interrupções, por outro lado, são uma funcionalidade com fio que apenas executa uma tarefa quando ela acontece, sem nenhuma sobrecarga de polling.

As interrupções podem tornar a programação mais fácil, você economiza muitas verificações de condições e leituras de memória e, principalmente, as interrupções permitem que a CPU entre no modo de hibernação e, portanto, economize muita energia. Quando uma CPU não tem nenhum cálculo para fazer, ela pode parar e entrar no estado de espera, sem executar nenhuma instrução, as interrupções ainda funcionam e quando algo acontece, a CPU volta a trabalhar. Isso é normalmente o que a função sleep e wait em sua linguagem de programação faz, ela coloca a CPU para hibernar e define uma interrupção de timer para acordar após um determinado período de tempo. Como programador, você deve saber que deve chamar esta função sleep e wait no seu loop de programa principal para aliviar a CPU, se não fizer isso, você notará que a utilização da CPU, quantidade de tempo que ela está realizando cálculos, irá para 100%, ela irá esquentar, seu computador começará a girar as ventoinhas e ficará barulhento porque você não a deixa descansar.

Há vários modos de operação em uma CPU que normalmente são destinados a sistemas operacionais geralmente haverá algum tipo de modo privilegiado no qual a CPU pode fazer o que quiser, este é o modo para o kernel do SO, e um modo restrito no qual há restrições sobre quais áreas da memória podem ser acessadas ou quais instruções podem ser usadas, este será usado para o programa do usuário. Um programa do usuário não será capaz de travar o sistema operacional, na pior das hipóteses ele próprio travará. Mais notavelmente, as CPUs x86 têm o modo real, endereços correspondem a endereços físicos reais, e o modo protegido, a memória é virtualizada, protegida, endereços geralmente não correspondem a endereços físicos. Uma CPU também pode ter integrado alguns coprocessadores, embora às vezes os coprocessadores sejam realmente um chip separado. Coprocessadores que podem estar dentro da CPU incluem a FPU, unidade de ponto flutuante, ou o coprocessador de criptografia. Isso tornará a CPU cara.

CPUs notáveis

Aqui estão listadas algumas CPUs notáveis, ou às vezes famílias de CPU ou núcleos.

{ Não sou muito bom em HW, sugira-me melhorias para esta seção, por favor, obrigado <3 ~Mr. Unix }

{ WTF, allthetropes tem uma lista bem grande de CPUs famosas, não é um site sobre filmes? https://allthetropes.org/wiki/Central_Processing_Unit. ~Mr. Unix }

TODO: Tabela de CPUs notáveis

TODO: adicionar mais marcar CPUs com ME, adicionar recursos como MMX, FPU, ...


Impulsionado por nada. Todo conteúdo é disponível sob CC0 1.0 domínio público. Envie comentários e correções para Mr. Unix em victor_hermian@disroot.org.