“It is not even wrong.”
Wolfgang Pauli
A arquitetura de um computador é o conjunto de recursos que podem ser referenciados ao usuário por meio da execução de instruções ao sistema. Eles são organizados em elementos lógicos conectados entre si, compondo o sistema e servindo de estrutura para execução dos comportamentos esperados. Sua implementação é feita através de dispositivos eletrônicos interligados que realizam eletricamente as instruções solicitadas.
Arquitetura também é chamada de ISA (Instruction Set Architecture). A organização também é chamada de micro-architecture (MA). Implementação é abreviada como I.
Faz parte da arquitetura definir o conjunto de instruções que a máquina pode executar, assim como o conjunto de registradores auxiliares para tal. Esses elementos definem o comportamento do computador. Itens de projeto de uma ISA:
Na organização temos duas grandes porções: fluxos de dados e unidade de controle. Os componentes participantes são: unidades lógico-aritmética, banco de registradores, multiplexadores, módulos de memórias e suas conexões. Também lida com as microinstruções que são responsáveis pelo correto processamento de uma instrução de máquina (assembly). A ISA pode ter muitas organizações:
A implementação física da organização é feita por meio de um circuito digital, composto de semicondutores. Cada microarquitetura pode ter múltiplas implementações, dependendo de como o projetista arranja os componentes. Itens de uma implementação:
SSI, ou integração em pequena escala, refere-se aos primeiros dias da computação digital, quando transistores individuais e portas lógicas simples eram interconectados manualmente para construir circuitos eletrônicos. Os circuitos SSI normalmente consistiam de dezenas a centenas de transistores, e sua complexidade limitada restringia o número e a variedade de instruções que poderiam ser implementadas. Os sistemas baseados em SSI eram relativamente simples e tinham um baixo nível de desempenho e funcionalidade em comparação com as arquiteturas modernas.
Com o avanço da tecnologia, a introdução do MSI, ou Integração de Média Escala, permitiu que circuitos mais complexos fossem implementados em um único chip. Os circuitos MSI integraram centenas a milhares de transistores, permitindo a construção de processadores mais capazes com uma gama mais ampla de instruções e melhor desempenho. Esses sistemas marcaram um marco significativo na arquitetura de computadores, facilitando o desenvolvimento de aplicativos de software mais sofisticados.
O próximo passo na evolução do ISA foi LSI, ou Integração em Grande Escala. Os circuitos LSI integraram de milhares a dezenas de milhares de transistores em um único chip, permitindo maior poder e complexidade computacional. Os processadores baseados em LSI expandiram o repertório de instruções disponíveis, introduziram modos de endereçamento mais avançados e aprimoraram o desempenho dos computadores. Os circuitos LSI foram um importante catalisador na proliferação de computadores pessoais e no desenvolvimento dos primeiros mainframes.
VLSI (Very Large-Scale Integration) refere-se ao uso de um número ainda maior de transistores para implementar funções lógicas ainda mais complexas. ULSI (Ultra Large-Scale Integration) refere-se ao uso de um número incrivelmente grande de transistores para implementar funções lógicas extremamente complexas. O ISA para computadores construídos com circuitos
ULSI é o mais complexo de todos, e os circuitos ULSI são capazes de implementar um grande número de instruções. Isso permite a execução de programas extremamente complexos, como os usados em videogames modernos e simulações científicas.
O processo produtivo na fabricação de hardware envolve diversas técnicas e metodologias para a criação de dispositivos eletrônicos.
Monólito: O processo de produção de monólito envolve a criação de um único circuito integrado (IC) em uma única peça de silício ou outro material de substrato. Todo o circuito eletrônico, incluindo transistores, resistores e capacitores, é fabricado neste único chip. Projetos monolíticos são amplamente utilizados em muitos dispositivos eletrônicos, variando de microprocessadores a chips de memória. A vantagem da produção monolítica é sua compacidade e complexidade reduzida, resultando em fabricação econômica e eficiente.
Híbrido: No processo de produção híbrido, vários circuitos integrados são interconectados e agrupados em um único substrato. Essa abordagem permite combinar diferentes funcionalidades ou tecnologias em um único dispositivo. Por exemplo, uma abordagem híbrida pode integrar componentes analógicos e digitais ou combinar diferentes tecnologias de semicondutores, como CMOS e transistores bipolares. A produção híbrida é frequentemente empregada em aplicações especializadas onde funcionalidades específicas precisam ser combinadas de forma compacta e integrada.
Placa múltipla: O processo de produção da placa múltipla envolve a montagem de várias placas de circuito, cada uma contendo diferentes componentes ou executando funções específicas. Essas placas são interconectadas usando conectores, cabos ou outros métodos. Projetos de várias placas são comumente usados em sistemas eletrônicos complexos, como servidores, roteadores ou sistemas de controle industrial, onde as funcionalidades do sistema são distribuídas por várias placas. Essa abordagem permite modularidade, facilidade de manutenção e escalabilidade do sistema geral.
Película: A película é um componente utilizado na produção de dispositivos semicondutores, especificamente no processo de fotolitografia. A fotolitografia é uma etapa crucial na fabricação de semicondutores, na qual um material sensível à luz é modelado para criar o circuito desejado. A película é uma membrana fina e transparente que protege a fotomáscara, um componente crucial no processo de fotolitografia, da contaminação. Evita que partículas de poeira, líquidos ou outros contaminantes entrem em contato direto com a máscara, garantindo a qualidade e integridade do processo de modelagem. O uso de uma película ajuda a melhorar o rendimento e a confiabilidade da fabricação de semicondutores.
Os transistores são componentes fundamentais dos circuitos eletrônicos modernos, servindo como interruptores ou amplificadores. Eles vêm em diferentes tipos, cada um com suas características e aplicações únicas. Além disso, os circuitos integrados (CIs) desempenham um papel crucial em dispositivos eletrônicos, e os níveis de corrente elétrica dentro deles são cuidadosamente gerenciados para um desempenho ideal.
Tipos de Transistores:
Transistor de Junção Bipolar (BJT): BJTs são compostos de três camadas de material semicondutor e vêm em duas variações: NPN e PNP. Eles controlam o fluxo de corrente amplificando-o ou trocando-o. Os BJTs são comumente usados em aplicações onde são necessários altos níveis de corrente e tensão, como amplificadores de áudio ou fontes de alimentação.
Transistor de efeito de campo (FET): Os FETs operam controlando o fluxo de portadores de carga através de um campo elétrico. Existem dois tipos principais de FETs:
Transistor bipolar de porta isolada (IGBT): os IGBTs combinam a alta impedância de entrada de um MOSFET com os recursos de comutação rápida de um BJT. Eles são comumente usados em dispositivos eletrônicos de potência, como acionamentos de motores e inversores.
Níveis de Corrente Elétrica em Circuitos Integrados:
Os circuitos integrados consistem em um grande número de transistores interconectados e outros componentes em um único chip. Os níveis de corrente elétrica nos ICs são cuidadosamente gerenciados para garantir funcionalidade e confiabilidade adequadas. Aqui estão algumas considerações importantes:
Corrente Operacional: ICs são projetados para operar dentro de faixas de corrente específicas. Exceder esses limites pode causar superaquecimento, danos aos componentes ou até mesmo falha do dispositivo. Os projetistas consideram cuidadosamente os requisitos de energia do circuito e implementam medidas para evitar o fluxo excessivo de corrente.
Corrente de fuga: A corrente de fuga refere-se à corrente pequena e indesejada que flui através dos transistores mesmo quando eles deveriam estar desligados. Minimizar a corrente de fuga é crucial para evitar o consumo excessivo de energia e manter a integridade dos estados lógicos do circuito.
Corrente de alimentação: A corrente de alimentação representa a corrente total consumida por um circuito integrado da fonte de alimentação. Técnicas eficientes de gerenciamento de energia são empregadas para reduzir a corrente de alimentação enquanto atende aos requisitos de desempenho do circuito.
Densidade de corrente: À medida que os circuitos integrados se tornam mais compactos e densamente empacotados, o gerenciamento da densidade de corrente torna-se crítico. Altas densidades de corrente podem levar ao aumento da resistência, quedas de tensão e aquecimento localizado. Mecanismos adequados de dissipação de calor e distribuição de linhas de alimentação são implementados para garantir distribuição uniforme de corrente e evitar problemas de confiabilidade.
O computador é um conjunto multinível de abstrações. O modelo de Von Neumann (VN) serve de base para a construção da maioria dos computadores atuais. A arquitetura determina a forma de programar as máquinas. Von Neumann materializou o desenvolvimento dos computadores a partir do modelo de Alan Turing.
O primeiro computador que seguiu de forma mais otimizada a arquitetura de VN foi o EDVAC (Electronic Discrete Variable Automatic Computer). Tinha adição, subtração, multiplicação e divisão automática e programável. Rodava entre 300 e 1160 operações por segundo. Fisicamente possuía mais de 6 mil válvulas, ocupava 45m² e pesa 7850 kg.
A implementação da arquitetura Von Neumann no EDVAC marcou um avanço significativo no design de computadores. O conceito de memória compartilhada permitia maior flexibilidade de programa e modificação mais fácil das instruções, pois eram armazenadas na mesma unidade de memória que os dados. Ele introduziu o conceito de computadores de programa armazenado, onde as instruções poderiam ser tratadas como dados e manipuladas pelo próprio computador.
A conclusão do EDVAC no início dos anos 1950 contribuiu para a evolução da arquitetura de computadores e para o desenvolvimento das gerações subsequentes de computadores. A arquitetura Von Neumann, com foco em computadores de programa armazenado, tornou-se a base para a maioria dos sistemas de computador modernos. Ele forneceu uma estrutura que permitiu a execução de programas complexos, revolucionando campos como pesquisa científica, computação empresarial e inúmeras outras áreas que dependem da computação digital.
O modelo de VN define os princípios básicos que a máquina deve obedecer e respeitava os limites de tecnologia da época. Tinha quatro princípios básicos:
A parte lógica do modelo define quatro módulos:
Os módulos digitais tem as seguintes funções: recebe, armazena, movimenta, transforma, processa ou transmite dados. Alguns módulos podem processar e armazenar dados. Vias (barramentos) são usadas para movimentação de dados, interno ou externo.
Os circuitos podem ser mono ou multiprocessados. O mono pode ter duas vias, para memória e entrada / saída (E/S), ou uma única, chamada de UNIBUS. Em multiprocessados, temos a conexão “Cross-Bar”. Quando há dispositivos lentos conectados ao barramento, usa-se vias multiplexadoras. Se a CPU se comunicação com memórias diferentes (de memória e E/S), há a necessidade de estruturas específicas para comunicação. Isso não acontece quando a via é única, endereçamento de programa e E/S estão no mesmo lugar. Na matriz de comunicação Cross-bar, em multiprocessadores, há diversas vias de comunicação e de transformação das memórias, processadores e módulos de entrada e saída.
Qualquer sistema digital (SD) programável deve executar um algoritmo para interpretar os comandos ou instruções. Esse algoritmo fica em loop contínuo e se chama interpretador do SD. Os passos mais básicos, pelo modelo de VN, são:
Elementos básicos para suporte e execução de instruções no modelo de VN:
Estes elementos forma dois processos básicos: fluxos e controle.
Os registradores e a unidade lógico-aritmética ULA são conectados para que os dados tenham um caminho (data path), de modo que a seleção de um ou dois registradores permite a atuação da ULA para executar operações.
Ao avaliar o desempenho de uma unidade de processamento central (CPU), várias medidas principais são comumente usadas para avaliar sua eficiência e eficácia. Essas medidas fornecem informações sobre o quão bem uma CPU executa cálculos e manipula instruções. Duas medidas de desempenho amplamente usadas para CPUs são MIPS (milhões de instruções por segundo) e IPC (instruções por ciclo). Vamos explorar essas medidas e outras métricas relevantes:
São formas simbólicas de representar uma linguagem de mais alto nível em níveis mais baixos, de forma que provê um método para escrever programas que facilite a compreensão e manutenção, sem precisar “escovar” os bits. O programa deve ser traduzido para linguagens de mais baixo nível, eventualmente interpretados e depois executados. Os montadores ou Assemblers convertem a linguagem de montagem para a linguagem de máquina. Os tradutores convertem de uma linguagem para outra.
Linguagem de montagem pura: Cada comando uma instrução de máquina (sem aditivos);
Ligadores (Linkers): Recebem arquivos objetos e geram um programa em linguagem de máquina. Podem receber um ou mais arquivos de uma vez;
Carregadores (Loaders): São necessários para execução de um programa e normalmente é parte do sistema operacional.
Os compiladores utilizam um programa escrito em linguagem de alto nível como entrada e escrevem de forma otimizada um programa em linguagem de máquina ou de montagem.
A principal vantagem de utilizar a linguagem de montagem é a performance. Código de máquina menor e mais rápido. O problema é a portabilidade, manutenção e inteligibilidade do código final. Para criar subrotinas, programadores podem desenvolver macros na linguagem de montagem. As funções tem nomes de referência para serem utilizadas (MOV, ADD, JMP, etc…). O programador também pode definir macros paramétricas (que recebe parâmetros).
Montadores podem criar tabelas de símbolos para criar referências das macros utilizadas no código no momento de gerar a linguagem de máquina. O montador gera o arquivo objeto que ainda não pode, em geral, ser executado pela CPU. Contém: header, text segment, data segment, relocation information, symbol table e debugging information.
Quando o programa está dividido em vários arquivos utilizamos linkers para ligá-los e gerar como saída apenas um programa final em linguagem de máquina. No Windows, os arquivos compilados tem extensão .obj e os executáveis .exe. Nos tipos UNIX, .o e sem extensão, respectivamente. Na ligação dinâmica (DLL), há economia de memória pois o processo de ligação é feito no momento da chamada do procedimento.
Os carregadores devem ler os pedaços do programa para poder proceder com sua execução no sistema operacional. Ele separa os segmentos de memória com base nas informações lidas, inicializa os registradores e prepara a primeira instrução.
Uma instrução é formada por um código de operação, que é obrigatório, e informações da fonte e destino, opcionais. O código de operação (opcode) informa o hardware sobre a sua execução. O tamanho pode ser igual para todas as instruções ou variável, dependendo da máquina. Instruções menores são mais fáceis de lidar pelo conjunto CPU e memória, já que a memória não consegue entregar instruções na velocidade que a CPU roda. Entretanto, instruções pequenas podem dificultar a decodificação.
A especificação dos operandos para executar uma instrução é conhecida como endereçamento. Em cada instrução espera-se o endereço (registrador ou memória) do operando utilizado. Os modos de endereçamento determinam como os endereços e/ou operadores são especificados de acordo com as instruções. Operandos: constante, em registrador, em posição de memória. Os modos de endereçamento reduzem as instruções do programa, aumentam a complexidade do hardware. Modos:
Os tipos de instruções possíveis estão abaixo:
Nos pinos de dados e endereços em chips processadores, há pinos específicos de controle, ou seja, regulam o fluxo e a temporização dos dados de E/S. Um desses casos é o de interrupções, que são modificações no fluxo de controle de um programa, causadas por eventos externos a este, geralmente são pedidos vindos de dispositivos de E/S. Há transferência de controle para uma rotina de serviço que vai tratar a interrupção. O vetor de interrupção possui a primeira instrução. As interrupções devem ter prioridades.
Uma exceção, ou trap, é uma chamada automática de procedimento causada por alguma condição especial na execução de um programa e é detectada pelo hardware ou um micropograma. Quando há ocorrência de exceção o fluxo de controle vai para uma posição fixa na memória e há uma instrução de desvio para um procedimento específico de tratamento de exceção e daí as ações adequadas são executadas. Exceções são causadas pelos programas e são síncronos enquanto interrupções são assíncronas.
O computador deve possuir conexões com dispositivos externos para troca de dados. Esses dispositivos são chamados de periféricos. A taxa de transferência de dados depende do dispositivo, por exemplo, teclado, mouse e microfones são muito lentos, mas monitores e scanners são mais rápidos. Os periféricos são organizados pelas controladoras, ou seja, a CPU não se comunica direto com eles.
Barramento backplane: Permite a conexão de processsadores, memórias e dispositivos de E/S na mesma via.
Normalmente atividades de entrada e saída são assíncronas, o dispositivo precisa utilizar uma interrupção para avisar a CPU que está pronto para enviar ou receber alguma mensagem. Há dois tipos de comunicação: paralela e serial. O processo paralelo envia muitos bits ao mesmo tempo, mas é complexo e caro. Se os bytes chegarem fora de ordem a informação de comunicação é perdida. No caso serial tudo é mais simples, já que os bits são transferidos individualmente.
As controladoras tem registradores para se comunicar com a CPU e possuem endereçamentos específicos
Há três modos principais de comunicação:
E/S Programada (polling): É o mais simples e usado em pequenos sistemas. A CPU deve ficar dedicada para atender as demandas;
E/S por interrupção: Só pede acesso à CPU quando dispositivo está pronto. Executa uma rotina específica para interrupção. O controlador decide para qual dispositivo dar prioridade em caso de múltiplos pedidos simultâneos;
DMA (Direct memory access): Quando o dispositivo não utiliza a CPU para acessar os dados em memória. Copia um bloco inteiro de memória de uma parte pra outra. Só há interrupção ao final do processo.
Tipos de controladoras de disco: IDE (Integrated Drive Electronics), (E)IDE (Extended IDE), ATAPI (Advanced Technology Attachment Packet Interface), SCSI (Small Computer System Interface).
No nível do hardware da máquina as instruções são executadas através de portas lógicas, que são objetos construídos a partir de componentes analógicos, mas funcionam como digitais, lidando com operações básicas em bits, com 1 representando corrente no transistor e 0 sem corrente. A combinação de portas lógicas é que possibilita as funções aritméticas e lógicas.
Barramentos podem ser medidos em capacidades de transações (bytes/seg). Quando o barramento é alimentado direto pelo clock, é chamado de síncrono. Caso dois dispositivos tentem tomar o controle do barramento ao mesmo tempo, há um sistema de arbitragem para resolver conflitos, onde dispositivos de E/S tem prioridade.
Podemos ordenar os tipos de memória em função do tempo de acesso e proximidade da CPU. Isso também gera uma ordenação inversa de tamanho de armazenamento:
O tamanho da palavra (word) está relacionado com a arquitetura da CPU e o agrupamento das células na memória, ou seja, 32 bits tem 4 bytes = 4 células, 64 bits tem 8 bytes = 8 células.
Tipos de ordenação de bytes na memória:
Big Endian: bytes mais significatvos primeiro (Mac)
Little Endian: bytes menos significativos primeiro (Intel)
A CPU se comunica com a memória por três barramentos: controle, de dados e de endereços.
Tipos de memória: Rom (Read Only Memory), Prom (Programmable Rom), EProm (Erasable Prom), EEPRom (Electrically Erasable Prom).
Tipos de encapsulamento: SIMM (Single Inline Memory Module), DIMM (Dual Inline Memory Module).
Memórias auxiliares utilizam meios magnéticos ou de estado sólido para armazenar dados de maneira não volátil: fitas, disquetes, discos, CD’s, HDs, SSDs, etc. Como ficam indiretamente ligados à CPU o acesso é muito mais lento que à RAM, mas tem capacidade de armazenamento muito maior.
CISC (Complex Instruction Set Computer): pode executar centenas de instruções complexas diferentes, sendo muito versátil. Programas são mais simples;
RISC (Reduced Instruction Set Computer): é adequado para executar instruções mais simples e pequenas. Mais eficiente e flexível que o CISC pois necessita poucos ciclos de clock para operações. Programas são mais complexos e longos.
Quando o controle do data path é realizado por software, temos um microprograma que interpreta as instruções em um nível mais alto de abstração e depois as executa. Isso ocorre normalmente em máquinas CISC. Em máquinas tipo RISC, o caminho de dados é feito por hardware.
O interpretador de controle por software fica na memória ROM (Read-only Memory) e tem vários estágios: busca, decodificação e execução.
No controle por hardware não é necessária a interpretação das instruções.
É uma técnica de organizar a execução de múltiplas tarefas ao mesmo tempo, respeitando a ordem das instruções recebidas pelo processador. São divididas em estágios, assim o processador pode executar um estágio para uma tarefa, outro para outra e assim por diante, sem ficar ocioso aguardando por algum recurso. O tempo de pipeline, para comparação com processadores sem essa tecnologia, é dado pela equação
$$ pipeline\;time=\frac{no\_pipeline\;time}{pipeline\;stage\;number} $$Cada instrução tomando um tempo de clock, com o ajuste da instrução mais lenta, a sequência multitarefas do processador torna as execuções mais rápidas pela eficiente em trocar de uma instrução para outra em cada estágio de diferentes tarefas.
A granularidade de uma tarefa é a medida de quanto trabalho é necessário para executá-la, mas também pode ser pensada como a sobrecarga na comunicação de processadores e seus elementos. A granularidade pode ser calculada como $G=\frac{T_{cp}}{T_{co}}$ , onde $T_{cp}$ é o tempo de computação e $T_{co}$ é o tempo de comunicação.
Os tipos de paralelismo são: baixa, média e grossa granulação.
No caso de baixa granulação, ou paralelismo refinado, o programa é divido em pequenas tarefas e cada uma é atribuída a diferentes processadores disponíveis, isso faz o balanceamento de carga. Porém, a carga de comunicação aumenta e podem surgir problemas de sincronia. Normalmente a tarefa de detectar estado de baixo paralelismo é do compilador.
Processadores superescalares foram desenvolvidos para otimizar a execução de tarefas por executar mais instruções em um único ciclo de clock, isso feito por múltiplos e independentes pipelines de instruções, cada um com vários estágios, podendo executar as tarefas fora de ordem se necessário.
Um superpipeline é um tipo de pipeline com muitos estágios que usam tempos de ciclos menores e acabam aumentando a velocidade interna do clock já que executam duas atividades por ciclo, podem ser usados em processadores superescalares.
Quando construímos uma máquina com vários processadores que operam de forma cooperativa ou concorrente, temos as chamadas arquiteturas MIMD (Multiple Instruction Multiple Data). Deve existir uma memória compartilhada com endereço único e comunicação por load e store, além disso, há memória privativa para cada processando, usada através de send e receive.
Se o compartilhamento é lógico temos um multiprocessador, caso contrário, um multicomputador.
Multiprocessadores: é um tipo de arquitetura onde cada processador pode ter acesso ao mesmo espaço de memória, ou seja, a comunicação de processos é simples e a estrutura parece com o modelo de VN conhecido. Os processadores são conectados à estrutura de memória por uma rede de interconexão. Normalmente o maior problema desse tipo de arquitetura é o gargalo na comunicação das CPUs com a memória.
Tipos de acesso à memória:
NUMA (Non-Uniform Memory Access): Memória distribuída e cada CPU é associada com u módulo, com espaço de endereçamento compartilhado.
NCC-NUMA (Non-Cache Coherent NUMA): Não há garantia de coerência nos dados da memória de cache, isto é, não há cache disponível.
CC-NUMA (Cache Coherent NUMA): A coerência do cache pelo hardware.
SC-NUMA (Software Coherent NUMA): Garantia de coerência do cache é dada por software, a implementação é chamada DSM (Distributed Shared Memory).
COMA (Cache Only Memory Architecture): Arquitetura complexa onde os multiprocessadores tem acesso à caches de altas capacidades com coerência garantida por hardware.
São máquinas onde cada CPU enxerga sua própria memória e para trocar mensagens precisam enviar requisições por uma rede de interconxão, são também chamados de sistemas de troca de mensagens, e podem ser usados para computação paralelas. O compartilhamento de memória é chamado de NORMA (NO Remote Memory Access). São divididos em MPP (Massively Paralell Processors) ou COW (Cluster of Workstations).
Arquiteturas paralelas são utilizadas para processamentos massivos de tarefas complexas como pesquisa em clima, simulações físicas, matemática computacional, bioinformática, etc. Há dificuldades inerentes à tarefa de coordenar o processamento em diversos processadores, além de como organizar o acesso à memória e conexões de rede para combinar os resultados. O ganho de desempenho pode não ser proporcional ao número de máquinas, justamente pelos problemas de coordenar e quebrar a tarefa em partes menores que depois serão enviadas ao comando central para finalização do processo.
Taxonomia de Flynn: Método de classificação de fluxo de instruções e dados;
Categorias de sistemas de computação: SISD, SIMD, MISD e MIMD.
Computadores convencionais são feitos principalmente de semicondutores, como o silício, e utilizam a arquitetura de Von Meumann, normalmente executando uma instrução por ciclo, mas podendo ter multiplos processadores para processamento paralelo.
Alguns computadores não convencionais são: ópticos, reconfiguráveis, quânticos, químicos, biológicos, com base em DNS, moleculares, amórficos e nano-computadores.
Referências: