Prévia do material em texto
ARQUITETURA DE COMPUTADORES AULA 1 Prof. André Roberto Guerra 2 CONVERSA INICIAL Nesta etapa, exploraremos os fundamentos e os aspectos avançados que constituem a base dos sistemas de computação modernos. Para tanto, a disciplina está organizada em seis aulas, cada uma projetada para oferecer uma compreensão profunda e prática dos diferentes componentes que formam a arquitetura de computadores. Nesse sentido, é necessário destacá-las, cuja finalidade é ambientá-los sobre o que veremos ao longo do curso: • Aula 1 – Fundamentação: nesta primeira aula, nos concentraremos nos conceitos básicos que sustentam a arquitetura de computadores. Discutiremos a importância da arquitetura de computadores, sua evolução histórica e os princípios fundamentais que orientam o design e a funcionalidade dos sistemas computacionais. • Aula 2 – Visão geral dos computadores: na segunda aula, faremos uma análise abrangente dos componentes essenciais dos computadores. Abordaremos a estrutura e a organização dos computadores, incluindo a interação entre hardware e software, além de examinar os diferentes tipos de computadores e suas aplicações. • Aula 3 – Lógica digital: a lógica digital constitui a base dos sistemas computacionais. Nesta aula, exploraremos os princípios da lógica digital, incluindo portas lógicas, circuitos combinacionais e sequenciais, e como esses elementos formam o núcleo dos processadores e outros componentes computacionais. • Aula 4 – Microprocessadores: os microprocessadores são o coração dos computadores modernos. Vamos estudar sua estrutura, funcionamento e o papel crucial que desempenham na execução de instruções. Analisaremos também os diferentes tipos de microprocessadores e suas arquiteturas específicas. • Aula 5 – Sistemas operacionais: os sistemas operacionais são essenciais para a gestão dos recursos do computador e a execução de aplicações. Nesta aula, discutiremos os principais conceitos dos sistemas operacionais, incluindo gerenciamento de memória, processos, sistemas de arquivos e segurança. • Aula 6 – Arquiteturas paralelas: por fim, exploraremos as arquiteturas paralelas, fundamentais para o desempenho dos sistemas 3 computacionais em tarefas complexas e de alto volume de dados. Abordaremos as técnicas de paralelismo, os desafios e os benefícios de arquiteturas multicore e multiprocessadas. Cada etapa foi cuidadosamente planejada para proporcionar uma mistura equilibrada de teoria e prática, garantindo que você não apenas compreenda os conceitos, mas também saiba aplicá-los em situações reais. Ao final do curso, você terá adquirido uma sólida compreensão da arquitetura de computadores, estando preparado para enfrentar desafios avançados na área da computação. Prepare-se para explorar, questionar e aprofundar seu conhecimento sobre os intrincados mecanismos que fazem os computadores funcionarem. TEMA 1 – A HISTÓRIA E EVOLUÇÃO DA ARQUITETURA DE COMPUTADORES A arquitetura de computadores, que se refere ao design e organização dos componentes de um sistema de computador, é um campo que tem evoluído significativamente desde o início. Desde as primeiras máquinas calculadoras até os avançados sistemas de computação paralela de hoje, a trajetória da arquitetura de computadores reflete uma jornada de inovação contínua, impulsionada por necessidades científicas, tecnológicas e econômicas (Murdocca; Heuring, 2001; Silva, 2023). 1.1 As máquinas mecânicas A história da arquitetura de computadores começa com as máquinas de calcular mecânicas. Um dos primeiros dispositivos notáveis foi a máquina de calcular de Blaise Pascal, construída em 1642, que utilizava uma série de engrenagens para realizar operações aritméticas básicas (Souza; Zafaneli, 2004; Fonseca Filho, 2007). 4 Figura 1 – Pascalina ou máquina de calcular de Pascal Créditos: Archivist/Adobe Stock. Segundo Villaça e Steinbach (2014), em 1801, Joseph-Marie Jacquard inventou o tear de Jacquard, que usava cartões perfurados para controlar o padrão tecido, uma inovação que influenciaria posteriormente o design de computadores. 1.2 A máquina analítica de Charles Babbage De acordo com Miguel Velasco (1985), Charles Babbage, mais conhecido como o pai do computador, propôs o conceito de uma máquina analítica na década de 1830. A máquina analítica era um design teórico para um computador mecânico de propósito geral, que incluía componentes como uma unidade de controle, uma unidade aritmética, uma memória e dispositivos de entrada e saída. Apesar de Babbage nunca ter conseguido construir sua máquina, seus princípios teóricos foram fundamentais para o desenvolvimento da arquitetura de computadores. 5 1.3 A era das válvulas: computadores eletrônicos iniciais O advento da eletrônica no século XX trouxe uma revolução na computação. Nos anos 1940, os primeiros computadores eletrônicos, como o Electronic Numerical Integrator and Computer (ENIAC), usavam válvulas termiônicas (tubos de vácuo) para realizar cálculos (Woiler, 1970; Aranha, 2004). O ENIAC, completado em 1945, podia realizar 5.000 operações por segundo, uma capacidade notável para a época. Contudo, por serem máquinas grandes, consumiam um volume expressivo de energia, tornando-as mais propensas a falhas. 1.4 A arquitetura de Von Neumann John von Neumann, um matemático e cientista da computação, propôs uma arquitetura que se tornaria a base para a maioria dos computadores modernos. A arquitetura de Von Neumann, delineada em um relatório de 1945, descreve um sistema onde os dados e as instruções são armazenados na mesma memória. Isso permitia que os computadores fossem programáveis, executando uma série de instruções de forma sequencial (Castilho; Silva; Weingaertner, 2023). Os principais componentes dessa arquitetura incluem a Unidade Central de Processamento (CPU), a memória, e dispositivos de entrada e saída. 1.5 A transição para transistores Na década de 1950, os transistores substituíram as válvulas termiônicas, levando ao desenvolvimento de computadores mais compactos, eficientes e confiáveis. Os transistores permitiram a criação de computadores de segunda geração, como o IBM 1401 e o UNIVAC II. A miniaturização dos componentes e a redução do consumo de energia marcaram essa era, possibilitando a disseminação dos computadores em setores comerciais e científicos (Gerbasi, 2021). 1.6 A revolução dos circuitos integrados Nos anos 1960 e 1970, os circuitos integrados (ICs) transformaram novamente a arquitetura de computadores. Os ICs permitiram a integração de 6 milhares de transistores em um único chip, levando à criação de computadores de terceira geração, como o IBM System/360 (Castro, 2022; Duarte, 2023). Essa tecnologia possibilitou a produção em massa de computadores mais poderosos e acessíveis, e pavimentou o caminho para a era dos microprocessadores. 1.7 Microprocessadores e computadores pessoais O lançamento do microprocessador Intel 4004 em 1971 marcou o início de uma nova era na arquitetura de computadores. Os microprocessadores integravam a CPU em um único chip, tornando possível a criação de computadores pessoais (PCs). A IBM lançou seu primeiro PC em 1981, usando um microprocessador Intel 8088 (Castro, 2022; Duarte, 2023). Os computadores pessoais democratizaram a computação, tornando-a acessível a empresas e indivíduos em todo o mundo. 1.8 A era dos computadores paralelos e distribuídos À medida que as demandas computacionais cresceram, especialmente em áreas como modelagem científica, inteligência artificial e Big Data, tornou-se claro que aumentar a velocidade dos processadores individuais não seria suficiente. Isso levou ao desenvolvimento de arquiteturas de computação paralela e distribuída. Os sistemas de computação paralela0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 Fonte: Elaborado com base em Guerra, 2023. Portanto, a tabela-verdade claramente mostra todas as possíveis saídas da função fW para cada combinação de entradas X, Y e Z. Essa análise é fundamental no design de circuitos digitais, pois permite prever o comportamento Criar colunas para as variáveis de entrada e listar todas as combinações possíveis utilizando a seguinte fórmula: n. de combinações = 2n (n = número de variáveis de entrada). Criar uma coluna para cada variável de entrada que apareça complementada na equação e anotar os valores resultantes. Avaliar a equação seguindo a ordem de precedência, partindo do nível de parênteses mais internos: primeiro – multiplicação lógica; segundo – adição lógica. 8 da função sob todas as condições possíveis, garantindo assim a correta implementação e o funcionamento do circuito. TEMA 3 – OPERAÇÕES E OPERADORES Na álgebra booleana, são definidas algumas operações elementares (básicas), conforme mostra a Figura 6. Figura 6 – Operações elementares (básicas) Fonte: Elaborado com base em Guerra, 2023. O autor ainda aponta para a necessidade de compreender que também há funções complementares (Figura 7). Figura 7 – Funções complementares Fonte: Elaborado com base em Guerra, 2023. Para compreender melhor os operadores lógicos digitais (elementares e complementares) – portas lógicas, a Figura 8 ilustra esse processo. NÃO (NOT) E (AND) OU (OR) NAND (negação de E) NOR (negação de OU) XOR (exclusive-OR – OU exclusivo) XNOR (negação de OU exclusivo) 9 Figura 8 – Operadores lógicos digitais1 (elementares e complementares) – portas lógicas Fonte: Elaborado com base em Guerra, 2023. Essas operações serão aprofundadas posteriormente, de modo mais detalhado no próximo tópico. As variáveis booleanas são representadas por letras maiúsculas, como A, B, C, …, e as funções pela notação f(A, B, C, D, …) (Guerra, 2023). Há uma ordem na solução das operações descrita como precedência, a saber: 1. ( ) – parênteses 2. ' – negação 3. . – e 4. + – ou, OU exclusivo, … Embora não sejam operadores, os parênteses têm um papel importante na ordem de precedência das operações, pois seu uso modifica a ordem usual dos operadores, assim como acontece na álgebra comum. TEMA 4 – PORTAS LÓGICAS Uma função booleana pode ser representada por uma equação, detalhada por sua tabela-verdade, ou de forma gráfica, em que cada operador é associado a um símbolo específico, permitindo reconhecimento visual imediato. Esses símbolos são chamados de portas lógicas. Na verdade, além de serem símbolos de operadores lógicos, as portas lógicas representam recursos físicos, ou seja, circuitos eletrônicos capazes de 1 O operador lógico buffer é costumeiramente chamado de coringa. 10 realizar operações lógicas. Na eletrônica digital, que opera apenas com dois estados, o nível lógico 0 normalmente corresponde à ausência de tensão (0 volt), enquanto o nível lógico 1 está associado à presença de tensão (5 volts) (Guerra, 2023). Na álgebra booleana, em que as portas lógicas também representam circuitos eletrônicos que realizam as funções booleanas simbolizadas, esse conjunto de portas lógicas e suas conexões, que representam equações booleanas, é denominado circuito lógico (Guerra, 2023). 4.1 Porta lógica NOT (NÃO) A operação NOT dispensa uma definição, uma vez que seu resultado é simplesmente o valor contrário (inverso) ao que a variável apresenta. Uma variável booleana pode assumir somente um entre dois valores: se a variável vale 1, o valor inverso é 0, e vice-versa. Os símbolos utilizados para representação são ~A e A' (lê-se “negação de A”) (Guerra, 2023). Figura 9 – Porta lógica NOT Fonte: Elaborado com base em Guerra,2023. Tabela 3 – Tabela-verdade NOT A f = A' 0 1 1 0 Fonte: Elaborado com base em Guerra, 2023. Diferentemente de todas as outras operações lógicas, a negação é definida sobre uma variável ou sobre o resultado de uma expressão. Portanto, o operador negação é unário. 11 4.2 Porta lógica AND (E) A operação AND, também denominada multiplicação lógica, pode ser definida como aquela que resulta 0 se pelo menos uma das variáveis de entrada vale 0. Assim, ela resulta 1 somente quando todas as variáveis de entrada são 1. A operação AND é representada pelo símbolo ·, tal como o símbolo da multiplicação algébrica. Também é possível encontrar na bibliografia o símbolo ∧ (Guerra, 2023). Figura 10 – Porta lógica AND Fonte: Elaborado com base em Guerra, 2023. Tabela 4 – Tabela-verdade NA A B f = A · B 0 0 0 0 1 0 1 0 0 1 1 1 Fonte: Elaborado com base em Guerra, 2023. A operação lógica AND necessita de pelo menos duas variáveis envolvidas, motivo pelo qual é uma operação binária. 4.3 Porta lógica OR (OU) A operação OR, também denominada adição lógica, pode ser definida como aquela que resulta 1 se pelo menos uma das variáveis de entrada vale 1. Assim, a operação OR resulta 0 apenas quando todas as variáveis de entrada são 0. A operação OR é representada pelo símbolo +, tal como o símbolo da 12 adição algébrica. No entanto, ressaltamos que, em variáveis booleanas, não se trata da adição algébrica, mas da adição lógica. Outro símbolo encontrado na bibliografia é ∨ (Guerra, 2023). Figura 11 – Porta lógica OR Fonte: Elaborado com base em Guerra, 2023. Tabela 5 – Tabela-verdade OR A B f = A + B 0 0 0 0 1 1 1 0 1 1 1 1 Fonte: Elaborado com base em Guerra, 2023. Diferentemente da operação NOT, todas as operações lógicas necessitam de pelo menos duas variáveis envolvidas, não sendo possível realizar as operações sobre somente uma variável. Desse modo, o operador OR, conforme os demais, é binário. 4.4 Porta lógica NAND (negação de E) A operação NAND, também denominada negação de E, é equivalente à operação AND seguida de uma operação NOT, podendo ser definida como a operação que resulta 0 somente quando todas as variáveis de entrada são 1. Assim, a operação NAND resulta 1 para todos os outros valores das variáveis de entrada. A operação NAND é representada pelo símbolo · seguido do símbolo ' – (A · B)' (Guerra, 2023). 13 Figura 12 – Porta lógica NAND Fonte: Elaborado com base em Guerra, 2023. Tabela 6 – Tabela-verdade NAND A B f = (A · B)' 0 0 1 0 1 1 1 0 1 1 1 0 Fonte: Elaborado com base em Guerra, 2023. Assim como nas demais operações, e diferentemente da operação NOT, a operação lógica NAND necessita de pelo menos duas variáveis, sendo, portanto, uma operação binária. 4.5 Porta lógica NOR (negação de OU) A operação NOR, também denominada negação de OU, é equivalente à operação OU seguida de uma operação NOT, podendo ser definida como a operação que resulta 1 somente quando todas as variáveis de entrada são 0. Assim, a operação NOR resulta 0 para todos os outros valores das variáveis de entrada. A operação NOR é representada pelo símbolo + seguido do símbolo ' – (A + B)' (Guerra, 2023). 14 Figura 13 – Porta lógica NOR Fonte: Elaborado com base em Guerra, 2023. Tabela 7 – Tabela-verdade NOR A B f = (A + B)' 0 0 1 0 1 0 1 0 0 1 1 0 Fonte: Elaborado com base em Guerra, 2023. Assim como nas demais operações, e diferentemente da operação NOT, a operação lógica NOR necessita de pelo menos duas variáveis, sendo, portanto, uma operação binária. 4.6 Porta lógica XOR (OU exclusivo) A operação XOR, também denominada OU exclusivo, é definida como aquela que resulta 0 quando todas as variáveis de entrada são iguais. Assim, a operação XOR resulta 1 para as variáveis de entrada diferentes (Guerra, 2023). Essa operação também pode ser definida como a multiplicação lógica de OR e NAND, como em (A + B) · (A · B)'. A operação NOR é representada pelosímbolo ⊕. 15 Figura 14 – Porta lógica XOR Fonte: Elaborado com base em Guerra, 2023. Tabela 8 – Tabela-verdade XOR A B f = (A ⊕ B) 0 0 0 0 1 1 1 0 1 1 1 0 Fonte: Elaborado com base em Guerra, 2023. Assim como nas demais operações, e diferentemente da operação NOT, a operação lógica XOR necessita de pelo menos duas variáveis, sendo, portanto, uma operação binária. 4.7 Porta lógica XNOR (negação de OU exclusivo) A operação XNOR, também denominada negação de OU exclusivo ou complemento de OU exclusivo, é definida como aquela que resulta 1 quando todas as variáveis de entrada são iguais. Assim, a operação XNOR resulta 0 para as variáveis de entrada diferentes. Essa operação também pode ser definida como a negação da multiplicação lógica de OR e NAND, como em ((A + B) ⋅ (A ⋅ B)')'. A operação XNOR é representada pelo símbolo ⊕ seguido do símbolo ' (Guerra, 2023). 16 Figura 15 – Porta lógica XNOR Fonte: Elaborado com base em Guerra, 2023. Tabela 9 – Tabela-verdade XNOR A B f = (A ⊕ B)' 0 0 1 0 1 0 1 0 0 1 1 1 Fonte: Elaborado com base em Guerra, 2023. Assim como nas demais operações, e diferentemente da operação NOT, a operação lógica XNOR necessita de pelo menos duas variáveis, sendo, portanto, uma operação binária. TEMA 5 – APLICAÇÕES PRÁTICAS Com vistas a concluir esta abordagem sobre portas lógicas e lógica digital, vamos explorar as aplicações práticas dessas tecnologias para aprofundar nosso entendimento. As portas lógicas são fundamentais em diversas áreas e aplicações tecnológicas. O Quadro 2 apresenta alguns exemplos. Quadro 2 – Aplicações práticas Computadores e processadores As portas lógicas são usadas para construir unidades lógicas e aritméticas (ALUs), que executam operações básicas em processadores. Memórias digitais Flip-flops, que são usados para armazenar dados em memória RAM e registros, são construídos a partir de portas lógicas. Sistemas de controle Circuitos digitais controlam tudo, desde eletrodomésticos até sistemas de controle de tráfego e automação industrial. 17 Dispositivos de comunicação Circuitos lógicos são usados em modems, roteadores e outros equipamentos de rede para processar sinais de comunicação. Eletrônica de consumo Gadgets, como smartphones, tablets e consoles de videogame, dependem de circuitos digitais complexos. Fonte: Elaborado com base em Descovi et al., 2023. Sendo assim, entender as portas lógicas e sua aplicação na lógica digital é apenas o início de uma jornada no mundo da eletrônica e da computação. Com esse conhecimento, é possível pensar em estratégias para enfrentar desafios mais complexos e desenvolver soluções inovadoras (Guerra, 2023). Por isso, é importante continuarmos explorando, experimentando e construindo, aprofundando nosso entendimento e habilidades na arquitetura de computadores. FINALIZANDO Ao longo deste estudo, exploramos os fundamentos da lógica digital, essenciais para entender a arquitetura de computadores e os sistemas eletrônicos modernos. Abordamos a álgebra de Boole, compreendendo as variáveis booleanas e operações básicas, e entendendo como servem de base teórica para a lógica digital. Discutimos as funções da lógica digital, combinando operações booleanas para criar expressões lógicas complexas e representá-las por meio de tabelas-verdade, expressões algébricas e diagramas de circuitos. Aprofundamos detalhadamente as operações e os operadores fundamentais, como AND, OR, NOT, XOR, NAND, NOR e XNOR, e vimos como são utilizados para construir circuitos que executam funções específicas. Avançamos para as portas lógicas, examinando como esses operadores booleanos são implementados fisicamente em circuitos eletrônicos e destacando exemplos práticos de sua aplicação. Por fim, discutimos sobre as aplicações práticas da lógica digital em sistemas e dispositivos eletrônicos, como computadores, processadores, sistemas de controle e dispositivos de comunicação. Compreendemos como os conceitos estudados são aplicados no mundo real, formando a base para a criação de circuitos e sistemas complexos. 18 REFERÊNCIAS CÁCERES NIETO, E. La inteligencia artificial aplicada al Derecho como una nueva rama de la teoría jurídica. Anales de la Cátedra Francisco Suárez, v. 57, p. 63-89, 2023. Doi: https://doi.org/10.30827/acfs.v57i.26281. DESCOVI, E. D. P.; CEOLIN, S. R.; PEREIRA, R. T. et al. Controle e monitoramento remoto da climatização para salas de telecomunicações. Revista Contemporânea, v. 3, n. 8, p. 10.478-10.505, 2023. Doi: https://doi.org/10.56083/RCV3N8-031. GUERRA, A. R. Raciocínio lógico computacional: fundamentos e aplicações. Curitiba: Editora Intersaberes, 2023. MUNIZ JUNIOR, R. O. História da matemática e tecnologias digitais: biografias e contextos. 2021. Monografia (Licenciatura em Matemática) – Universidade Federal de Uberlândia, Ituiutaba, MG, 2021. SILVA, M. V. Conceitos de computação I. São Paulo: Editora Senac, 2020. ARQUITETURA DE COMPUTADORES AULA 4 Prof. André Roberto Guerra 2 CONVERSA INICIAL Nesta abordagem, exploraremos temas fundamentais relacionados a microprocessadores e microprogramação, importantes para a compreensão do funcionamento interno dos computadores modernos. Os tópicos que abordaremos são apresentados no Quadro 1. Quadro 1 – Tópicos abordados Fonte: Guerra, 2024. Esses temas são fundamentais para entender como os microprocessadores funcionam, como a microprogramação otimiza e controla operações em sistemas computacionais, e como a memória cache melhora o desempenho do sistema. A compreensão desses conceitos é crucial para o design e a análise de sistemas de hardware e software avançados. Aprofundaremos cada uma dessas áreas e descobriremos como se interrelacionam na arquitetura de computadores. Introdução à Microprogramação: analisaremos os princípios básicos da microprogramação, uma técnica utilizada para implementar o controle de unidades de processamento, detalhando como instruções são convertidas em microinstruções que controlam o hardware. Microprocessadores: estudaremos a arquitetura e o funcionamento dos microprocessadores, os componentes centrais dos sistemas de computação. Veremos como eles executam instruções e realizam operações aritméticas e lógicas. Caminho de Dados: exploraremos o caminho de dados dentro de um processador, entendendo como os dados são transferidos entre diferentes partes do sistema, como registradores, ALU (Unidade Lógica e Aritmética) e memória. Watchdog: discutiremos o conceito de watchdog, um mecanismo de segurança que monitora a operação do sistema e reinicializa o microprocessador em caso de falhas, garantindo a confiabilidade e estabilidade do sistema. Cache de Memória: analisaremos o conceito de cache de memória, uma forma de memória de alta velocidade que armazena temporariamente os dados mais frequentemente acessados pelo microprocessador. Exploraremos os diferentes níveis de cache (L1, L2, L3), suas funções, e como eles melhoram o desempenho do sistema ao reduzir o tempo de acesso à memória principal. 3 TEMA 1 – MICROPROCESSAMENTO Desde o desenvolvimento do primeiro computador com programa armazenado na memória, por volta de 1950, houve poucas inovações significativas nas áreas de arquitetura e organização de computadores. Um dos maiores avanços desde o nascimento do computador foi a introdução da Unidade de Controle Microprogramada. Proposta por Wilkes em 1951, essa inovação foi incorporada pela IBM na linha S/360 em 1964 (Nunes, 2023; Miranda, 2009). No nível acima da lógica digital, encontramos o nível de microarquitetura, cuja função é implementar o nível Instruction Set Architecture (ISA), ou em português Arquitetura do Conjunto de Instruções situadoacima dele. O projeto do nível de microarquitetura depende da ISA que está sendo implementada, bem como das metas de custo e desempenho do compilador. Muitas ISAs modernas, especialmente aquelas baseadas no projeto Reduced Instruction Set Computing (RISC), possuem instruções simples que normalmente podem ser executadas em um único ciclo de relógio (Nunes, 2023; Miranda, 2009). Em contrapartida, ISAs mais complexas, como as utilizadas no Pentium 4, podem exigir múltiplos ciclos de relógio para executar uma única instrução. A execução de uma instrução pode requerer a localização de operandos na memória, a leitura desses operandos e o armazenamento dos resultados de volta na memória. A sequência de operações dentro de uma única instrução muitas vezes leva a uma abordagem de controle diferente da adotada para ISAs simples (Nunes, 2023; Miranda, 2009). Dessa forma, o avanço da Unidade de Controle Microprogramada e a evolução das microarquiteturas são fundamentais para a implementação eficiente das ISAs, influenciando diretamente o desempenho e o custo dos sistemas computacionais. TEMA 2 – FAMÍLIA DE COMPUTADORES A microprogramação facilita o projeto e a implementação da unidade de controle, além de oferecer suporte ao conceito de família de computadores. Além da International Business Machines (IBM), a Digital Equipment Corporation (DEC), Programmed Data Processor-8 (PDP-8) também introduziu a ideia de 4 uma família de computadores, que desvincula uma arquitetura de máquina de suas implementações específicas (Kowaltowski, 1996). Isso permitiu que integradores disponibilizassem ao mercado computadores com a mesma arquitetura, mas com diferentes níveis de desempenho e preços. Nos primeiros computadores digitais da década de 1940, havia apenas dois níveis: o nível ISA, no qual toda a programação era realizada, e o nível lógico digital, que executava esses programas. Os circuitos do nível lógico digital eram complicados, difíceis de entender e montar, e muitas vezes pouco confiáveis (Velloso, 2014). Maurice Wilkes, pesquisador da Universidade de Cambridge, projetou uma máquina de três níveis para simplificar drasticamente o hardware. Essa máquina incluía um interpretador embutido e imutável (o microprograma) cuja função era executar programas de nível ISA por meio de interpretação. Ao focar na execução de microprogramas, que possuíam um conjunto limitado de instruções, em vez de programas de nível ISA, com conjuntos de instruções muito maiores, o número de circuitos eletrônicos necessários foi significativamente reduzido (Kowaltowski, 1996). Na época, os circuitos eletrônicos eram compostos por válvulas eletrônicas, e essa simplificação prometia reduzir o número de válvulas, aumentando a confiabilidade dos sistemas (ou seja, reduzindo o número de falhas diárias). Poucas dessas máquinas de três níveis foram construídas na década de 1950, mas a ideia ganhou popularidade na década de 1960. Por volta de 1970, a abordagem de interpretar o nível ISA por meio de um microprograma, em vez de diretamente por meios eletrônicos, tornou-se dominante, sendo adotada pelas principais máquinas da época (Kowaltowski, 1996). TEMA 3 – MICROPROGRAMAÇÃO INCLUÍDA NO HARDWARE Durante os anos dourados da microprogramação, nas décadas de 1960 e 1970, os microprogramas cresceram em tamanho e complexidade. Esse aumento de complexidade, contudo, resultou em uma redução da velocidade de execução das instruções. No entanto, alguns pesquisadores perceberam que, eliminando os microprogramas e reduzindo drasticamente o conjunto de instruções, as máquinas poderiam se tornar mais rápidas (Velloso, 2014). 5 A execução direta das instruções restantes, por meio do controle do caminho de dados por hardware, marcou um retorno ao projeto de computadores como eram antes da invenção da microprogramação por Wilkes. Quadro 2 – Comparação entre Microprogramação e Controle por Hardware Característica Microprogramação Controle por Hardware Tamanho do Conjunto de Instruções Grande Reduzido Complexidade dos Microprogramas Alta Baixa Velocidade de Execução Tendência a ser mais lenta Mais rápida Flexibilidade Alta Baixa Exemplo de Uso IBM S/360 RISC (Reduced Instruction Set Computing) Fonte: Elaborado por Guerra, 2024, com base de Velloso, 2014. O Quadro 2 compara as características principais da microprogramação e do controle por hardware. A microprogramação possui um conjunto de instruções maior e mais complexo, o que pode levar a uma execução mais lenta. Em contrapartida, o controle por hardware tem um conjunto de instruções reduzido e mais simples, permitindo uma execução mais rápida. A flexibilidade é maior na microprogramação, enquanto o controle por hardware é mais eficiente em termos de velocidade (Velloso, 2014). A IBM S/360 é um exemplo de sistema que utilizava microprogramação, enquanto arquiteturas RISC representam o controle por hardware. 3.1 O retorno ao controle por hardware Ao eliminar a microprogramação e reduzir o conjunto de instruções, foi possível implementar arquiteturas mais eficientes. Essa abordagem é exemplificada pelos projetos RISC, em que as instruções simples são executadas diretamente pelo hardware em um único ciclo de relógio. 6 Quadro 3 – Vantagens do controle por hardware na arquitetura RISC Vantagem Descrição Simplicidade Menor complexidade do conjunto de instruções Eficiência Instruções executadas diretamente pelo hardware Velocidade Execução rápida das instruções em um único ciclo de relógio Redução de componentes eletrônicos Menos circuitos necessários para a execução das instruções Fonte: Elaborado por Guerra, 2024, com base de Velloso, 2014. O quadro apresenta as vantagens do controle por hardware na arquitetura RISC. A simplicidade é alcançada por meio de um conjunto de instruções menos complexo. A eficiência e a velocidade são aperfeiçoadas porque as instruções são executadas diretamente pelo hardware em um único ciclo de relógio. A redução de componentes eletrônicos significa que menos circuitos são necessários, o que pode aumentar a confiabilidade e reduzir custos. 3.2 A roda continua girando Mesmo com o retorno ao controle por hardware, a evolução na arquitetura de computadores não parou. Com a popularização da linguagem de programação Java, surgiu uma nova abordagem. Programas Java são geralmente compilados para uma linguagem intermediária chamada bytecode Java, que é então interpretada ou compilada Just-In-Time (JIT) para execução. 7 Quadro 4 – processo de execução de programas Java Etapa Descrição Compilação Inicial O código Java é compilado para bytecode Java Interpretação/Compilação JIT O bytecode Java é interpretado ou compilado JIT para execução Execução O código resultante é executado pela máquina virtual Java (JVM) Fonte: Elaborado por Guerra, 2024, com base de Velloso, 2014. O quadro detalha o processo de execução de programas Java. Primeiramente, o código Java é compilado para bytecode Java, uma linguagem intermediária. Em seguida, o bytecode é interpretado ou compilado JIT para execução. Finalmente, o código resultante é executado pela máquina virtual Java (JVM). Essa abordagem híbrida oferece um equilíbrio entre desempenho e portabilidade, permitindo que programas Java sejam executados em diversas plataformas com eficiência. TEMA 4 – MICROPROCESSADOR De acordo com o dicionário Michaelis, um microprocessador é um conjunto de elementos da unidade central de processamento, normalmente contidos em um único chip de circuito integrado. Esse chip, quando combinado com outros chips de memória e de entrada/saída, constitui um microcomputador. 4.1 O Ciclo do Processador A operação de um microprocessador, como o 8088, consiste em executar instruções sequencialmente. A execução de uma única instrução podeser subdividida nas etapas do Quadro 5. 8 Quadro 5 – Etapas do ciclo de execução de instruções em um microprocessador Busca da Instrução A instrução é buscada na memória no segmento de código utilizando o contador de programa (PC) Incremento do Contador de Programa O contador de programa é incrementado para apontar para a próxima instrução Decodificação da Instrução A instrução buscada é decodificada Busca de Dados Os dados necessários são buscados na memória e/ou nos registradores do processador Execução da Instrução A instrução é executada Armazenamento dos Resultados Os resultados da instrução são armazenados na memória e/ou nos registradores Reinício do Ciclo O processo retorna à Etapa 1 para iniciar a próxima instrução. Fonte: Elaborado por Guerra, 2024, com base em Meneses; Henriques, 2022. A execução de uma instrução é semelhante à execução de um microprograma, um programa muito pequeno utilizado por diversos fabricantes de microprocessadores. 4.2 Watchdog e confiabilidade dos microcontroladores Um aspecto importante na operação de microcontroladores é a continuidade da execução dos programas. Em ambientes industriais, interferências podem fazer com que o microcontrolador pare de executar o programa ou execute incorretamente. Enquanto um computador pode ser resetado manualmente para resolver esses problemas, os microcontroladores não possuem um botão de reset (Soares, 2021). Para resolver essa questão, é introduzido um bloco chamado watchdog (cão de guarda). Esse bloco é um contador contínuo que é "zerado" sempre que o programa é executado corretamente. Quando o programa trava, o contador não é reiniciado, e, ao atingir seu valor máximo, ele resetará o microcontrolador, permitindo a execução correta do programa novamente. Esse processo aumenta a confiabilidade na execução de qualquer programa sem a necessidade de intervenção do usuário (Soares, 2021). 9 Além disso, ruídos em sistemas digitais podem levar a comportamentos inadequados. Um circuito utilizado para reconduzir o sistema ao seu comportamento normal é o watchdog timer (Soares, 2021). O sistema digital gera periodicamente um sinal que reinicializa o contador. Caso o contador não seja reinicializado, ele gera um sinal para resetar o sistema, reestabelecendo o controle. Quadro 6 – Funcionamento do Watchdog Timer Componente Função Contador Contínuo Zerado sempre que o programa é executado corretamente. Reset do Microcontrolador Aciona um reset quando o contador atinge o valor máximo após uma falha no programa. Fonte: Elaborado por Guerra, 2024, com base em Soares, 2021. O quadro descreve os componentes e o funcionamento do watchdog timer, que aumenta a confiabilidade dos sistemas microcontroladores, prevenindo falhas de execução. TEMA 5 – CACHE DE MEMÓRIA A cache de memória é um componente crucial na arquitetura de computadores, projetado para aumentar a velocidade de acesso aos dados e melhorar o desempenho geral do sistema. Funciona como uma memória intermediária de alta velocidade, localizada entre a Unidade Central de Processamento (CPU) e a memória principal (RAM), armazenando temporariamente os dados e instruções mais frequentemente utilizados pelo processador (Carvalho; Martins, 2004). Este mecanismo reduz a latência e aumenta a eficiência do processamento, pois a CPU pode acessar os dados da cache muito mais rapidamente do que da memória principal. 5.1 Funcionamento da cache de memória A cache de memória opera com base no princípio da localidade, que se divide em dois tipos: localidade temporal e localidade espacial. A localidade temporal refere-se ao conceito de que dados acessados recentemente são propensos a serem acessados novamente em um futuro próximo. Já a localidade 10 espacial sugere que dados localizados próximos uns dos outros na memória têm maior probabilidade de serem acessados em sequência (Damasceno, 2016). A cache é organizada em níveis hierárquicos, geralmente denominados L1, L2 e L3. Figura 1 – Hierarquia de Memória Cache: Níveis L1, L2 e L3 Fonte: Elaborado por Guerra, 2024, com base em Damasceno, 2016. A estrutura hierárquica da memória cache desempenha papel categórico na eficiência do processamento de dados. Cada nível de cache é otimizado para um equilíbrio entre velocidade e capacidade, garantindo que o processador tenha acesso rápido aos dados mais frequentemente utilizados (Damasceno, 2016). Essa hierarquia reduz a frequência com que o processador precisa acessar a memória principal, que é mais lenta, melhorando assim o desempenho geral do sistema. 5.2 Estrutura e políticas de cache A estrutura da cache inclui várias políticas de gerenciamento que determinam como os dados são armazenados, acessados e substituídos. As principais políticas estão apresentadas no Quadro 7. Cache L3: É a maior e mais lenta entre os três níveis, mas ainda mais rápida que a memória principal. Geralmente, é compartilhada entre todos os núcleos do processador, proporcionando uma camada adicional de cache para melhorar o desempenho. Cache L2: Tem maior capacidade que a L1, mas é um pouco mais lenta. Pode ser dedicada a cada núcleo do processador ou compartilhada entre múltiplos núcleos, dependendo da arquitetura. Cache L1: É a mais rápida e menor em capacidade, localizada diretamente no núcleo do processador. Ela é dividida em cache de instrução e cache de dados, otimizando ainda mais o acesso rápido a ambos os tipos de informações. 11 Quadro 7 – Políticas de cache de memória: mapeamento, escrita e substituição Política de Mapeamento Define como os dados da memória principal são mapeados para a cache. Existem três tipos de mapeamento: direto, associativo e associativo por conjunto. No mapeamento direto, cada bloco de memória principal mapeia para uma única linha na cache. No mapeamento associativo, qualquer bloco pode ser armazenado em qualquer linha da cache. O mapeamento associativo por conjunto é uma combinação dos dois, no qual a cache é dividida em conjuntos e cada bloco mapeia para qualquer linha dentro de um conjunto específico. Política de Escrita Determina como as operações de escrita são tratadas pela cache. Existem duas abordagens principais: write-through e write-back. Na política write-through, os dados são escritos simultaneamente na cache e na memória principal, garantindo a consistência imediata. Na política write-back, os dados são escritos na cache e atualizados na memória principal apenas quando o bloco é substituído, o que melhora a eficiência, mas requer uma política de controle de coerência para garantir a consistência dos dados. Política de Substituição Define quais dados são removidos da cache quando novos dados precisam ser carregados. A política mais comum é a LRU (Least Recently Used), que remove o bloco que não foi usado há mais tempo. Outras políticas incluem FIFO (First-In, First-Out) e Random, que seleciona um bloco aleatoriamente para substituição. Fonte: Elaborado por Guerra, 2024, com base em Xavier; Rodrigues; Lima Júnior, 2004. As políticas de cache de memória – mapeamento, escrita e substituição – são fundamentais para o desempenho eficiente dos sistemas de computação. O mapeamento eficiente dos dados, as estratégias de escrita que garantem a consistência e as políticas de substituição que otimizam o uso da cache são essenciais para maximizar a velocidade de acesso aos dados e a eficiência geral do sistema (Xavier; Rodrigues; Lima Júnior, 2004). A escolha das políticas adequadas depende das características específicas da aplicação e da arquitetura do sistema, sendo um componente vital no design de processadores e sistemas de memória. 5.3 Benefícios e desafios da cache de memória A cache de memória proporciona diversos benefícios, apresentados a seguir. 12 Quadro 8 – Benefícios da cache de memória Aumentoda Velocidade de Acesso Reduz significativamente o tempo de acesso aos dados, permitindo que a CPU processe informações mais rapidamente. Melhoria do Desempenho do Sistema Ao reduzir a latência de acesso à memória, a cache melhora o desempenho geral do sistema, especialmente em operações que envolvem processamento intensivo de dados. Eficiência Energética Ao minimizar a necessidade de acessos frequentes à memória principal, a cache contribui para a redução do consumo de energia. Fonte: Elaborado por Guerra, com base em Araújo, 2003. No entanto, a implementação da cache de memória também apresenta desafios. Quadro 9 – Desafios da implementação da cache de memória Custo A memória cache é mais cara de fabricar devido à sua alta velocidade e complexidade. Complexidade de Projeto Integrar múltiplos níveis de cache e gerenciar políticas de mapeamento, escrita e substituição aumenta a complexidade do design do processador. Coerência de Cache Em sistemas multiprocessadores, manter a coerência dos dados na cache é um desafio significativo, exigindo protocolos de coerência para garantir que todas as cópias dos dados sejam consistentes. Fonte: Elaborado por Guerra, 2024, com base em Araújo, 2003. Embora a cache de memória ofereça benefícios significativos em termos de desempenho e eficiência energética, sua implementação enfrenta desafios importantes, como custo elevado, complexidade de projeto e garantia de coerência de dados em sistemas multiprocessadores. O contínuo desenvolvimento de tecnologias e estratégias de design é essencial para superar esses desafios e continuar a melhorar a capacidade dos sistemas computacionais de atender às crescentes demandas por processamento rápido e confiável. 13 FINALIZANDO Durante este estudo, discutimos temas importantes ligados ao universo da arquitetura de computadores. Entre eles, destaca-se o microprocessamento, que constitui a base operacional de qualquer computador, sendo responsável pela execução de instruções e processamento de dados. A família de computadores, por sua vez, introduz o conceito de variações dentro de uma mesma arquitetura, permitindo que diferentes implementações atendam a requisitos específicos de desempenho e custo, enquanto mantêm a compatibilidade com um conjunto de instruções definido. A microprogramação, incluída no hardware, que representa uma abordagem flexível para implementar o controle do processador, utilizando microinstruções armazenadas internamente. Essa técnica oferece adaptabilidade às mudanças nas necessidades de processamento sem a necessidade de alterações físicas no hardware. Já o estudo aprofundado do microprocessador envolve a compreensão de sua arquitetura interna, ciclos de instrução, tipos de registradores e a interação entre a unidade de controle e o caminho de dados, fundamentais para otimização do desempenho computacional. E, finalmente, o cache de memória e a hierarquia de memória, agindo como uma camada de armazenamento rápido e temporário entre o processador e a memória principal. 14 REFERÊNCIAS ARAÚJO, R. B. Computação Ubíqua: Princípios, Tecnologias e Desafios. In: Simpósio Brasileiro de Redes de Computadores. (Org.). Computação Ubíqua: Princípios, Tecnologias e Desafios. 1 ed. Natal: 2003. p. 45 - 115. CARVALHO, M. B.; MARTINS, C. A. P. S. Arquitetura de Cache com Associatividade Reconfigurável. In: SIMPÓSIO EM SISTEMAS COMPUTACIONAIS DE ALTO DESEMPENHO (SSCAD). Anais... Porto Alegre, Sociedade Brasileira de Computação, p. 50-57, 2004. DAMASCENO, A. L. O impacto da hierarquia de memória sobre a arquitetura IPNoSys. Dissertação (Mestrado em Ciência da Computação) – Universidade do Estado do Rio Grande do Norte, Mossoró/RN, 2016. KOWALTOWSKI, T. Von Neumann: suas contribuições à Computação. Estudos Avançados, v. 10, p. 237-260, 1996. MENESES, R. D.; HENRIQUES, M. A. A. Aplicação de esquemas de assinatura digital pós-quântica baseada em reticulados para hardwares restritos. In: XIV ENCONTRO DE ALUNOS E DOCENTES DO DCA/FEEC/UNICAMP (EADCA), 2022. Anais... Universidade de Campinas (UNICAMP). Campinas, 25-26 ago. 2022. MIRANDA, R. J. C. Desenvolvimento de um programa didático computacional destinado à geração de códigos de comando numérico a partir de modelos 3D obtidos em plataforma CAD considerando a técnica prototipagem rápida. Dissertação (Mestrado em Engenharia Mecânica) – Universidade Federal de Minas Gerais, Belo Horizonte, 2009. NUNES, G. R. Um estudo sobre a geração de trajetórias retilínea e circular para um robô móvel a rodas com tração-diferencial e configuração carro com uso restrito de sensores propriocepetivos (encoders). Monografia (Bacharelado em Engenharia Elétrica) – Instituto Federal do Espirito Santo, Vitória/ES, 2023. SOARES, S. N.; WAGNER, F. R. Uma Análise de Ferramentas de Software para o Ensino de Organização e Arquitetura de Computadores. In: INTERNATIONAL CONFERENCE ON ENGINEERING AND COMPUTER EDUCATION, 2000. Anais... São Paulo: [s.n.], 2000. 15 SOARES, M. F. Estudo dos efeitos combinados da interferência eletromagnética e envelhecimento na confiabilidade do microcontrolador Cortex-M4. Dissertação (Mestrado em Engenharia Elétrica) – Pontifícia Universidade Católica do Rio Grande do Sul, Porto Alegre, 2021. VELLOSO, F. Informática: conceitos básicos. Elsevier Brasil, 2014. XAVIER, M. A. S.; RODRIGUES, J. C.; LIMA JÚNIOR, O. A. Estudo Comparativo de Simuladores de Memória Cache. 2004. Disponível em: . Acesso em: 26 jul. 2024. ARQUITETURA DE COMPUTADORES AULA 6 Prof. André Roberto Guerra 2 CONVERSA INICIAL Nesta etapa, abordaremos assuntos essenciais para compreender como o paralelismo melhora o desempenho e a eficiência dos sistemas computacionais. Figura 1 – Tópicos a serem abordados A partir desses tópicos, podemos ampliar o nosso olhar e conhecimento referente às arquiteturas paralelas e seu impacto na computação moderna. Visão Geral do Paralelismo Abordadremos o paralelismo, discutindo os princípios fundamentais que permitem a execução simultânea de múltiplas instruções. O paralelismo é a chave para aumentar a capacidade de processamento dos computadores, permitindo que diversas operações sejam realizadas ao mesmo tempo. Exploraremos como esse conceito se aplica tanto ao nível de hardware quanto ao nível de software, destacando suas vantagens e desafios. Paralelismo no chip Examinaremos o paralelismo no chip, também conhecido como paralelismo de nível de instrução (ILP) e como os processadores modernos utilizam técnicas como a execução fora de ordem, a previsão de desvios e a superescalaridade para maximizar o uso de seus recursos internos. E a importância dos pipelines de execução e como contribuem para a eficiência do processamento. Coprocessadores Discutiremos os processadores especializados que trabalham em conjunto com a CPU principal para acelerar tarefas específicas, como cálculos matemáticos complexos ou processamento gráfico. E como a integração de coprocessadores pode melhorar significativamente o desempenho do sistema para determinadas aplicações. Multiprocessadores versus multicomputadores A comparação entre multiprocessadores e multicomputadores será nosso próximo foco. Multiprocessadores são sistemas com múltiplas CPUs que compartilham a mesma memória física, enquanto multicomputadores consistem em múltiplos computadores interconectados que comunicam entre si através de uma rede. Analisaremos as vantagens e desvantagens de cada abordagem, bem como suas aplicações típicas. Escalonamento O escalonamento é um aspectocrucial em arquiteturas paralelas, referindo-se à maneira como as tarefas são distribuídas entre os processadores disponíveis. Abordaremos as diferentes estratégias de escalonamento, como escalonamento estático e dinâmico, e discutiremos como elas afetam a eficiência e a utilização dos recursos do sistema. Desempenho Por fim, discutiremos o desempenho das arquiteturas paralelas, a medir e avaliar o desempenho de sistemas paralelos, considerando métricas como speedup, eficiência e escalabilidade. Além dos fatores que limitam o desempenho e como superá-los através de técnicas avançadas de otimização. 3 TEMA 1 – PARALELISMO Embora os computadores continuem a evoluir em velocidade, as exigências impostas a eles crescem igualmente rápido. Astrônomos desejam simular a história completa do universo, desde o big bang até o seu final. Cientistas farmacêuticos aspiram projetar medicamentos personalizados para doenças específicas sem a necessidade de testes extensivos em animais. Engenheiros de aeronaves poderiam criar produtos mais eficientes no consumo de combustível usando simulações computacionais detalhadas em vez de protótipos físicos. Para muitos usuários em ciência, engenharia e indústria, qualquer capacidade de computação será insuficiente (Galante, 2024). Diante desses desafios crescentes, os arquitetos de computadores estão cada vez mais adotando sistemas paralelos. Enquanto pode não ser viável construir uma máquina com uma única Unidade Central de Processamento (CPU) com um ciclo de tempo de 0,001 nanossegundos, é possível e eficaz construir sistemas com milhares de CPUs, cada uma com um ciclo de tempo de 1 nanossegundo. Embora mais lentas individualmente, a capacidade total de processamento desses sistemas paralelos pode ser equivalente ou até superior, oferecendo esperança para enfrentar problemas computacionais complexos (Tanenbaum, 2001; Tanenbaum; Bos, 2024). O paralelismo pode ser implementado em diversos níveis. No nível mais básico, ele pode ser incorporado ao chip da CPU através de pipelines e designs superescalares com múltiplas unidades funcionais. Além disso, instruções de comprimento variável podem permitir paralelismo implícito. CPUs também podem ser projetadas com recursos especiais para manipular múltiplos threads simultaneamente. Juntas, essas técnicas podem proporcionar ganhos significativos de desempenho, potencialmente até dez vezes superiores em comparação com sistemas puramente sequenciais (Silva; Nunes; Guardia, 2024; Tanenbaum, 2001). Em um nível mais avançado, placas adicionais com CPUs especializadas podem ser adicionadas a um sistema, focadas em funções como processamento de rede, multimídia ou criptografia. Essas CPUs especializadas podem aumentar o desempenho em até cinco a dez vezes em suas áreas específicas de atuação. No entanto, para alcançar ganhos de desempenho de ordens de magnitude como 100, 1000 ou 1 milhão, é necessário criar e integrar eficientemente 4 múltiplas CPUs em grandes multiprocessadores ou multicomputadores (clusters de computadores) (Tanenbaum, 2001; Tanenbaum; BOS, 2024). Esses sistemas complexos enfrentam desafios significativos de coordenação e comunicação entre processadores, que exigem soluções robustas para garantir eficiência. Além dos clusters tradicionais, grids de computação começam a surgir, permitindo a colaboração de organizações inteiras através da internet. Esses sistemas distribuídos têm potencial para expandir significativamente as capacidades computacionais disponíveis, representando uma visão promissora para o futuro da computação. A complexidade do paralelismo, desde acoplamentos fortes até acoplamentos fracos, é um campo de pesquisa intensivo e vital, abrangendo desde a otimização de desempenho em sistemas locais até a coordenação de enormes redes de computadores globalmente distribuídas. TEMA 2 – PARALELISMO NO CHIP E PARALELISMO NO NÍVEL DE INSTRUÇÃO Importa salientar que o paralelismo é dividido em várias categorias, as principais podem ser destacadas nas tabelas 1 e 2, juntamente com suas características. Tabela 1 – Paralelismo no chip TIPO DE PARALELISMO DESCRIÇÃO Paralelismo no nível da instrução Consiste em emitir múltiplas instruções por ciclo de clock, maximizando o uso das unidades funcionais disponíveis. Multithreading Permite que múltiplos threads executem simultaneamente na mesma CPU, aproveitando períodos de latência ou espera de outras operações. Múltiplas CPUs no chip Incorpora mais de uma CPU no mesmo chip, permitindo que cada processador execute tarefas independentes de forma simultânea. Fonte: Guerra, 2024. Essas técnicas de paralelismo no chip são essenciais para atender às crescentes demandas por desempenho computacional em áreas como simulação, processamento de dados em tempo real e computação de alto 5 desempenho. Cada uma contribui para otimizar o uso dos recursos do processador, proporcionando ganhos significativos em eficiência e velocidade de processamento (Tanenbaum; Bos, 2024). A figura 2 destaca o paralelismo no nível da instrução, sendo uma técnica fundamental utilizada para aumentar a eficiência dos processadores modernos. Além de permitir que múltiplas instruções sejam emitidas e executadas em um único ciclo de clock, maximizando o uso das unidades funcionais do processador. Essa abordagem é implementada de duas maneiras principais: processadores superescalares e processadores de Very Long Instruction Word (VLIW) ou, em português, Palavra de Instrução Muito Longa (Silva, 2020). A figura a seguir apresenta as características e diferenças dessas duas técnicas de paralelismo no nível da instrução. Figura 2 – Paralelismo no nível da instrução Fonte: Guerra, 2024. Os processadores superescalares e VLIW exemplificam como o paralelismo no nível da instrução pode ser implementado de maneiras distintas, mas complementares. Os processadores superescalares dependem do hardware para emitir múltiplas instruções de forma dinâmica, adaptando-se às TIPO DE CPU Processadores superescalares Capazes de emitir múltiplas instruções para unidades de execução em um único ciclo de clock, variando de duas a seis instruções dependendo do design e circunstâncias. DESCRIÇÃO Processadores VLIW Utilizam Palavras de Instrução Muito Longas que contêm múltiplos opcodes e operandos, permitindo execução simultânea de várias operações em diferentes unidades funcionais. 6 condições do sistema e ao estado das unidades funcionais. Essa flexibilidade permite uma utilização eficiente dos recursos disponíveis, mesmo que nem todas as instruções possam ser emitidas simultaneamente (Lopes; Pereira, 2020). Por outro lado, os processadores VLIW adotam uma abordagem mais estática, onde o compilador prepara grupos de instruções que podem ser executados em paralelo, garantindo que todas as unidades funcionais sejam utilizadas de maneira otimizada. Embora essa técnica possa resultar em instruções mais longas e complexas, ajuda a eliminar a necessidade de lógica de emissão dinâmica no hardware, simplificando o design do processador (Lopes; Pereira, 2020). Ambas as abordagens possuem características distintas, e a escolha entre elas depende das necessidades específicas da aplicação e das características do sistema (Lopes; Pereira, 2020). O uso eficaz do paralelismo no nível da instrução é crucial para alcançar altos níveis de desempenho nos processadores modernos, permitindo que eles atendam às crescentes demandas de computação em diversas áreas, desde simulações científicas até processamento de multimídia. TEMA 3 – COMPUTAÇÃO DE CLUSTER O computador de cluster é outro tipo de multicomputador, que geralmente, é composto por centenas ou até milhares de PCs ou estações de trabalho conectadas através de uma rede. A distinção entre um cluster e um multicomputador é semelhanteà diferença entre um mainframe e um PC: ambos possuem CPU, memória RAM, sistema operacional e outros componentes. No entanto, os componentes do mainframe são mais rápidos e robustos (exceto talvez o sistema operacional) (Azevedo Dias; Araújo, 2023). Em termos qualitativos, eles são diferentes e são utilizados e gerenciados de maneiras distintas. Essa mesma distinção se aplica aos multicomputadores em relação aos clusters (Azevedo Dias; Araújo, 2023). Existem diversos tipos de clusters, mas os dois principais são os clusters centralizados e descentralizados. 7 Figura 3 – Aspectos dos os clusters centralizados e clusters descentralizados É válido acrescentar os clusters centralizados, normalmente, as máquinas são homogêneas e não possuem periféricos além das placas de rede e, possivelmente, discos rígidos (Azevedo Dias; Araújo, 2023; Aldana; Buitrago; Gutiérrez, 2020). Já os clusters descentralizados são geralmente conectados por uma LAN e costumam ser heterogêneos, com um conjunto completo de periféricos. No entanto, ter um cluster com centenas de mouses não é muito mais útil do que ter um cluster sem nenhum mouse (Azevedo Dias; Araújo, 2023; Aldana; Buitrago; Gutiérrez, 2020). O mais importante é que muitos desses computadores têm proprietários que são emocionalmente ligados às suas máquinas e podem não gostar da ideia de um astrônomo usar seus computadores para simular o big bang. Utilizar estações de trabalho ociosas para formar um cluster implica na necessidade de um mecanismo para migrar tarefas quando os donos dessas máquinas precisarem usá-las. Essa migração é possível, mas aumenta a complexidade do software necessário para gerenciar o cluster (Aldana; Buitrago; Gutiérrez, 2020). Em geral, os clusters são pequenos conjuntos com cerca de 500 PCs. No entanto, é possível construir clusters muito grandes utilizando PCs comuns, como faz o Google. Além disso, clusters de grande escala podem ser utilizados em diversas áreas, desde pesquisas científicas complexas até a execução de • Consistem em estações de trabalho ou PCs agrupados em uma grande estante dentro de uma sala. Muitas vezes, esses computadores são empacotados de maneira mais compacta do que o normal para reduzir o espaço físico e o comprimento dos cabos. Clusters centralizados • São formados por estações de trabalho ou PCs distribuídos por um prédio ou campus. Muitos desses computadores ficam ociosos durante várias horas do dia, especialmente à noite. Clusters descentralizados 8 grandes aplicações empresariais, devido à sua capacidade de processamento distribuído e flexibilidade. TEMA 4 – ESCALONAMENTO É um dos conceitos fundamentais na arquitetura de computadores e sistemas operacionais, sendo crucial para a eficiência do processamento de tarefas (Tanenbaum; Bos, 2024). Escalonamento se refere à metodologia utilizada pelo sistema operacional para gerenciar e distribuir o tempo da CPU entre os vários processos ou threads que necessitam ser executados. Visando corroborar com o exposto anterior e como forma de ampliar a linha de raciocínio, a Tabela 3 apresenta a importância do escalonamento. Tabela 3 – Importância do escalonamento Maximização do uso da CPU O objetivo primário do escalonamento é garantir que a CPU seja utilizada de forma eficiente, minimizando o tempo ocioso e maximizando o throughput, que é a quantidade de trabalho realizado em um determinado período de tempo. Justiça e equidade O escalonamento deve garantir que todos os processos recebam uma fatia justa do tempo da CPU, evitando que algum processo monopolize os recursos enquanto outros permanecem em espera. Minimização da latência O tempo de resposta para processos interativos deve ser minimizado para garantir uma experiência de usuário fluida, enquanto processos em lote devem ser concluídos rapidamente para maximizar a produtividade. Fonte: Tanenbaum; Bos, 2024. Compreender os diversos aspectos do escalonamento ajuda a visualizar como um sistema operacional pode manter a eficiência e a equidade no uso da CPU. A maximização do uso da CPU, a justiça na distribuição de recursos e a minimização da latência são pilares fundamentais para proporcionar um ambiente de computação robusto e eficiente (Tanenbaum; Bos, 2024). 9 Os algoritmos de escalonamento determinam a ordem e a forma como os processos recebem tempo de CPU, impactando diretamente a eficiência e a justiça do sistema operacional (Tanenbaum; Bos, 2024). Cada algoritmo tem suas próprias características e é adequado para diferentes cenários e tipos de carga de trabalho. Tabela 4 – Algoritmos de escalonamento First-Come, First-Served (FCFS) Os processos são atendidos na ordem em que chegam. Simples de implementar, mas pode levar ao problema de "convoy effect", onde um processo longo retarda os outros. Shortest Job Next (SJN) Também conhecido como Shortest Job First (SJF), prioriza os processos com menor tempo de execução estimado. Efetivo na redução do tempo de espera médio, mas pode causar starvation para processos mais longos. Round Robin (RR) Cada processo recebe um tempo fixo (quantum) para execução em um ciclo. Uma técnica justa e eficiente para sistemas de tempo compartilhado. Priority Scheduling Processos são escalonados com base em prioridade. Alta flexibilidade, mas pode levar a starvation para processos de baixa prioridade se não forem implementadas técnicas de envelhecimento. Multilevel Queue Scheduling Diferentes filas para processos com diferentes características (interativos, em lote etc.). Combina os benefícios de vários algoritmos de escalonamento. Fonte: Tanenbaum; Bos, 2024. 10 Os diversos algoritmos de escalonamento oferecem soluções para diferentes necessidades e desafios operacionais. Desde a simplicidade do First- Come, First-Served (FCFS) até a complexidade do Multilevel Queue Scheduling, a escolha do algoritmo adequado é crucial para atender às demandas específicas de cada sistema e garantir a melhor performance possível (Tanenbaum; Bos, 2024). Além dos algoritmos de escalonamento, existem várias considerações importantes que afetam a eficácia e a eficiência do escalonamento de processos (Tanenbaum; Bos, 2024). Esses fatores influenciam diretamente a responsividade e a performance geral do sistema operacional. Tabela 5 – Considerações no escalonamento Context Switching Trocar de um processo para outro envolve salvar e restaurar estados, o que pode ser custoso em termos de desempenho. Preemptividade Algoritmos preemptivos permitem a interrupção de processos em execução para atender a processos mais prioritários, aumentando a responsividade do sistema. Real-Time Systems Sistemas de tempo real exigem algoritmos de escalonamento específicos que garantem o cumprimento de prazos rigorosos. Fonte: Tanenbaum; Bos, 2024. As considerações no escalonamento, como a troca de contexto, a preemptividade e as exigências dos sistemas de tempo real são elementos cruciais que moldam o comportamento e a eficácia do escalonamento. Entender esses fatores é essencial para implementar e otimizar um sistema de escalonamento que atenda às necessidades de diferentes tipos de cargas de trabalho e condições operacionais (Tanenbaum; Bos, 2024). TEMA 5 – DESEMPENHO O desempenho de um sistema de computação é uma medida de sua eficiência na execução de tarefas, influenciado por diversos fatores desde o hardware subjacente até a otimização do software. Entender e aperfeiçoar o 11 desempenho é fundamental para maximizar a eficácia dos sistemas computacionais (Silva, 2023). Além disso, é influenciado por vários fatores, sendo a arquitetura da CPU um dos mais importantes. A estrutura interna do processador, incluindo sua frequência de clock, o número de núcleos e a capacidade de execução de instruçõesparalelas impacta significativamente a eficiência do sistema. Além disso, a velocidade e a eficiência da memória RAM, assim como a hierarquia de caches, determinam a rapidez com que os dados são acessados e processados pela CPU (Silva, 2023). Outro fator crítico é o desempenho das operações de entrada e saída (I/O), que envolve discos rígidos, SSDs e dispositivos de rede. Esses componentes podem se tornar gargalos para muitas aplicações. Técnicas como o pipeline de instruções e a arquitetura superescalar, que permitem que múltiplas instruções sejam processadas simultaneamente, também são essenciais para aumentar a eficiência da execução (Silva, 2023; Lima, 2019). De acordo com Silva (2023) e Lima (2019), existem várias métricas para avaliar o desempenho de um sistema. O throughput, que é a quantidade de trabalho que um sistema pode processar em um determinado período, é de alta prioridade para sistemas de alto desempenho. A latência, ou o tempo total que um sistema leva para responder a uma solicitação, é crucial para sistemas interativos e de tempo real. O tempo de execução, que é a duração total que um programa leva para ser executado desde o início até a conclusão, serve como um indicador direto da eficiência de processamento. A utilização dos recursos, que mede quanto os recursos do sistema (CPU, memória, I/O) estão sendo utilizados durante a operação, também é uma medida importante, pois a utilização eficiente dos recursos é um sinal de bom desempenho. Para melhorar o desempenho, várias técnicas podem ser empregadas. A otimização de código envolve melhorar o código-fonte do software para reduzir o uso de recursos e aumentar a velocidade de execução. O uso de paralelismo, por meio de técnicas como multithreading e multiprocessing, permite distribuir a carga de trabalho entre múltiplas unidades de processamento (Schmalfuss, 2020; Lopes, 2021; Lima, 2023; Lima, 2019). A substituição de algoritmos ineficientes por outros mais rápidos e que consomem menos recursos também é uma prática comum para aprimorar o desempenho. Além disso, a atualização de componentes de hardware, como 12 CPU, memória e dispositivos de armazenamento, pode melhorar a capacidade e a velocidade do sistema (Schmalfuss, 2020; Lopes, 2021; Lima, 2023; Lima, 2019). Por fim, implementar políticas de gerenciamento de recursos que garantam a alocação eficiente e a manutenção do desempenho ideal sob diferentes cargas de trabalho é essencial para a eficiência global do sistema. FINALIZANDO Os tópicos abordados sobre arquitetura de computadores destacam a importância de diversas técnicas e estratégias para melhorar o desempenho dos sistemas computacionais modernos. Vimos que o paralelismo é uma técnica essencial que permite a execução simultânea de múltiplas tarefas, aproveitando a capacidade de múltiplos processadores ou núcleos de execução para acelerar o processamento de dados e aumentar a eficiência dos programas. Dentro desse contexto, o paralelismo no chip, ou de nível de thread, utiliza múltiplos núcleos em um único processador para executar diferentes threads simultaneamente. Por outro lado, o paralelismo no nível de instrução (ILP) permite que um processador execute várias instruções ao mesmo tempo, utilizando técnicas como pipelining e execução fora de ordem para aumentar a velocidade de processamento. Discutimos ainda que a computação de cluster envolve a utilização de múltiplos computadores interconectados para funcionar como um sistema unificado, permitindo o processamento distribuído de grandes volumes de dados. Essa abordagem é particularmente eficaz em aplicações complexas, como simulações científicas e análise de big data, melhorando tanto o desempenho quanto a capacidade de processamento. Em relação ao escalonamento, problematizamos se tratar de uma técnica crítica de gerenciamento de tarefas em sistemas operacionais, determinando a ordem e o tempo de execução dos processos. Um escalonamento eficiente maximiza a utilização dos recursos do sistema, minimiza o tempo de espera e garante um desempenho consistente, sendo especialmente importante em ambientes de computação paralela. Por fim, discutimos sobre o desempenho, sendo este uma medida crucial na avaliação dos sistemas computacionais, referindo-se à rapidez e eficiência na execução de tarefas. Fatores como a arquitetura do processador, a capacidade da memória e as técnicas de paralelismo e escalonamento influenciam diretamente o desempenho global de um sistema. Além disso, a análise e a 13 otimização do desempenho são essenciais para garantir que os sistemas atendam de forma eficaz às demandas de processamento. 14 REFERÊNCIAS ALDANA, M. J.; BUITRAGO, J. A.; GUTIÉRREZ, J. E. Avaliação de clusters baseados em sistemas em um chip para a computação de alto desempenho: uma revisão. Revista Ingenierías Universidad de Medellín, v. 19, n. 37, p. 75- 92, 2020. AZEVEDO DIAS, H. D.; ARAÚJO, J. S. Programação e Computação em Cluster: Um Relato de Experiência na Educação Profissional Técnica em Informática. In: ANAIS do XXIX Workshop de Informática na Escola. SBC, p. 182-191. 2023. LIMA, E. C. Otimizando a execução de aplicações paralelas em ambiente de nuvem heterogênea. Dissertação (Mestrado em Engenharia Elétrica) – Universidade Federal do Pampa, Alegrete/RS, 2023. LIMA, C. A. M. Organização e Arquitetura de Computadores II. 2019. Disponível em: . Acesso em: 3 jul. 2024. LOPES, R. A. S. Masa-StarPU: estratégia com múltiplas políticas de escalonamento de tarefas para alinhamento de sequências com pruning. Dissertação (Mestrado em Informática) – Universidade de Brasília, Brasília/DF, 2021. LOPES, A. S. B.; PEREIRA, M. M. Aceleradores Reconfiguráveis no Projeto Multicore: uma análise de custo versus benefício. HOLOS, v. 6, p. 1-20, 2020. SCHMALFUSS, M. F. Uma interface para escalonamento de algoritmos iterativos em C++. Dissertação (Mestrado em Ciência da Computação) – Universidade Federal de Pelotas, Pelotas/RS, 2020. SILVA, V. M.; NUNES, R. P. C; GUARDIA, H. C. Programação paralela com Unity: um estudo de caso usando threads em CPU e em GPU. In: ESCOLA Regional de Alto Desempenho de São Paulo (ERAD-SP). SBC, p. 25-28. 2024. SILVA, M. V. Conceitos de computação I. São Paulo: Editora Senac São Paulo, 2020. SILVA, L. R. M. Organização e Arquitetura de Computadores: uma Jornada do Fundamental ao inovador. Freitas Bastos, 2023. 15 SIQUEIRA, H. M. C. Proposta de arquitetura de alto desempenho para sistemas de tempo real. Tese (Doutorado em Sistemas e Computação) – Universidade Federal do Rio Grande do Norte, Natal/RN, 2020. TANENBAUM, A. S. Organização Estruturada de Computadores, 4. ed. Rio de Janeiro: LTC, 2001. TANENBAUM, A. S.; BOS, H. Sistemas operacionais modernos. Bookman Editora, 2024.utilizam múltiplos processadores trabalhando simultaneamente em diferentes partes de um problema, enquanto os sistemas distribuídos usam múltiplos computadores interconectados para realizar tarefas de forma colaborativa (Maliszewski et al., 2021). 1.9 Arquiteturas modernas e futuras No contexto contemporâneo, a arquitetura de computadores continua a evoluir em passo acelerado. Tecnologias como a computação em nuvem, a Internet das Coisas (IoT) e a Inteligência Artificial (IA) estão moldando novas direções. A computação quântica, que utiliza os princípios da mecânica quântica para realizar cálculos extremamente rápidos, está emergindo como uma fronteira promissora, embora ainda esteja em estágio experimental (Pereira, 2022). Os processadores modernos, como os CPUs multicore e GPUs, estão otimizados para lidar com cargas de trabalho paralelas e intensivas em dados. 7 Além disso, as arquiteturas especializadas, como os Tensor Processing Units (TPUs) desenvolvidos pelo Google para acelerar o processamento de algoritmos de machine learning, estão se tornando cada vez mais comuns (Pereira, 2022; Lorenzon; Schnorr, 2023). Em termos gerais, a história e evolução da arquitetura de computadores são uma jornada significativa, sobretudo para compreender os processos que constituem e qualificam a inovação tecnológica. Desde as primeiras máquinas mecânicas até os sistemas de computação paralela e quântica do mundo contemporâneo, a arquitetura de computadores tem se transformado consecutivamente para atender às crescentes demandas da sociedade. Vale destacar ainda que cada avanço significa novas possibilidades e desafios. TEMA 2 – PRINCÍPIOS BÁSICOS DA ARQUITETURA DE COMPUTADORES A arquitetura de computadores é um campo fundamental na ciência da computação e da engenharia eletrônica. Este campo envolve o design, a organização e a interconexão dos componentes de um sistema de computação, essencial para o desenvolvimento de sistemas eficientes e de alta performance. A arquitetura de computadores configura-se como um conjunto de regras e métodos que delineiam a funcionalidade, a organização e a implementação de sistemas de computação (Silva, 2023). Em termos específicos, abrange o design dos componentes internos do computador e a forma como interagem para processar dados e executar programas. Os principais componentes de um sistema de computador são: Tabela 1 – Componentes básicos de um computador Unidade Central de Processamento (CPU) A CPU, ou processador, é a “cabeça” do computador, responsável pela execução de instruções de programas. Consiste em duas partes principais: a Unidade de Controle (UC) e a Unidade Lógica e Aritmética (ULA). Memória A memória de um computador armazena dados e instruções. Existem vários tipos de memória, incluindo a memória Random Access Memory (RAM) para armazenamento temporário e a memória Read-Only Memory (ROM) para armazenamento permanente. Dispositivos de Entrada e Saída (E/S) Esses dispositivos permitem a comunicação entre o computador e o mundo externo, como, por exemplo, teclados, monitores, impressoras e discos rígidos. Barramentos Barramentos são vias de comunicação que transferem dados entre os diferentes componentes do computador. Fonte: Silva, 2023. 8 Compreender os componentes básicos de um computador é fundamental para entender como os sistemas de computação funcionam e como diferentes elementos interagem para executar tarefas complexas. A CPU, memória, dispositivos de entrada e saída e barramentos formam a espinha dorsal da arquitetura de computadores, cada um desempenhando papel essencial para garantir a eficiência e funcionalidade do sistema (Silva, 2023). O desenvolvimento contínuo dessas tecnologias assegura o aprimoramento da capacidade e performance dos sistemas de computação, abrindo novas possibilidades para inovação e desenvolvimento no campo da informática. A maioria dos computadores modernos é fundamentada na arquitetura de Von Neumann, proposta por John von Neumann em 1945. Esta arquitetura define um sistema onde os dados e as instruções são armazenados na mesma memória (Castilho; Silva; Weingaertner, 2023). Seus principais componentes incluem: Fluxograma 1 – Arquitetura de Von Neumann: fundamentos e componentes Fonte: Kowaltowski, 1996; Castilho, Silva e Weingaertner, 2023. A arquitetura de Von Neumann estabeleceu os princípios fundamentais que ainda guiam o design dos computadores modernos, proporcionando uma base sólida para a evolução contínua da tecnologia computacional. Considerando esses componentes e visando uma melhor compreensão sobre essa abordagem, a Figura 2 apresenta os caminhos de dados de uma típica máquina de Von Neumann. Unidade de controle: responsável por buscar, decodificar e executar instruções do programa. Unidade Lógica e Aritmética (ULA): realiza operações matemáticas e lógicas. Memória: armazena dados e instruções. Dispositivos de Entrada/Saída (E/S): permitem a interação com o usuário e outros sistemas. 9 Figura 2 – Caminho de dados de uma típica máquina de Von Neumann Fonte: Tanenbaum, 2001. Este diagrama representa a organização interna da CPU, destacando como as instruções são processadas. No centro do esquema, estão a UC e a ULA, conectadas por registradores que armazenam temporariamente dados e instruções. A UC busca e decodifica as instruções da memória principal, coordenando a execução das operações pela ULA. O caminho de dados também mostra a interação da CPU com a memória e os dispositivos de E/S através de um barramento, demonstrando a sequência de busca, decodificação e execução que caracteriza o modelo de Von Neumann (Tanenbaum, 2001). Referenciais teóricos, como é o caso de Castilho, Silva e Weingaertner (2023), têm estudado sobre o conjunto de Instruções ou, em inglês, Instruction Set Architecture (ISA). O ISA é o alicerce de qualquer arquitetura de computador, que define o repertório de operações que um processador pode executar, formando a interface entre o software e o hardware. As instruções do ISA podem ser classificadas em distintas categorias, cada uma desempenhando papel essencial no funcionamento do computador: 10 Tabela 2 – Conjunto de operações que um processador pode realizar Instruções Aritméticas Estas instruções realizam operações matemáticas básicas como adição, subtração, multiplicação e divisão. São fundamentais para a execução de cálculos e operações numéricas em programas de computador. Instruções Lógicas Instruções como AND, OR, NOT e XOR realizam operações lógicas que são essenciais para a tomada de decisões e processamento de dados binários. Instruções de Controle Gerenciam o fluxo de execução do programa, permitindo saltos condicionais e incondicionais, chamadas de sub-rotinas e retornos, que são cruciais para a implementação de estruturas de controle, como loops e condicionais. Instruções de Transferência de Dados Movem dados entre registradores, memória e dispositivos de entrada/saída, facilitando a manipulação e o armazenamento de informações dentro do sistema. Fonte: Castilho, Silva e Weingaertner, 2023; Kowaltowski, 1996. Especificamente, a Tabela 2 aponta instruções fundamentais para o funcionamento dos computadores, que juntas formam a base para o processamento e a manipulação eficiente de dados nos sistemas computacionais. De acordo com Castilho, Silva e Weingaertner (2023), o futuro da arquitetura de computadores possui diversos elementos importantes, como, por exemplo, o desenvolvimento de novos paradigmas, como a computação quântica e a computação neuromórfica. A computação quântica promete resolver problemas computacionais que são intratáveis para computadores clássicos, utilizando qubits e princípios da mecânica quântica para realizar cálculoscomplexos de forma exponencialmente mais rápida. Já a computação neuromórfica procura emular a arquitetura do cérebro humano, criando sistemas mais eficientes e inteligentes que podem aprender e adaptar-se a novos desafios (Lorenzon; Schnorr, 2023). Esses são alguns dos princípios básicos da arquitetura de computadores, responsáveis por formar uma base sólida para o desenvolvimento de sistemas eficientes, escaláveis e inovadores. Desde a definição do conjunto de instruções até o futuro promissor da computação quântica, a compreensão desses conceitos é essencial para todos os profissionais da área de computação (Lorenzon; Schnorr, 2023). A evolução contínua da arquitetura de computadores impulsiona os avanços tecnológicos, permitindo a criação de sistemas mais influentes e versáteis para enfrentar possíveis desafios futuros. 11 TEMA 3 – CONCEITOS FUNDAMENTAIS NA ARQUITETURA DE COMPUTADORES A arquitetura de computadores define a estrutura e o funcionamento dos sistemas computacionais, envolvendo desde o nível mais básico dos circuitos eletrônicos até a organização de software complexo. Esses conceitos são fundamentais para entender como os computadores processam informações e realizam tarefas, influenciando diretamente a eficiência, performance e capacidade de ajustamento dos sistemas modernos (Lima; Moreano, 2021; Silva, 2023). A Tabela 3 resume os principais conceitos da arquitetura de computadores e suas características. Tabela 3 – Principais conceitos da arquitetura de computadores e suas características Instruções e Linguagem de Máquina Comandos elementares em forma de códigos binários que a CPU pode executar, incluindo operações aritméticas, lógicas, de controle e transferência de dados. Arquitetura de Von Neumann Modelo de arquitetura de computadores que usa o mesmo espaço de memória para dados e instruções, acessados por um único barramento. Arquitetura de Harvard Modelo de arquitetura que utiliza barramentos separados para dados e instruções, permitindo acesso simultâneo e aumentando a eficiência, embora mais complexo de implementar. Hierarquia de Armazenamento Diferentes níveis de memória com características de capacidade, velocidade e custo variáveis, incluindo registros, cache, RAM, e dispositivos de armazenamento em massa. Fonte: Silva, 2020. Esses são alguns dos conceitos fundamentais na arquitetura de computadores, responsáveis por formar uma base sobre a qual todo o funcionamento dos sistemas digitais é construído. Desde a organização interna da CPU até a interação com dispositivos externos, esses princípios definem não apenas o desempenho técnico dos computadores, mas também sua capacidade de evoluir e se adaptar às demandas crescentes de processamento de dados e informação na era digital (Silva, 2023; Silva, 2020). Dominar esses conceitos é essencial para profissionais de tecnologia da informação e engenheiros de software que buscam criar sistemas eficientes e potentes para uma variedade de aplicações e necessidades computacionais. 12 TEMA 4 – QUESTÕES INTRODUTÓRIAS AOS ELEMENTOS ESSENCIAIS DA ARQUITETURA DE COMPUTADORES Segundo Lima e Moreano (2021), a arquitetura de computadores é um campo multidisciplinar que reúne uma série de fatores essenciais para seu desenvolvimento. São fatores que influenciam garantindo que os computadores executem tarefas de maneira rápida, precisa e eficiente, considerando as crescentes demandas por processamento de dados e complexidade computacional na era digital. Para efeito de melhor esclarecimento, a Tabela 4 se esforça em destacar alguns aspectos envolvidos na arquitetura de computadores. Tabela 4 – Aspectos introdutórios envolvidos na arquitetura de computadores Desempenho vs. Custo Um dos desafios centrais na arquitetura de computadores é encontrar um equilíbrio entre desempenho e custo. Aumentar a velocidade e a capacidade de processamento geralmente requer investimentos em componentes mais avançados e, consequentemente, mais caros. Paralelismo e Computação Distribuída Com o aumento da demanda por poder de processamento, o paralelismo e a computação distribuída se tornaram áreas de intensa pesquisa e desenvolvimento. Essas abordagens permitem que múltiplos processadores ou sistemas trabalhem simultaneamente em uma tarefa, melhorando significativamente o desempenho e a escalabilidade em sistemas computacionais complexos. Segurança e Confiança À medida que os sistemas computacionais se tornam onipresentes na sociedade, a segurança dos dados e a confiança nas operações se tornam preocupações críticas. Evolução Tecnológica A arquitetura de computadores está em constante evolução à medida que novas tecnologias emergem e novos desafios surgem. Desde a miniaturização dos circuitos até o desenvolvimento de novos paradigmas de computação, como a computação quântica. Fonte: Ribeiro, 2023. A arquitetura de computadores é um campo dinâmico e essencial que sustenta a revolução digital em curso. Ao compreender os elementos fundamentais e as questões introdutórias deste campo, pode-se contemplar melhor como os sistemas computacionais são projetados, implementados e aprimorados para enfrentar os desafios do mundo moderno (Ribeiro, 2023). Explorar os conhecimentos nesse campo não apenas amplia o entendimento da tecnologia, mas também abre caminho para as inovações que moldarão o futuro da computação. 13 TEMA 5 – FUNDAMENTAÇÃO EM ARQUITETURA DE COMPUTADORES: DOS PRIMÓRDIOS AO PRESENTE A história da arquitetura de computadores é uma jornada fascinante que começou há mais de meio século e continua a evoluir rapidamente até os dias atuais. Este texto explora os marcos significativos, os avanços tecnológicos e os principais conceitos que moldaram essa disciplina essencial para o desenvolvimento e funcionamento dos sistemas computacionais modernos. 5.1 Primórdios da arquitetura de computadores O surgimento da arquitetura de computadores remonta aos anos 1940 e 1950, uma época marcada por grandes inovações e descobertas. Um dos marcos fundamentais foi o desenvolvimento do ENIAC (Electronic Numerical Integrator and Computer) em 1946, considerado o primeiro computador digital eletrônico de grande escala (Silva, 2023). Projetado pelos cientistas John Mauchly e J. Presper Eckert na Universidade da Pensilvânia, o ENIAC introduziu conceitos básicos de arquitetura de computadores, incluindo a utilização de válvulas eletrônicas para processamento de dados e a implementação de instruções codificadas diretamente no hardware (Silva, 2022). 5.2 A era dos transistores e circuitos integrados Na década de 1950, a evolução dos computadores foi impulsionada pela substituição das válvulas eletrônicas por transistores, dispositivos semicondutores menores, mais rápidos e mais confiáveis. Esta transição foi liderada por iniciativas como o UNIVAC I (Universal Automatic Computer I), o primeiro computador comercialmente produzido nos Estados Unidos (Castro, 2022; Duarte, 2023). A introdução dos circuitos integrados na década de 1960 permitiu a miniaturização e integração de múltiplos componentes eletrônicos em um único chip, aumentando significativamente a capacidade de processamento e reduzindo custos. 5.3 Arquiteturas e modelos Durante as décadas de 1970 e 1980, surgiram diferentes arquiteturas de computadores que definiram a forma como os sistemas processam informações 14 até hoje. A arquitetura de Von Neumann, proposta por John von Neumann na década de 1940, estabeleceu o modelo de computador que separa a unidade de processamento central da memória de armazenamento, com um único barramento para a comunicação entre ambas (Silva, 2023). Esse modelo ainda é predominante na maioria dos computadores pessoais e servidores de hoje. Em contraste, a arquitetura de Harvard,desenvolvida no início do século XX, propôs um modelo onde a memória de instruções e a de dados são separadas fisicamente, permitindo que instruções e dados sejam acessados simultaneamente, aumentando a eficiência do processamento em certos tipos de aplicações. 5.4 Avanços na era moderna O final do século XX e o início do século XXI testemunharam avanços extraordinários na arquitetura de computadores, impulsionados pela miniaturização dos transistores e pelo aumento da capacidade de processamento. A introdução dos processadores multicore permitiu que múltiplos núcleos de processamento fossem integrados em um único chip, melhorando a capacidade de multitarefa e paralelismo em sistemas computacionais (Katinsky; Leon, 2022). Além disso, o desenvolvimento de técnicas avançadas de cache, otimização de barramentos de comunicação e novas arquiteturas de memória, como memórias flash e SSDs (Solid State Drives), revolucionaram o armazenamento e acesso aos dados, aumentando significativamente a velocidade e eficiência dos sistemas (Tanenbaum; Bos, 2024). 5.5 Desafios e tendências futuras A arquitetura de computadores enfrenta desafios contínuos à medida que a demanda por maior desempenho, eficiência energética e segurança cresce. Tendências como computação quântica, redes neurais artificiais e sistemas embarcados estão moldando o futuro da arquitetura de computadores, exigindo novos paradigmas de design e inovação (Silva, 2023; Oliveira, 2023). Em suma, a fundação da arquitetura de computadores desde seus primórdios até o presente reflete não apenas uma progressão tecnológica, mas também um profundo impacto na sociedade moderna. A contínua evolução 15 dessa disciplina essencial continuará a moldar o futuro da computação, impulsionando novas descobertas e aplicações que transformam nosso mundo digital. FINALIZANDO Com base no que vimos até aqui, a arquitetura de computadores se constitui como um campo essencial e dinâmico, cuja história remonta aos primeiros dispositivos mecânicos, evoluindo através das máquinas de Blaise Pascal e Charles Babbage, até os primeiros computadores eletrônicos do século XX, como o ENIAC. Com o advento dos transistores e circuitos integrados, a capacidade de processamento ampliou-se exponencialmente, culminando em sistemas modernos mais sofisticados. É importante ressaltar ainda que os princípios básicos da arquitetura de computadores incluem a organização e a integração de componentes cruciais como a Unidade Central de Processamento (CPU), memória, dispositivos de entrada/saída e barramentos. A arquitetura de Von Neumann, por exemplo, é um modelo fundamental que descreve como programas e dados compartilham o mesmo espaço de memória, permitindo a execução eficiente de instruções. Discutimos ainda os conceitos fundamentais nessa área, incluindo a hierarquia de memória, que vai dos registros rápidos na CPU ao armazenamento secundário, e o paralelismo, que permite a execução simultânea de múltiplas instruções, aumentando significativamente a eficiência do sistema. O pipelining, por sua vez, melhora a taxa de processamento ao permitir que diferentes estágios de execução de instruções ocorram em paralelo. Quanto às questões introdutórias aos elementos essenciais da arquitetura de computadores, destaca-se a relevância de equilibrar desempenho e custo, sendo este um desafio constante para arquitetos de sistemas. O paralelismo e a computação distribuída são abordagens que aumentam a capacidade de processamento ao permitir que múltiplos processadores ou sistemas trabalhem simultaneamente. A segurança também é uma preocupação central, protegendo dados e a integridade das operações contra ameaças cada vez mais rígidas e desafiadoras. Em síntese, no que tange à fundamentação em arquitetura de computadores, examinamos a trajetória histórica e as inovações tecnológicas 16 que moldaram o campo, desde os primórdios com dispositivos mecânicos até os avanços modernos, como processadores multicore e computação quântica. 17 REFERÊNCIAS ARANHA, G. O processo de consolidação dos jogos eletrônicos como instrumento de comunicação e de construção de conhecimento. Ciências & Cognição, v. 3, p. 21-62, 2004. BRASIL ESCOLA. Blaise Pascal. 2024. Disponível em: . Acesso em: 2 jul. 2024. CASTILHO, M. A.; SILVA, F.; WEINGAERTNER, D. Uma possível abordagem para o ensino introdutório de algoritmos em cursos de computação. In: SIMPÓSIO BRASILEIRO DE EDUCAÇÃO EM COMPUTAÇÃO, 3., p. 376-385, 2023. Anais… CASTRO, J. I. M. Economia-mundo e monopólio: Terceira Revolução Industrial e o Leste Asiático. Trabalho de Conclusão de Curso (Bacharelado em Relações Internacionais) – Universidade Federal do Rio Grande do Sul, Porto Alegre, 2022. DUARTE, T. D. Sistema integrado de monitoramento de consumo de água residencial. Trabalho de Conclusão de Curso (Graduação em Engenharia Elétrica) – Instituto Federal de Educação, Ciência e Tecnologia da Paraíba, João Pessoa, 2023. FONSECA FILHO, C. História da computação: o caminho do pensamento e da tecnologia. EDIPUCRS, 2007. GERBASI, V. A. Colaboração, trabalho digital e o cercamento sobre o conhecimento tecnológico. Tese (Doutorado em Ciências Sociais) – Universidade Estadual Paulista, Marilia, 2021. KATINSKY, J. R.; LEON, E. Reflexões sobre o design industrial. Olhares, 2022. KOWALTOWSKI, T. Von Neumann: suas contribuições à computação. Estudos Avançados, v. 10, p. 237-260, 1996. LIMA, D. P.; MOREANO, N. ECS e EMCS: simuladores de caches para o apoio pedagógico no ensino de Arquitetura de Computadores. In: WORKSHOP SOBRE EDUCAÇÃO EM COMPUTAÇÃO, 19., p. 308-317, 2021. Anais… 18 LORENZON, A. F.; SCHNORR, L. M. Pensamento computacional paralelo: desafios do presente e do futuro. Sociedade Brasileira de Computação, 2023. MALISZEWSKI, A. M. et al. Ambiente de Nuvem Computacional Privada para Teste e Desenvolvimento de Programas Paralelos. In: Minicursos da XXI Escola Regional de Alto Desempenho da Região Sul, 2021. Disponível em: . Acesso em: 2 jul. 2024. MIGUEL VELASCO, J. R. La máquina analítica de Charles Babbage. In: Homenaje al profesor D. Rafael Rodríguez Vidal. Universidad de Zaragoza, 1985. p. 299-324. MURDOCCA, M. J.; HEURING, V. P. Introdução à arquitetura de computadores. Elsevier, 2001. OLIVEIRA, H. C. Aquisitores de dados na indústria: passado, presente e futuro. Monografia (Graduação em Engenharia de Controle e Automação) – Universidade Federal de Ouro Preto, Ouro Preto, 2023. PEREIRA, L. M. Internet das coisas (IoT): inovações, impactos setoriais e implicações sobre as estratégias empresariais. Monografia (Bacharelado em Ciências Econômicas) – Universidade Federal de Uberlândia, Uberlândia, 2022. RIBEIRO, M. B. Uma plataforma para integração de dados para cidades inteligentes. Dissertação (Mestrado em Ciências) – Universidade de São Paulo, São Paulo, 2023. SILVA, A. K. Counter-Strike: um jogo feito por pessoas e alavancado por sua comunidade. Trabalho de Conclusão de Curso (Bacharelado em Publicidade e Propaganda) – Centro Universitário da Serra Gaúcha, Caxias do Sul, 2022. SILVA, L. R. M. Organização e arquitetura de computadores: uma jornada do fundamental ao inovador. Freitas Bastos, 2023. SILVA, M. V. Conceitos de computação I. Senac São Paulo, 2020. SOUZA, L. V.; ZAFANELI, C. Informática na Docência: Possibilidade de Quebrar Paradigmas. Akrópolis – Revista de Ciências Humanas da UNIPAR, v. 12, n. 2, 2004. 19 TANENBAUM, A. S. Organização estruturada de computadores. 4. ed. Rio de Janeiro: LTC, 2001. _____. BOS, H. Sistemas operacionais modernos. Bookman,2024. VILLAÇA, M. V. M.; STEINBACH, R. Brevíssima história do computador e suas tecnologias parte i–do osso de lebombo aos computadores eletromecânicos. Revista Ilha Digital, v. 5, p. 3-24, 2014. WOILER, S. Computador: conceitos e aplicações. Revista de Administração de Empresas, v. 10, p. 141-156, 1970. ARQUITETURA DE COMPUTADORES AULA 2 Prof. André Roberto Guerra 2 CONVERSA INICIAL Nesta etapa, abordaremos os componentes elementares que formam a base dos sistemas computacionais. Ter uma compreensão clara destes componentes é essencial para avançarmos em estudos mais detalhados e específicos. Os principais componentes que serão discutidos já foram apresentados anteriormente, e neste momento aprofundaremos essa discussão. TEMA 1 – VISÃO GERAL DOS COMPONENTES ELEMENTARES DOS COMPUTADORES Neste tópico, serão apresentados e discutidos os três principais componentes elementares dos computadores, considerando aspectos correlatos. Para isso, é necessário observamos a Figura 1, que destaca esses componentes de forma mais detalhada. Figura 1 – Três principais componentes elementares dos computadores Fonte: Castilho; Silva; Weingaertner, 2023. Entende-se que esses componentes exercem papéis centrais na execução de computadores, com finalidades e características que lhes distinguem e, ao mesmo tempo os aproximam. Essas características serão apresentadas ao longo desta etapa. Processadores (CPU – Unidade Central de Processamento) Memórias Dispositivos de entrada e saída 3 1.1 Processadores (CPU – unidade central de processamento) 1.1.1 Definição e função O processador, ou a Unidade Central de Processamento (CPU), é o cérebro do computador. É considerado o responsável por executar instruções e processar dados. A CPU realiza operações aritméticas, lógicas, de controle e de entrada/saída, seguindo as instruções de um programa armazenado na memória do sistema (Castilho; Silva; Weingaertner, 2023). A CPU é composta por diversas partes essenciais, cada uma com um papel crítico no processamento de dados. Figura 2 – Estrutura da CPU Fonte: Castilho; Silva; Weingaertner, 2023; Kowaltowski, 1996. Para melhor compreensão, é significativo sinalizar que a Unidade de Controle (UC) é responsável por gerenciar e coordenar todas as operações dentro da CPU. Além disso, busca as instruções da memória, decodifica essas instruções para determinar quais operações precisam ser realizadas e, em seguida, coordena a execução dessas operações pela Unidade Lógica e Aritmética (ULA) ou outras partes da CPU (Kowaltowski, 1996; Castilho; Silva; Weingaertner, 2023). A ULA executa as operações aritméticas (como adição e subtração) e lógicas (como AND, OR e NOT), aspectos cruciais para a manipulação de dados numéricos e lógicos dentro do computador. Em relação a registradores, caracterizam-se como pequenas unidades de armazenamento de alta velocidade dentro da CPU que armazenam dados temporários e instruções durante o processamento (Kowaltowski, 1996; Castilho; Silva; Weingaertner, 2023). Unidade de Controle (UC) Unidade Lógica e Aritmética (ULA) Registradores Cache 4 Por exemplo: incluem o contador de programa (que mantém o controle da próxima instrução a ser executada) e o acumulador (que armazena os resultados intermediários de operações aritméticas e lógicas). Quanto ao cache, é necessário ressaltar que se trata de uma memória de alta velocidade localizada próxima à CPU, usada para armazenar dados e instruções frequentemente acessados. De modo mais específico, o cache melhora a eficiência da CPU reduzindo o tempo de acesso à memória principal (Kowaltowski, 1996; Castilho; Silva; Weingaertner, 2023). Segundo Carro e Wagner (2003) e Jordan (2015), o funcionamento da CPU pode ser descrito por meio do ciclo de instrução, que é dividido em várias etapas: Tabela 1 – Funcionamento da CPU Busca (fetch) A UC busca a próxima instrução a ser executada na memória, utilizando o contador de programa para determinar seu endereço. Decodificação (decode) A instrução buscada é decodificada pela UC para determinar qual operação deve ser realizada e quais operandos são necessários. Execução (execute) A operação especificada pela instrução é executada. Se a instrução for uma operação aritmética ou lógica, a ULA realiza a operação. Se a instrução envolve transferência de dados, a UC coordena a movimentação dos dados entre registradores e memória. Escrita (write back) O resultado da operação é escrito de volta na memória ou em um registrador, conforme especificado pela instrução. Fonte: Carro; Wagner, 2003; Jordan. 2015. Desse modo, esse conjunto de etapas é fundamental para o funcionamento da CPU, uma vez que são coordenadas para executar instruções e processar dados de maneira eficiente. Além desses passos para o funcionamento da CPU, também é necessário observar e compreender que existem vários tipos de processadores, cada um otimizado para diferentes tipos de tarefas e cargas de trabalho. Observemos o Quadro 1: 5 Quadro 1 – Tipos de processadores Processadores de Uso Geral (GPUs) CPUs tradicionais são projetadas para executar uma ampla variedade de tarefas de computação geral, desde aplicações de escritório até jogos e navegação na web. Processadores Gráficos (GPUs) GPUs são projetadas especificamente para renderização de gráficos e computação paralela intensiva. Possuem centenas ou milhares de núcleos menores que podem executar operações simultaneamente, tornando-as ideais para tarefas como processamento gráfico, aprendizado de máquina e simulações científicas. Processadores de Aplicação Específica (ASICs) ASICs são projetados para executar uma tarefa específica de forma extremamente eficiente. Podemos citar como exemplos de processadores usados em dispositivos de rede, smartphones e equipamentos de mineração de criptomoedas. Processadores Multi-Core CPUs modernas geralmente possuem múltiplos núcleos de processamento em um único chip, permitindo a execução simultânea de múltiplos threads e aprimorando significativamente a performance para aplicações multitarefa. Fonte: Gomes, 2012; Souto, 2018. Com base no Quadro 1, pode-se dizer que os processadores são cruciais na computação moderna, cada um com sua importância específica. A junção desses processadores constitui a base da computação moderna, cada um aprimorando a eficiência e o desempenho em diferentes áreas de aplicação. Na concepção de Lima e Moreira (2014) e Silva (2023), ao estudar os tipos de processadores de forma voluntária ou não, nos remetemos aos avanços na tecnologia. A tecnologia de processadores tem evoluído rapidamente, impulsionada por avanços na fabricação de semicondutores e novas arquiteturas de design. Há avanços notáveis que merecem destaque, como: Tabela 2 – Avanços na tecnologia de processadores Miniaturização A contínua redução no tamanho dos transistores (conhecida como Lei de Moore) permite a criação de processadores mais potentes e eficientes em termos de energia. Hiperthreading Tecnologia que permite a execução de múltiplos threads de instruções em um único núcleo, melhorando a utilização da CPU e o desempenho geral do sistema. Arquiteturas híbridas Processadores modernos frequentemente combinam núcleos de alto desempenho com núcleos de alta eficiência, permitindo um balanceamento dinâmico entre desempenho e consumo de energia, como visto nas arquiteturas big.LITTLE. Computação quântica Embora ainda em estágio experimental, a computação quântica promete revolucionar a computação ao realizar operações em escala quântica, possibilitando a solução de problemas complexos intratáveis para os processadores clássicos. Fonte: Lima; Moreira,2014; Silva, 2023. 6 Desse modo, a CPU é um componente vital de qualquer sistema de computação, com papel central na execução de instruções e no processamento de dados. Com uma estrutura composta por unidade de controle, unidade lógica e aritmética, registradores e cache, a CPU realiza operações complexas de maneira eficiente (Silva, 2023). Os contínuos avanços na tecnologia de processadores impulsionam o desempenho e a capacidade dos sistemas computacionais, abrindo caminho para novas aplicações e inovações no campo da computação. TEMA 2 – CONTEXTUALIZANDO SISTEMAS COMPUTACIONAIS: BREVES CONSIDERAÇÕES SOBRE INTERCONEXÃO Vimos até aqui que a estrutura dos sistemas computacionais é formada por três componentes elementares: CPU, memórias (principal e secundária) e dispositivos de entrada e saída (E/S); esses sistemas são descritos por Tanenbaum (2001) como um conjunto interconectado que trabalha harmoniosamente para processar dados e executar instruções. Com o objetivo de corroborar com a discussão, destacamos a Figura 3, que apresenta a organização de um computador simples com uma CPU e dois dispositivos de E/S. Figura 3 – Organização de um computador simples com uma CPU e dois dispositivos de E/S Fonte: Tanenbaum, 2001. 7 A Figura 3 nos fornece uma visão clara e concisa da organização básica de um computador simples. Além disso, esse diagrama ajuda a ilustrar como os componentes – CPU, dispositivos de E/S e o barramento – interagem para realizar tarefas computacionais. Essa organização básica é o ponto de partida para a compreensão de sistemas mais complexos. Segundo Carro e Wagner (2023), um dos conceitos fundamentais em sistemas computacionais é o sistema de interconexão, ou barramento. O barramento se configura como uma via de comunicação que conecta todos os componentes do sistema – CPU, memória e dispositivos de E/S. Além disso, permite a transferência de dados, sinais de controle e endereços entre esses componentes, garantindo que possam operar de maneira coordenada. Há diferentes tipos de barramento, como barramentos de dados, barramentos de endereço e barramentos de controle, cada um com papel específico na comunicação interna do sistema. O barramento é importante porque determina a velocidade e a eficiência com que os componentes podem se comunicar. Cabe destacar que um barramento eficiente pode aprimorar o desempenho do sistema, permitindo que a CPU acesse rapidamente a memória e os dispositivos de E/S, e vice-versa (Carro; Wagner, 2003; Silva, 2023). Com o avanço da tecnologia, surgiram barramentos mais rápidos e eficientes, como os barramentos PCI Express (PCIe), que aumentam a largura de banda disponível para a comunicação entre os componentes. Os barramentos PCIe são uma grande evolução na interconexão de componentes em sistemas computacionais modernos; introduzidos para substituir os antigos barramentos Peripheral Component Interconnect (PCI), Peripheral Component Interconnect eXtended (PCI-X) e Accelerated Graphics Port (AGP), o PCIe oferece uma série de melhorias significativas em termos de velocidade, flexibilidade e eficiência, tornando-se uma referência para a comunicação interna em computadores (Carro; Wagner, 2003; Silva, 2023). À medida que as demandas por maior desempenho e eficiência continuam a crescer, o PCIe permanecerá um componente essencial na arquitetura de sistemas computacionais modernos. 8 TEMA 3 – INTRODUÇÃO ÀS ARQUITETURAS REDUCED INSTRUCTION SET COMPUTER (RISC), COMPLEX INSTRUCTION SET COMPUTER (CISC) E VERY LONG INSTRUCTION WORD (VLIW) No amplo cenário da arquitetura de computadores, diferentes abordagens foram desenvolvidas para otimizar o desempenho, a eficiência e a complexidade dos processadores. Três das arquiteturas mais influentes e discutidas são a Reduced Instruction Set Computer (RISC), a Complex Instruction Set Computer (CISC) e a Very Long Instruction Word (VLIW). Cada uma dessas arquiteturas apresenta uma filosofia única de design, visando atender a diferentes necessidades e desafios computacionais (Tanenbaum, 2001; Hepola; Multanen; Jääskeläinen, 2022). Segundo Vardhan, Israel e Basiri (2023), a arquitetura RISC foi idealizada com o objetivo de simplificar as instruções executadas pela CPU, permitindo que cada instrução seja executada rapidamente e com maior eficiência. A filosofia RISC fundamenta-se na utilização de um conjunto reduzido de instruções, com tamanhos uniformes e comumente executadas em um único ciclo de clock. Essa abordagem simplificada facilita a implementação de pipelines, permitindo que múltiplas instruções sejam executadas simultaneamente em diferentes estágios, aumentando assim o throughput do processador. A RISC é particularmente vantajosa em aplicações que requerem alta velocidade e eficiência, como dispositivos embarcados e sistemas de tempo real. A arquitetura CISC, por sua vez, adota uma abordagem mais complexa, com um conjunto de instruções extenso e variado. As instruções CISC podem executar operações sofisticadas e multifacetadas com uma única instrução, o que pode reduzir a quantidade de código necessária para realizar tarefas complexas. Embora as instruções CISC possam ser mais “lentas” para executar, elas são projetadas para minimizar a necessidade de instruções adicionais, potencialmente simplificando a programação e aprimorando a compatibilidade com softwares mais antigos. Tradicionalmente, a CISC tem sido aproveitada em computadores pessoais e servidores, nos quais a flexibilidade e a compatibilidade com uma ampla gama de aplicativos são cruciais (Tanenbaum, 2001; Vardhan; Israel; Basiri, 2023). Para compreendermos melhor essas distinções entre a arquitetura RISC e CISC, observe a Tabela 1 9 Tabela 1 – Comparativo entre a RISC e a CISC RISC CISC Múltiplos conjuntos de registradores, muitas vezes superando 256 Único conjunto de registradores, tipicamente entre 6 e 16 registradores Três operandos de registradores permitidos por instrução (ex.: add R1, R2, R3) Um ou dois operandos de registradores permitidos por instrução (ex.: add R1, R2) Passagem eficiente de parâmetros por registradores no chip (processador) Passagem de parâmetros ineficiente através da memória Instruções de um único ciclo (ex.: load e store) Instruções de múltiplos ciclos Controle hardwired (embutido no hardware) Controle microprogramado Altamente paralelizado (pipelined) Fracamente paralelizado Instruções simples e em número reduzido Muitas instruções complexas Instruções de tamanho fixo Instruções de tamanho variável Complexidade no compilador Complexidade no código Apenas instruções load e store podem acessar a memória Muitas instruções podem acessar a memória Poucos modos de endereçamento Muitos modos de endereçamento No que concerne à arquitetura VLIW, é significativo dizer que ela representa uma abordagem inovadora que visa maximizar o paralelismo no nível de instrução. Em vez de depender de instruções individuais, a VLIW utiliza palavras de instrução longas que contêm múltiplas operações, todas executadas simultaneamente. Essa abordagem permite que o compilador organize as operações de forma otimizada, reduzindo a complexidade do hardware necessário para detectar e gerenciar o paralelismo em tempo de execução (Tanenbaum, 2001; Vardhan; Israel; Basiri, 2023). A arquitetura VLIW é especialmente eficaz em aplicações que podem se beneficiar de um alto grau de paralelismo, como processamento multimídia e computação científica. Em termos gerais, as arquiteturas RISC, CISC e VLIW representam diferentes estratégias para abordar os desafios da eficiência e desempenho em processadores. Compreender suas especificidades e funções é essencial para conhecer as abordagens adotadas na evolução dos processadores e na busca por soluções que possam atenderàs necessidades crescentes do mundo computacional moderno. TEMA 4 – A IMPORTÂNCIA DA MEMÓRIA NO FUNCIONAMENTO DOS COMPUTADORES DIGITAIS A memória é um componente essencial dos computadores, responsável por armazenar programas e dados. Sem a capacidade de leitura e escrita de informações pela CPU, um computador digital não funcionaria, pois os programas 10 não poderiam ser armazenados (Tanenbaum, 2001; Silva, 2023). O dilema entre velocidade e capacidade é um desafio econômico, não tecnológico, influenciando o design e a hierarquia das memórias. Para efeito de melhor compreensão da abordagem, a Figura 4 mostra a hierarquia de memória. Figura 4 – Hierarquias de memória Fonte: Tanenbaum, 2001. De acordo com Tanenbaum (2001) e Silva (2023), a memória primária, ou memória principal (MP) é onde os programas em execução e os dados que utilizam são armazenados. A CPU processa as instruções obtidas da MP, e os resultados são retransmitidos a ela. A unidade básica de memória é o bit, que pode assumir valores binários (0 ou 1), sendo fisicamente mais simples de distinguir. A memória é constituída por células, cada uma armazenando uma informação específica. Cada célula possui um endereço que a identifica, formando a base pela qual os programas referenciam dados na memória. Nos computadores modernos, as células são agrupadas em palavras, que representam a menor unidade de dados que pode ser transferida para ou da MP. Por exemplo: uma palavra de 32 bits contém 4 bytes (ou 4 células). As instruções e dados são organizados em palavras, refletindo a arquitetura do processador, como nos processadores de 32 bits, nos quais tanto as palavras quanto os registradores têm 32 bits (Tanenbaum, 2001; Silva, 2023). Conforme Tanenbaum (2001) e Silva (2023), a memória pode ser classificada de diversas maneiras. A memória volátil, como a Random Access Memory (RAM), perde seus dados quando a energia é desligada. Em contraste, a 11 memória não volátil retém os dados mesmo sem energia. Memórias endereçadas sequencialmente, como fitas magnéticas, requerem a leitura dos endereços anteriores para acessar uma célula específica. Já a RAM permite acesso aleatório, com tempo de acesso uniforme para todas as células. Quanto aos registradores, Tanenbaum (2001) e Silva (2023) afirmam que os registradores usados para endereçar a memória têm tamanho correspondente ao barramento de endereços, igual ao tamanho da palavra. A memória cache é uma memória pequena e rápida que armazena os dados e instruções mais recentemente acessados pela CPU. Quando a CPU precisa de uma palavra, primeiro a busca na cache; caso não seja encontrada, a busca se estende à memória principal. A cache efetiva reduz significativamente o tempo médio de acesso à memória, com múltiplos níveis de cache possíveis, como cache de nível 1 no chip e cache de nível 2 no barramento. A Figura 5 aponta para esses argumentos de forma mais especificada. Figura 5 – Localização da memória cache Fonte: Tanenbaum, 2001. Quanto à memória secundária, Tanenbaum (2001) e Silva (2023) dizem que a memória principal possui capacidade limitada, sendo complementada pela memória secundária, que não é endereçada diretamente pela CPU. Dados na memória secundária são transferidos para a memória principal antes de serem executados pela CPU, uma necessidade devido à volatilidade da MP. A memória secundária, geralmente não volátil, garante armazenamento permanente de dados, permitindo que programas e arquivos sejam acessados novamente após desligamentos do sistema. Entre os tipos de memória secundária destacam-se discos rígidos (HDs), memórias flash, discos de estado sólido (SSD) e discos ópticos. Sistemas 12 operacionais modernos utilizam a memória secundária para expandir a capacidade da memória principal por meio da memória virtual. Além do que foi apresentado, também merece destaque a localização da memória cache, como bem demonstra a Figura 5, enfatizando sua função intermediária crucial entre a CPU e a memória principal. TEMA 5 – O PAPEL DA ENTRADA E SAÍDA (I/O) NA COMUNICAÇÃO COMPUTACIONAL A entrada e saída, comumente referida como I/O (Input/Output), é crucial na comunicação entre o computador e o meio externo. Essa comunicação ocorre por meio da transferência de dados externos para o computador (entrada) e da transferência dos resultados do processamento de dados para o usuário (saída). A I/O é essencial para a interação com o usuário, permitindo que a representação interna dos dados, processada em sinais eletrônicos dentro do computador, seja convertida em uma forma compreensível para as pessoas, e vice-versa (Silva, 2023). Diversos dispositivos são utilizados nesse processo, especialmente os periféricos, que mediam a entrada e saída de dados. Entre as características distintivas das operações de I/O estão a variabilidade na velocidade de transferência, a natureza assíncrona das atividades de I/O, a incerteza na qualidade dos dados transferidos e a possibilidade de interrupções nas transferências (Silva, 2023). Os barramentos são fundamentais para a comunicação entre os componentes do sistema computacional, interconectando os elementos básicos do computador. Eles permitem a transferência direta de dados entre dispositivos de I/O e a memória através de controladores especiais, como os Controladores de Direct Memory Access (DMA) (ou “acesso direto à memória”). Esses controladores assumem temporariamente o controle do barramento, isolando a comunicação entre a CPU, a memória e os dispositivos de I/O, o que permite uma transferência eficiente e sem interrupções significativas (Silva, 2023). Essa arquitetura garante que os dados possam ser movidos de maneira eficaz entre os diferentes componentes do sistema, mantendo a integridade e a velocidade necessárias para um desempenho computacional otimizado (Figura 6). 13 Figura 6 – Estrutura lógica/barramento Fonte: Tanenbaum, 2001. Os barramentos em um sistema computacional podem ser categorizados com base na direção de condução dos sinais. Podem ser unidirecionais, conduzindo sinais em uma única direção, ou bidirecionais, permitindo a condução em ambas as direções, conforme comandos eletrônicos. Além disso, existem barramentos de três estados, que são bidirecionais com a capacidade adicional de desconexão elétrica controlada. Essa desconexão eletrônica facilita a comunicação seletiva entre dispositivos, possibilitando, por exemplo, que a CPU se conecte à memória e se desconecte dos dispositivos de entrada/saída (E/S) (Tanenbaum, 2001). A arquitetura de barramentos é fundamental para a organização interna de um computador, e diferentes tipos de barramentos têm papéis específicos: Figura 7 – Tipos de barramentos Fonte: Guerra, 2024. Barramento de dados Responsável pela transferência de dados e instruções entre os dispositivos. Esse barramento é de três estados entre a memória e a CPU, e unidirecional com a capacidade de desconexão elétrica nos dispositivos E/S. Barramento de endereços Conduz o endereço que deve ser selecionado na memória ou nos dispositivos de E/S. Geralmente é unidirecional, indo da CPU (que define o endereço) para a memória e os dispositivos E/S. Barramento de controle Transfere sinais de controle que ativam ou desativam dispositivos, selecionam modos de operação específicos, ou sincronizam circuitos. 14 Diferentes padrões de barramento foram desenvolvidos ao longo do tempo, cada um com suas próprias características: Tabela 2 – Características dos padrões de barramento em sistemas computacionais ISA (Industry Standard Architecture) Um padrão pioneiro da IBM que facilitou a integração de dispositivos diversos. EISA (Extended ISA) Uma extensão do ISA com múltiplas conexões para maior versatilidade. PCI (PeripheralComponent Interconnect) Desenvolvido pela Intel, esse padrão tornou-se amplamente utilizado devido à sua natureza de domínio público, facilitando a interconexão de componentes periféricos. PCIe (PCI Express) O sucessor do PCI, oferece maior velocidade e eficiência. Diferente dos barramentos tradicionais, o PCIe utiliza conexões diretas e linhas de bits seriais para comunicação. Esses diferentes tipos de barramentos e padrões são essenciais na eficiência e eficácia da comunicação interna em sistemas computacionais, permitindo a transferência e controle de dados entre a CPU, memória e dispositivos periféricos (Tanenbaum, 2001). A Figura 8 traz um exemplo de arquitetura de barramento, considerando aspectos fundamentais desse universo. Figura 8 – Exemplo de arquitetura de barramento Fonte: Tanenbaum, 2001. 15 A arquitetura de barramento apresentada destaca a importância da coordenação entre esses elementos para garantir que dados e instruções sejam transmitidos corretamente e de maneira sincronizada. FINALIZANDO Nesta etapa, abordamos temas essenciais para a compreensão da arquitetura de computadores. Inicialmente, nos debruçamos sobre uma visão geral dos componentes elementares dos computadores, destacando a importância da CPU, memória e dispositivos de entrada/saída (E/S) no funcionamento básico do sistema. Partimos, então, para uma contextualização a respeito dos sistemas computacionais, com ênfase nas interconexões entre esses componentes por meio de barramentos, que facilitam a comunicação interna e a transferência de dados. Além disso, tratamos das arquiteturas RISC, CISC e VLIW, entendendo que cada dessas arquiteturas possui características distintas que influenciam o desempenho, a complexidade e a eficiência dos processadores, oferecendo diferentes abordagens para a execução de instruções e operações computacionais. Exploramos ainda a importância da memória no funcionamento dos computadores digitais e discutimos os diferentes tipos de memória (primária e secundária) e suas características, enfatizando como a memória afeta a velocidade e a capacidade de armazenamento e seu papel no processamento de dados e execução de programas. Por fim, abordamos o papel da entrada e saída (I/O) na comunicação computacional e como os dispositivos de I/O permitem a interação entre o usuário e o computador, possibilitando a transferência de dados externos para o sistema e vice-versa, essencial para a funcionalidade prática dos sistemas computacionais. 16 REFERÊNCIAS CARRO, L.; WAGNER, F. R. Sistemas computacionais embarcados. Jornadas de atualização em informática. Campinas: UNICAMP, 2003. CASTILHO, M. A.; SILVA, F.; WEINGAERTNER, D. Uma possível abordagem para o ensino introdutório de algoritmos em cursos de Computação. III SIMPÓSIO BRASILEIRO DE EDUCAÇÃO EM COMPUTAÇÃO. Anais..., SBC, p. 376-385. 2023. GOMES, V. C. F. Fast Poisson solver para sistema híbrido reconfigurável. Dissertação (Mestrado em Computação Aplicada) – Instituto Nacional de Pesquisas Espaciais, São José dos Campos, 2012. HEPOLA, K.; MULTANEN, J.; JÄÄSKELÄINEN, P. Dual-IS: Instruction set modality for efficient instruction level parallelism. In: International Conference on Architecture of Computing Systems. Cham: Springer International Publishing, p. 17-32. 2022. JORDAN, M. G. Estudo do impacto da implementação de um escalonador em uma arquitetura multiprocessada com núcleos heterogêneos. Trabalho de Conclusão de Curso (Graduação em Engenharia de Computação) – Universidade Federal de Santa Maria, Santa Maria, 2015. KOWALTOWSKI, T. Von Neumann: suas contribuições à computação. Estudos Avançados, v. 10, p. 237-260, 1996. LIMA, B. R.; MOREIRA, E. T. Análise da adequação de softwares de benchmark para mensuração de desempenho de microcomputadores. Trabalho de Conclusão de Curso (Licenciatura em Computação) – Universidade de Brasília, Brasília, 2014. SILVA, L. R. M. Organização e arquitetura de computadores: uma jornada do fundamental ao inovador. Rio de Janeiro: Freitas Bastos, 2023. SOUTO, T. D. Predição de performance em ambientes multi-core com aceleradores compartilhados. Dissertação (Mestrado em Ciência da Computação) – Universidade Federal do Rio Grande do Sul, Porto Alegre, 2018. TANENBAUM, A. S. Organização estruturada de computadores. 4. ed. Rio de Janeiro: LTC, 2001. 17 VARDHAN, C. S.; ISRAEL, G. J.; BASIRI, M. Mohamed Asan. High Performance Data Level Parallelism based Instruction Set Architecture in RISC-V. In: 2023 IEEE 7th Conference on Information and Communication Technology (CICT). IEEE, p. 1-6. 2023. ARQUITETURA DE COMPUTADORES AULA 3 Prof. André Roberto Guerra 2 CONVERSA INICIAL Nesta abordagem, mergulharemos no mundo da lógica digital, também conhecida como lógica dos circuitos ou lógica de Boole (ou booleana). A lógica digital é fundamental para entendermos o funcionamento interno dos computadores, desde as operações básicas até as estruturas mais complexas. Nosso objetivo é desvendar os princípios que governam os circuitos digitais e como são utilizados para realizar operações lógicas essenciais no processamento de dados. Os tópicos que iremos abordar estão expostos na Figura 1. Figura 1 – Caminho teórico de nossas abordagens Prepare-se para um estudo repleto de informações significativas para seu processo formativo com exemplos práticos. A compreensão desses conceitos é essencial para avançarmos em nosso estudo e para nos tornarmos proficientes na criação e análise de circuitos digitais. TEMA 1 – ÁLGEBRA DE BOOLE A álgebra de Boole é utilizada no projeto de circuitos lógicos e é baseada nos princípios da lógica formal, uma área de estudo da filosofia. Foi criada pelo matemático britânico George Simon Boole (1815-1864), razão pela qual leva seu Definições da álgebra de Boole: vamos começar entendendo os conceitos básicos e a importância da álgebra de Boole na lógica digital. Esse conhecimento é crucial, pois serve de base para todas as operações e circuitos que estudaremos. Funções: exploraremos as diferentes funções booleanas, como elas são representadas e utilizadas para expressar operações lógicas. Veremos exemplos práticos para solidificar nosso entendimento. Operadores e operações: discutiremos os principais operadores booleanos (AND, OR, NOT, XOR etc.) e como eles se combinam para realizar operações lógicas. Compreenderemos a lógica por trás de cada operação e como elas são aplicadas nos circuitos. Portas: finalmente, aprenderemos sobre as portas lógicas, que são os blocos construtivos fundamentais dos circuitos digitais. Veremos como cada tipo de porta funciona, suas representações e suas aplicações práticas. 3 nome. Seu teorema é definido sobre um conjunto de dois elementos: (0, 1); (baixo, alto); (falso, verdadeiro). Boole descobriu que poderia usar um conjunto de símbolos matemáticos para representar certas afirmativas da lógica formal, sem atribuir a esses símbolos um significado numérico. Publicou suas descobertas em 1854, no trabalho Uma análise matemática da lógica. Em 1938, Claude E. Shannon (1916- 2001) demonstrou que o trabalho de Boole poderia ser usado para descrever a operação de sistemas de comutação telefônica (Muniz Junior, 2021; Guerra, 2023). Figura 2 – Operação de sistemas de comutação telefônica Fonte: Guerra, 2023. A álgebra de Boole utiliza variáveis booleanas, que podem assumir apenas dois valores: 0 (falso) e 1 (verdadeiro). As operações fundamentais da álgebra de Boole incluem: AND, OR, NOT, XOR etc. (Figura 3). Figura 3 – Operações fundamentais da álgebra de Boole Fonte: Elaborado com base em Silva, 2020. AND (E): uma operação binária que resulta em 1 se ambos os operandos forem 1, e 0, caso contrário. OR (OU): uma operaçãobinária que resulta em 1 se pelo menos um dos operandos for 1, e 0 se ambos os operandos forem 0. NOT (NÃO): uma operação unária que inverte o valor do operando, transformando 0 em 1 e 1 em 0. XOR (OU exclusivo): uma operação binária que resulta em 1 se os operandos forem diferentes, e 0 se forem iguais. 4 Essas operações permitem a construção de expressões booleanas complexas que podem representar qualquer função lógica. É válido destacar que, inicialmente, o trabalho de Boole não recebeu ampla aceitação, pois era considerado abstrato e desvinculado das aplicações práticas da época. No entanto, no século XX, suas ideias ganharam relevância com o desenvolvimento da eletrônica digital e dos computadores (Muniz Junior, 2021; Guerra, 2023). Claude Shannon, em seu trabalho pioneiro A Symbolic Analysis of Relay and Switching Circuits, de 1937, demonstrou como a álgebra de Boole podia ser aplicada ao projeto de circuitos eletrônicos (Muniz Junior, 2021; Guerra, 2023). Sua contribuição foi fundamental, sobretudo porque mostrou que os princípios de Boole podiam ser usados para simplificar e analisar circuitos de relés, que são os precursores dos circuitos digitais modernos (Muniz Junior, 2021; Guerra, 2023). Essa aplicação prática consolidou a álgebra de Boole como uma ferramenta fundamental na engenharia elétrica e na ciência da computação. O Quadro 1 apresenta alguns pensadores fundamentais sobre a álgebra de Boole que ajudaram a contribuir na ampliação desse universo. Quadro 1 – Pensadores fundamentais sobre a álgebra de Boole George Boole Figura central na criação da álgebra de Boole. Seu trabalho estabeleceu as bases teóricas para o estudo da lógica por meio de métodos matemáticos. A inovação de Boole foi perceber que operações lógicas podiam ser tratadas de maneira algébrica, possibilitando a criação de um sistema lógico-matemático robusto. Augustus De Morgan Contemporâneo de Boole, De Morgan fez contribuições significativas para a lógica e a teoria dos conjuntos. Conhecido por formular as Leis de De Morgan, que são fundamentais na simplificação de expressões booleanas e têm aplicações diretas na álgebra de Boole. Claude Shannon Engenheiro eletricista e matemático, foi o responsável por trazer a álgebra de Boole para o domínio da engenharia elétrica. Seu trabalho demonstrou a utilidade prática das ideias de Boole no projeto e análise de circuitos eletrônicos. Shannon é frequentemente considerado o “pai da teoria da informação”, e seu trabalho ajudou a pavimentar o caminho para a revolução digital. Alan Turing Embora não diretamente associado à álgebra de Boole, Alan Turing também merece menção por suas contribuições à lógica e à computação. Turing desenvolveu conceitos fundamentais sobre computabilidade e máquinas abstratas (Máquinas de Turing), que são profundamente influenciados pela lógica matemática, incluindo princípios da álgebra de Boole. Fonte: Elaborado com base em Cáceres Nieto, 2023. 5 Em síntese, a Álgebra de Boole, iniciada por George Boole e desenvolvida por pensadores como Augustus De Morgan e Claude Shannon, formou a base para a lógica digital e a computação moderna. Essa área de estudo transformou a forma como entendemos e aplicamos a lógica em sistemas eletrônicos, destacando-se como uma das contribuições mais importantes à matemática e à ciência da computação do século XIX ao século XX (Muniz Junior, 2021; Guerra, 2023). Compreender o contexto histórico e os pensadores que moldaram a álgebra de Boole é crucial para compreender sua importância e seu impacto. TEMA 2 – LÓGICA DIGITAL: FUNÇÕES A lógica digital é a base dos sistemas eletrônicos modernos, desde simples circuitos até complexos computadores. As funções da lógica digital, que utilizam operações booleanas, são cruciais para o funcionamento desses sistemas. Além disso, as funções da lógica digital permitem a implementação de operações aritméticas, controle de processos, tomada de decisões e armazenamento de dados (Guerra, 2023). De acordo com Guerra (2023), uma ou mais variáveis e operadores podem ser combinados formando uma função lógica (Figura 4). Figura 4 – Função lógica Fonte: Guerra, 2023. Ao contrário da álgebra ordinária na matemática clássica, em que as variáveis podem ter qualquer valor dentro do intervalo de -∞ a +∞, as variáveis booleanas só podem ter dois valores: 0 e 1. Como o número de valores que cada variável pode assumir é finito e pequeno, o número de estados que uma função booleana pode assumir também é finito, o que significa que essas funções podem ser completamente descritas utilizando-se uma tabela que lista todas as combinações de valores que as variáveis de entrada e os correspondentes da função (saídas) podem assumir (Guerra, 2023). 6 De modo semelhante à lógica dos predicados, os resultados de uma função lógica digital podem ser expressos pela tabela-verdade, que relaciona os resultados (saída) de uma função lógica para todas as combinações possíveis de suas variáveis (entrada). Tabela A – Tabela-verdade da função Z = f(A, B) = A + B (Guerra, 2023). Tabela 1 – Tabela-verdade da função Z = f(A, B) = A + B A B A + B 0 0 0 0 1 1 1 0 1 1 1 1 Fonte: Guerra, 2023. Nessa tabela-verdade, a função lógica Z apresenta duas variáveis, A e B, sendo Z = f(A B) = A+B. Dada a equação que descreve uma função booleana qualquer, deseja-se saber detalhadamente como essa função se comporta para qualquer combinação das variáveis de entrada. O comportamento de uma função é descrito pela sua tabela-verdade, e esse problema é conhecido como avaliação da função ou da expressão que descreve a função considerada. Em suma, deseja-se achar a tabela-verdade para a função booleana (Guerra, 2023). Uma tabela-verdade consiste, basicamente, em um conjunto de colunas nas quais são listadas todas as combinações possíveis entre as variáveis de entrada (à esquerda) e o resultado da função (à direita). Também é possível criar colunas intermediárias para listar os resultados de subexpressões contidas na expressão principal. Isso normalmente facilita a avaliação, principalmente no caso de equações muito complexas e/ou que contenham muitas variáveis (Guerra, 2023). Quando aparecem operações E e OU em uma mesma equação booleana, é necessário seguir a ordem de precedência, como ocorre na lógica proposicional. Por exemplo, expressões que utilizam parênteses têm precedência sobre operadores E e OU que estejam no mesmo nível. O número de combinações que as variáveis de entrada podem assumir pode ser calculado por 2n, em que n é o número de variáveis de entrada (Guerra, 2023). A Figura 5 apresenta o procedimento para a criação da tabela-verdade com base em uma equação booleana. 7 Figura 5 – Procedimento para a criação da tabela-verdade Fonte: Elaborado com base em Guerra, 2023. Dada a função fW - X + Y · Z, a variável W representa a função booleana propriamente dita. Essa variável depende das variáveis que estão à direita do sinal =, ou seja, depende de X, Y, Z. Logo, as variáveis de entrada são 3. O total de combinações entre 3 variáveis será 22 = 8. Então, a tabela-verdade para fW terá 3 colunas à esquerda e 8 linhas. Seguindo o procedimento apresentado, criamos uma coluna na qual são listados os valores para Z (Guerra, 2023). Em seguida, iniciamos a avaliação propriamente dita, partindo do nível mais interno de parênteses. Como não há parênteses na expressão, resolvemos as subexpressões que envolvem a operação Y · Z. Então, criamos uma coluna para Y · Z, na qual são anotados os resultados do produto. Finalmente, são utilizados os resultados de Y · Z listados na coluna anterior para operar X + Y · Z. O resultado é a tabela-verdade da Tabela 2, na sequência (Guerra, 2023). Tabela 2 – Tabela-verdade da função fW = X + Y · Z X Y Z Y · Z X + Y · Z 0 0 0 0 0 0 0 1 0