Prévia do material em texto
150 Unidade II Unidade II 5 O COMPUTADOR E SEUS DISPOSITIVOS DE ENTRADA E SAÍDA (E/S) 5.1 Principais características dos dispositivos de E/S Um sistema operacional moderno possui como principal função a de controlar todas as operações do hardware do computador, tablet, smarthphone etc., incluindo os modos de comunicação internos e externos. Para tal, usa drivers que operam e comandam os dispositivos de E/S. Entre os comandos que o sistema operacional dispõe para realizar esse controle, destacam‑se inicialização, interrupção e uso dos hardwares que constituem um computador. Observação O termo E/S (entrada/saída) é comumente aplicado na denotação de dispositivos periféricos, ou seja, que se encontram instalados fora da placa‑mãe do computador. Esse termo também é usado para referenciar a capacidade de o computador se comunicar com todos os seus dispositivos, tanto na “entrada”, recebendo dados/instruções, assim como na “saída” desses mesmos dados/instruções. Todos os dispositivos de hardware do computador têm módulos de comunicação de entrada e saída com o sistema operacional. Essa comunicação possui as seguintes funções: • controle e temporização; • comunicação com a CPU; • comunicação com todos os dispositivos de E/S; • armazenamento temporário dos dados (buffer); • detecção de erros. Durante sua operação, o processador deve interagir com um ou mais dispositivos externos em diferentes tipos de padrões de comunicação. Os recursos internos disponíveis à CPU, como a memória principal e o barramento do sistema, possuem a necessidade de compartilhar várias de suas atividades, o que também inclui dados oriundos de dispositivos de E/S. Dessa forma, deve haver controle e temporização (sincronismo) para que o fluxo de tráfego de dados seja coordenado entre os dispositivos. 151 ARQUITETURA DE COMPUTADORES MODERNOS Por exemplo, o controle da transferência dos dados armazenados em um dispositivo externo, para ser processado na CPU, pode envolver as seguintes etapas (STALLINGS, 2010): • A CPU pergunta ao módulo de E/S se o estado corresponde a “conectado”. • O módulo de E/S deverá retornar qual é o estado atual do dispositivo. • Se o dispositivo estiver no estado operacional (pronto para transmissão de dados), então a CPU solicita o início da transferência de dados através de comandos enviados ao módulo de E/S. • O módulo de E/S obtém uma unidade de dados de 8 ou 16 bits do dispositivo externo. • Os dados são transferidos do módulo de E/S para a CPU. Além dessas etapas, a comunicação entre os diversos dispositivos externos e a CPU abrange os seguintes aspectos: • Decodificação de comando: os módulos de E/S deverão aceitar os comandos da CPU que são enviados como sinais no barramento de controle. • Dados: deverão ser transferidos entre a CPU e o módulo de E/S através do barramento de dados. • Informação de estado: devido à baixa velocidade dos periféricos de E/S, é vital conhecer o estado atual do seu módulo. Por exemplo, se o módulo de E/S precisar enviar dados para a CPU para realizar a operação de leitura, ele pode não ser capaz de executar a operação, pois ainda estará trabalhando atendendo ao comando de E/S anterior. • Reconhecimento de endereço: da mesma forma que cada palavra contida na memória possui um certo endereço, cada dispositivo de E/S também o terá. Dessa maneira, um módulo de E/S deverá reconhecer um endereçamento exclusivo para cada dispositivo externo que ele controla. • Comunicação com o dispositivo: o módulo de E/S deverá ser capaz de executar a comunicação entre dispositivos, o que envolverá diversos sinais de controle, determinando a função que o dispositivo realizará, conforme mostra a figura a seguir: 152 Unidade II Sinais de controle do módulo de E/S Sinais de estado do módulo de E/S Bits de dados de e para o módulo de E/S Lógica de controle Buffer Transdutor Dados (device‑unique) de e para o ambiente Figura 132 – Diagrama de blocos representando um dispositivo externo e seus sinais de comunicação Fonte: Stallings (2010, p. 178). 5.2 Interfaces e dispositivos de E/S Os dispositivos de E/S possuem diferentes taxas de transmissão entre eles, conforme ilustrado na tabela a seguir. Basicamente, um dispositivo de E/S se comunica com o meio externo e com sua interface através do envio de bits e sinais de controle. Tabela 5 – Dispositivos de E/S e velocidade de transmissão de dados Dispositivo Taxa de transmissão em KB/s Teclado 0,01 Mouse 0,02 Impressora matricial 1 Modem 2 a 8 Disquete 100 Impressora a laser 200 Scanner 400 CD‑ROM 1.000 Rede local 500 a 6.000 Vídeo gráfico 6.000 Disco rígido 2.000 a 10.000 Adaptada de: Monteiro (2019, p. 341). 153 ARQUITETURA DE COMPUTADORES MODERNOS Basicamente, o processo de comunicação envolve o envio/recebimento de dados e sinais de controle das operações. Embora cada dispositivo possua características de funcionamento próprios, o fluxo de informações é o mesmo para todos. A figura a seguir mostra alguns dos principais componentes de uma interface de E/S, assim como os tipos de informação e o sentido direcional para o fluxo de dados transmitidos/recebidos (RX/TX) das conexões entre os periféricos. Barramento do sistema Dispositivo E/S Dados Sinais de controle Dados Lógica Controle Dados Endereço Registrador de endereço Registrador de dados Registrador de controle Figura 133 – Módulo de interface e conexão de E/S Fonte: Monteiro (2019, p. 342). Na figura anterior, também é possível observar três diferentes áreas que são constituídas por registradores, os quais têm a função de interação básica entre a interface de E/S e sua conexão com o barramento do sistema, além de controlar os registradores de dados e endereços. Na sequência, destaca‑se o espaço de armazenamento de dados que circulam entre os dispositivos pelo barramento durante as operações de E/S, fazendo com que a interface de E/S atue como um buffer para operar com diferentes velocidades em compatibilidade com os diferentes dispositivos. A terceira área é onde se localiza a lógica de funcionamento da interface, que permite a interação entre os dispositivos externos e a detecção de erros, entre outros. 5.3 Teclado Um dos principais dispositivos periféricos do computador para interação homem/máquina é o teclado. Ele possui como principal função a de facilitar a entrada de dados no computador. O funcionamento do teclado se baseia no reconhecimento de padrões decorrentes da interpretação do sinal elétrico de cada tecla ao ser pressionada pelos dedos do usuário. A figura a seguir mostra um exemplo típico. 154 Unidade II Figura 134 Disponível em: https://bit.ly/3iHVh8w. Acesso em: 17 jan. 2023. Existem basicamente três categorias de teclado em uso nos dispositivos atuais, que são: (MONTEIRO, 2019): • Teclado apenas numérico: usado geralmente em calculadoras de bolso ou mesa. • Teclado utilizado em sistemas dedicados: consistem em teclas aplicadas somente para entrada de dados referentes à tarefa para a qual o dispositivo foi projetado (sistemas embarcados), como equipamentos de ar‑condicionado, micro‑ondas, televisão, foguetes etc. • Teclado de uso geral: constituído por teclas alfabéticas, numéricas, sinais de pontuação, operações aritméticas, entre outras de uso especial. O teclado opera como uma chave liga‑desliga que, ao pressioná‑la, aciona‑se o interruptor da chave e, como consequência, o sinal elétrico naquele local será inserido pelos circuitos de controle. Abaixo das teclas do teclado, há um circuito impresso com diferentes dispositivos eletrônicos (capacitores, resistores, entre outros). A tecla capacitiva funciona baseada na variação de capacitância do acoplamento entre duas placas metálicas. Essa variação sempre ocorre quando uma tecla for pressionada. Dispositivos capacitivos como o teclado são, geralmente, de baixo custo e com tamanhos relativamente pequenos, além de possuírem tempo longo de vida, com cerca de 20 milhões de pressionamentos.Basicamente, um teclado de computador pode ser descrito, em termos de funcionamento, assim: 155 ARQUITETURA DE COMPUTADORES MODERNOS • Detecção do pressionamento de teclas: um processador de 8 bits, geralmente Intel 8048 ou 8049 interno ao teclado, realiza a varredura para a detecção das teclas pressionadas. • Debouncing de pressionamento: confirma se a tecla foi realmente pressionada, repetindo a varredura várias vezes. • Geração do código de identificação da tecla pressionada: criação de uma codificação de 8 bits baseada em linhas e colunas, denominada código de varredura ou scan code. • Geração de um sinal de interrupção: produzido a partir do pressionamento de uma tecla, fazendo com que a CPU tome providências em relação à identificação da tecla scaneada e seu valor decodificado pelo programa. • Troca de sinais de interrupção entre teclado e CPU: nessa operação, o código de varredura é transmitido para um endereço da memória principal, interpretado por um programa de E/S. Observação A BIOS (basic input output system) analisa o código recebido para verificar se uma tecla foi pressionada sozinha ou em conjunto com outra tecla, por exemplo, a tecla ALT, e aciona o código da tabela ASCII correspondente às teclas pressionadas na área de memória apropriada para assim reproduzir o resultado do acionamento das teclas. 5.4 Mouse O mouse (figura a seguir) é um dispositivo de entrada cujo propósito principal é o de facilitar o trabalho do usuário final em sua tarefa de comunicação com o computador. Seu nome deriva do seu formato pequeno e sua ligação com o computador por um fio (em mouses mais antigos) que se assemelha a uma cauda de rato, e seus movimentos agitados na mão também lembram esse pequeno animal. Diferentemente do teclado, em vez de o usuário ter que digitar comandos, ao utilizar o mouse somente é necessário o uso da coordenação motora para a movimentação. Ele trabalha basicamente como uma interligação visual do usuário com os sistemas de hardware e software do computador. Ele possui alguns tipos de sensores (de acordo com o modelo), como mecânicos, ópticos e ópticos‑mecânicos, para realizar a captação do movimento em uma superfície plana e transmitir as informações coletadas desses movimentos ou do acionamento de seus botões. Alguns programas fazem parte do funcionamento do mouse, como elementos de interface apontadores na tela, onde o usuário escolhe o que quer acionar e seleciona o item pressionando um dos dois botões. 156 Unidade II Figura 135 – Mouse óptico sem fio Disponível em: https://bit.ly/3WgBISv. Acesso em: 17 jan. 2023. O mouse mecânico possui uma esfera coberta com borracha que gira, acompanhando o movimento de sua rotação. Esse movimento da esfera é então transmitido a dois roletes perpendiculares que possuem rodas de contatos com o metal. Assim, conforme as rodas giram, os contatos tocam algumas escovas em seu interior. Já o mouse do tipo óptico‑mecânico tem o mesmo mecanismo de esfera e rolete em seu interior, com exceção dos roletes conectados a furos em sua carcaça, onde, conforme as rodas giram, elas podem bloquear ou permitir a passagem da luz produzida por um LED. Isso fará com que as transições entre essa passagem da luz sejam detectadas por sensores semicondutores sensíveis à luz. 5.5 Impressoras matriciais, jato de tinta e a laser As impressoras também são dispositivos básicos de saída de informações, e nela os dados internos do computador são convertidos em símbolos impressos em um meio, como o papel, por exemplo. Elas têm algumas caraterísticas básicas (MONTEIRO, 2019): • Volume de impressão que a impressora suporta por unidade de tempo: geralmente, elas possuem “vazão” de impressão e caracteres por segundo (cps), dados em linha por minuto (lpm) ou em páginas por minuto (ppm), de acordo com o tipo e modelo utilizado. • Tecnologia para impressão de símbolos: divididos em matricial, jato de tinta, laser e térmica (uso de cera aquecida ou sublimação de tinta). As impressoras de impacto, como as matriciais (figura a seguir), já foram muito populares no mercado. 157 ARQUITETURA DE COMPUTADORES MODERNOS Figura 136 – Impressora do tipo matricial Disponível em: https://bit.ly/3CQ8Cmb. Acesso em: 17 jan. 2023. O seu mecanismo de impressão está baseado em um dispositivo com um conjunto de martelos ou agulhas, utilizados para pressionar uma fita com tinta, imprimindo o símbolo no papel posicionado atrás da fita. C B B C A Figura 137 – Mecanismo de impressão em uma impressora matricial Fonte: Monteiro (2019, p. 362). 158 Unidade II O item A da figura anterior mostra o mecanismo de impressão, constituído pela cabeça de impressão. Já o item B se refere à fita contendo tinta. Por sua vez, o item C ilustra o papel onde os símbolos serão impressos. A geração de pontos no papel tem seu início com a cabeça de impressão, formada por um tubo contendo agulhas e ligado a uma bobina; as agulhas são posicionadas e uma corrente elétrica energiza a bobina, que impactará as agulhas, pressionando a fita, impregnando o papel. Dessa maneira, a cabeça imprimirá simultaneamente os n pontos de uma coluna e os n pontos da próxima coluna, sucessivamente, até formar o caractere desejado e completar a linha. As impressoras do tipo jato de tinta ou ink‑jet (figura a seguir) são mais populares e utilizadas atualmente, em especial pelo seu baixo custo. Seu funcionamento envolve a produção de caracteres em forma de uma matriz de pontos em uma folha de papel. Esse processo se assemelha com as impressoras matriciais e a diferença está na técnica aplicada para a criação dos pontos no papel. Figura 138 – Impressora do tipo jato de tinta Disponível em: https://bit.ly/3iEk9OJ. Acesso em: 17 jan. 2023. Em impressoras jato de tinta, a criação do ponto é o resultado da aplicação de uma gota de tinta, depositada no papel na região determinada por coordenadas x e y. O mecanismo que realiza a impressão desse tipo de impressora é constituído por uma certa quantidade de tubos pequenos contendo um bico injetor para permitir a saída das gotículas de tinta. Tecnologias atuais são baseadas na projeção de gota a gota por demanda ou drop‑on‑demand bubble jet, com modelos que possuem de 128 a 256 bicos injetores. Esse processo consiste na passagem de uma corrente elétrica através de uma resistência que aquecerá a tinta, facilitando a saída pelo bico do tubo injetor. Esse processo ocorrerá milhares de vezes por segundo durante toda a etapa de impressão. Em relação às cores de impressão, algumas impressoras só trabalham com tinta preta e são conhecidas como monocromáticas, enquanto 159 ARQUITETURA DE COMPUTADORES MODERNOS outras impressoras jato de tinta imprimem colorido por meio do emprego de três ou quatro tubos de tinta (magenta, ciano, amarela e preta) formando as cores necessárias para a impressão. Como uma impressora a jato de tinta possui vários bicos injetores, ela produzirá uma matriz de pontos mais densa em comparação com as matriciais, que possuem geralmente 24 agulhas. Os valores típicos de impressão de tinta estão na faixa de 300 x 300 pontos por polegada ou ppi (point per inch). As características de impressoras a laser, como a figura a seguir, são: alta qualidade na impressão da imagem, excelente flexibilidade e velocidade de impressão maior se comparada a outros modelos (jato de tinta e matricial). Figura 139 – Impressora do tipo laser Disponível em: https://bit.ly/3iRDD29. Acesso em: 17 jan. 2023. A tecnologia aplicada nesse tipo de impressora consiste em um tambor fotossensível rotativo de precisão. Este, no início de cada ciclo, recebe uma carga de cerca de 1.000 volts. Na sequência, a luz de um laser passa pelo comprimento do tambor interno à impressora a fim de refleti‑lo como um espelho octogonal e rotativo, como mostra a figura a seguir. O feixe de luz é modulado para produzir um padrão de pontos claros e escuros no papel. Após uma linha de pontos ser pintada, o tambor gira uma fraçãode um grau, para permitir que a próxima linha também seja pintada. Na sequência, de acordo com a rotação, a primeira linha de pontos chega ao reservatório (toner), que contém um pó negro eletrostaticamente sensível à corrente elétrica. Então, o toner é atraído pelos pontos carregados, formando uma imagem produzida naquela linha de forma que o tambor revestido pelo pó seja pressionado contra o papel, transferindo todo o pó para ele. O papel passa pelos rolamentos que estão aquecidos, fundindo‑se com o toner, fixando a imagem final no papel. 160 Unidade II Laser Espelho octogonal rotativo Feixe de luz atinge o tambor Toner Papel em branco Roletes aquecidos Saída empilhada Raspador Tambor Tambor pulverizado e carregado Dispensador Figura 140 – Mecanismo de impressão em uma impressora a laser Fonte: Tanenbaum e Austin (2013, p. 96). Após o término do processo de impressão no papel, o tambor é descarregado e raspado para eliminar qualquer resíduo de pó a fim de prepará‑lo para o recebimento de uma nova carga elétrica e um novo revestimento para a próxima impressão de páginas. 5.6 Monitores de vídeo Os monitores de vídeo dos computadores são periféricos que se tornaram muito populares porque facilitam a interação homem‑computador. Os primeiros computadores não possuíam monitores de vídeo, mas lâmpadas que acendiam e apagavam na frente do painel da máquina, em um padrão que representava valores em binário. Também são conhecidos como displays, pois a tradução se refere ao elemento de visualização, e possuem diversas tecnologias e características físicas para exibição de uma imagem ou vídeo, como (MONTEIRO, 2019): • tubo de raios catódicos ou CRT (cathode‑ray tube); • diodos emissores de luz ou TV de LED (light emitting diodes); • monitores de cristal líquido ou LCD (liquid‑crystal display); • monitores com painel estreito ou VPE (flat panel display); 161 ARQUITETURA DE COMPUTADORES MODERNOS Figura 141 – Monitor de vídeo CRT Disponível em: https://bit.ly/3QNOsyX. Acesso em: 17 jan. 2023. Essas são algumas tecnologias utilizadas em monitores de vídeo, porém existem ainda outras, como as de gás plasma e as eletroluminescentes. Apesar dessas novas tecnologias, os monitores do tipo CRT prevaleceram durante muitos anos como padrão em empresas ou mesmo em residências. A próxima figura mostra de forma esquemática o funcionamento de um monitor de tubo baseado em raios catódicos e seus respectivos componentes, que são: • um cátodo, também conhecido como canhão de elétrons; • um anodo formado pela tela frontal do vídeo, coberta com o elemento químico fósforo; • um par de bobinas defletoras de feixe na horizontal e na vertical para direcionar o feixe de elétrons. A partir desses itens, é possível explicar o funcionamento de um monitor de tubo, que ocorre nessa sequência: • o canhão de elétrons emite um feixe concentrado que caminha velozmente para a tela frontal de fósforo, iluminando‑a; • durante o caminho para a tela, o feixe de elétrons sofrerá uma deflexão que produzirá um ponto brilhante no local desejado da tela; • a deflexão do feixe de elétrons causará uma varredura nas coordenadas X e Y da tela, denominada rastro ou raster‑scan. 162 Unidade II Cobertura metálica interior com alta voltagem Cobertura com fósforo Feixe de elétrons Deflexão horizontal Grade de controle Catodo Canhão Sistema de foco Deflexão vertical Figura 142 – Tubo de raios catódicos de monitores de vídeo Fonte: Monteiro (2019, p. 354). Saiba mais Entenda melhor como funcionam os monitores LCD em: CIRIACO, D. Como funcionam os monitores LCD. Canaltech, 6 maio 2009. Disponível em: https://bit.ly/3ZGaszL. Acesso em: 17 jan. 2023. 6 COMPUTADOR E O CONJUNTO DE INSTRUÇÕES DE MÁQUINA 6.1 Aspecto fundamental do ciclo de instrução A maior parte das instruções de um computador pode ser dividida em duas categorias, relacionadas a como elas interagem com o hardware: registrador‑memória ou registrador‑registrador. As instruções do tipo registrador‑memória permitem que palavras (words) da memória possam ser buscadas em registradores para serem utilizadas como entradas pela ULA em instruções sequenciais. No caso do registrador‑registrador, uma instrução típica busca dois operandos nos registradores, os traz para a ULA e efetua uma operação aritmética ou booleana e armazena o resultado em um dos registradores. Esse método é conhecido como ciclo de caminho de dados e é uma das principais funções dos registradores das CPUs, de forma que, quanto mais rápido for o ciclo do caminho de dados, mais rápido será o funcionamento do computador. 163 ARQUITETURA DE COMPUTADORES MODERNOS Para que ocorra essa comunicação de instruções pelos registradores ou pela memória, é necessário compreender como ocorre o ciclo de busca e execução de instruções. Quando se trata do ciclo direto de execução de instruções em sua forma mais simplificada, primeiro o processador busca as instruções (lê a próxima instrução da memória dentro do processador) uma por vez, depois as executa (interpreta o código de operação e efetua a operação indicada). Lembrete A execução de um programa é baseada em repetir o processo de busca e execução da instrução sempre que houver mais instruções a serem executadas em um mesmo ciclo. É importante salientar que as interrupções também podem ocorrer durante a execução das instruções. Nesses casos, salva‑se o estado do processo atual e atende‑se à instrução de interrupção indicada. Após o término da execução das instruções, o processo é finalizado. A figura a seguir mostra um ciclo de instrução básico. Ciclo de busca Ciclo de execução Início FimBuscar próxima instrução Executar instrução Figura 143 – Ciclo de instrução de um computador sem interrupções Fonte: Stallings (2010, p. 56). A execução de instruções no ciclo é dependente do tipo de instrução que será executada e, mais intrinsecamente, de qual operando será utilizado nas operações. 6.2 Os tipos de operandos Um operando é uma entrada ou argumento em uma dada instrução e é dividido em quatro categorias: números, caracteres, endereços e dados lógicos. O endereçamento é uma forma de dados e pode conter cálculos realizados sobre a referência de memória do operando em uma dada instrução. 6.2.1 Números Todas as linguagens de máquina como o assembly, por exemplo, incluem algum tipo de dado numérico. Mesmo um processamento de dados não numérico terá a necessidade de que haja números atuantes, como contadores, tamanho de campo etc. Existem basicamente três tipos de dados numéricos encontrados em um computador: 164 Unidade II • Inteiros binários ou ponto fixo binário: representados pelos dígitos zero e um, sinal de menos e vírgula fracionada. • Ponto flutuante binário: expresso por um intervalo de inteiros positivos e negativos centrados em zero. • Decimal: organizado em casas decimais utilizando a vírgula para indicar a que ordem o número pertence. 6.2.2 Caracteres Baseado no uso de texto ou strings de caracteres, esse tipo de codificação foi desenvolvido a fim de facilitar o armazenamento de dados e instruções. Diversos códigos foram desenvolvidos, e geralmente são representados por uma sequência de bits, sendo o American Standard Code for Information Interchange (ASCII) o mais utilizado. Cada caractere no ASCII é destacado por um padrão exclusivo de 7 bits, de modo que 128 caracteres diferentes poderão ser indicados. Como os computadores atuais são orientados a byte, cada caractere no ASCII será armazenado em um byte separado, conforme pode ser observado nas tabelas a seguir. Tabela 6 – Parte do conjunto de caracteres ASCII de controle Hexa Nome Significado Hexa Nome 0 NUL Null 10 DLE 1 SOH Start Of Heading 2 STX Start Of Text 3 ETX End Of Text 4 EOT End Of Transmission 5 ENQ Enquiry 15 NAK 6 ACK ACKnowledgement 16 SYN 7 BEL BELl 17 ETB 8 BS BackSpace 18 CAN 9 HT Horizontal Tab 19 A LF Line Feed 1A B VT Vertical Tab 1B C FF Form Feed 1C D CR CarriageReturn 1D E SO Shift Out 1E F SI Shift In 1F Fonte: Tanenbaum e Austin (2013, p. 108). 165 ARQUITETURA DE COMPUTADORES MODERNOS Tabela 7 – Parte de outro conjunto de caracteres ASCII de controle Hexa Nome Significado 0 NUL Null 1 SOH Start 2 STX Start 3 ETX End 4 EOT End 5 ENQ Enquiry 6 ACK ACKnowledgement 7 BEL BELl 8 BS BackSpace 9 HT Horizontal A LF Line B VT Vertical C FF Form D CR Carriage E SO Shift F SI Shift Fonte: Tanenbaum e Austin (2013, p. 108). A tabela ASCII contém os códigos de 0 a 1F (hexadecimal) para realizar o controle operacional e de 20 a 7F utilizados como caracteres de uso geral do computador. 6.2.3 Dados lógicos Um dado lógico é uma palavra ou unidade endereçável tratada como uma única unidade de dados. É útil também considerar essa unidade sendo constituída de n bits de dados de 1 bit, com cada bit valendo 0 ou 1. Existem basicamente duas vantagens no uso da orientação a bits; primeiro, é possível armazenar um array (coleção de elementos) de itens de dados binários, em que cada valor pode assumir verdadeiro (1) e falso (0). A partir desses dados lógicos, a memória pode ser utilizada de forma eficiente no armazenamento; segundo, há situações em que se deseja manipular os bits de um item de dados, por exemplo, se as operações de ponto flutuante forem implementadas diretamente no software. Assim, é necessário deslocar os bits significativos em algumas operações. 6.3 Execução de instrução: ciclo indireto A execução de uma instrução envolve o uso de um ou mais operandos lidos da memória. Se algum endereçamento indireto for utilizado, acessos adicionais à memória serão necessários. Nessas situações, um endereço indireto será considerado como um estágio a mais no ciclo de instrução, conforme pode ser observado na figura a seguir. 166 Unidade II Executar Buscar IndiretoInterrupção Figura 144 – Ciclo de instrução indireto Fonte: Stallings (2010, p. 362). No ciclo, a instrução é lida e examinada para determinar se há algum endereçamento indireto envolvido. Se houver, os operandos necessários são obtidos através de endereçamento indireto. Havendo interrupções durante a execução do ciclo de instrução, ela será processada antes da obtenção da próxima instrução. 6.4 Busca e execução de instruções A cada início de ciclo, o registrador program counter (PC – contador de programa) mantém o endereço da instrução a ser buscada na memória. A cada busca, o PC será incrementado a fim de procurar a próxima instrução da sequência, ou seja, realizará a busca da próxima instrução com o endereço de memória mais alto. Por exemplo, considerando um computador em que cada instrução ocupará uma palavra de 16 bits, o contador de programa poderá estar alocado no endereço de número 300. Assim, o processador irá buscar a próxima instrução no local 300, e nos próximos ciclos de instrução ele irá buscar nos endereços 301, 302, 303, 304 etc. Cada instrução é lida e carregada no registrador IR (registrador de instrução), que interpretará a instrução e fará a ação desejada. Em geral, as ações a serem realizadas estão separadas em quatro categorias, listadas a seguir (STALLINGS, 2010): • Processador – memória: quando os dados podem ser transferidos do processador para a memória ou da memória para o processador. • Processador – E/S: quando os dados podem ser transferidos de, ou para, um dispositivo de entrada e saída. • Processamento de dados: quando o processador realiza alguma operação lógica/aritmética sobre os dados. 167 ARQUITETURA DE COMPUTADORES MODERNOS • Controle: quando uma instrução específica da sequência de execução pode ser alterada. Por exemplo, o processador pode buscar uma instrução no local de memória 149, que especifica que a próxima instrução estará no local 182. Assim, o processador guardará essa informação, definindo que o contador de programa será definido como 182; dessa forma, o próximo ciclo de busca da instrução será retirado do endereço 182 em vez do endereço 150. Em outro exemplo, um computador hipotético pode incluir algumas características como instrução/palavra de 16 bits de extensão, oferecendo 4 bits para o opcode e podendo haver até 24 = 16 opcodes diferentes e até 212 = 4.096 palavras de memória endereçadas diretamente, registrador único (acumulador – AC) e memória também de 16 bits. O ciclo de instrução pode envolver mais de uma referência à memória e especificar uma operação de E/S. Através de um diagrama de estados, pode‑se entender melhor o processo de busca e execução de uma instrução, que engloba as seguintes etapas: • Cálculo de endereço de instrução (instruction address calculation – IAC): estágio responsável pela determinação do endereço da próxima instrução a ser executada. • Busca da instrução (instruction fetch – IF): ler a instrução do seu local da memória para o processador. • Decodificação da operação da instrução (instruction operation decoding – IOD): determinar o tipo de operação e os operandos a serem executados. • Cálculo do endereço do operando (operation address calculation – OAC): verificar se uma operação envolve alguma referência a um operando na memória. • Busca do operando (operation fetch – OF): estágio em que ocorre a busca pelo operando da memória ou de algum dispositivo de E/S. • Operação dos dados (data operation – DO): estágio que realiza a operação solicitada pela instrução. • Armazenamento do operando (operand store – OS): armazenar (escrever) o resultado na memória ou enviar o resultado para algum dispositivo de E/S. Os estágios contidos no ciclo de instrução, observados na figura a seguir, envolvem uma troca entre o processador e a memória ou algum módulo de E/S. 168 Unidade II Armazenamento do operando Busca do operando Busca da instrução Cálculo do endereço da instrução Cálculo do endereço do operando Decodificação da operação da instrução Cálculo do endereço do operando Operação dos dados Múltiplos operandos Instrução completa, busca próxima instrução Retorna dados de string ou vetor Múltiplos resultados Figura 145 – Diagrama dos estágios do ciclo de instrução Fonte: Stallings (2010, p. 59). O estado de cálculo do operando aparece duas vezes na figura, pois uma instrução pode envolver uma leitura e/ou uma escrita, utilizando somente um identificador de estado para as duas situações. 6.5 Formatos de instrução Uma instrução possui um código de operação (opcode) formado por um conjunto de informações, como o armazenamento dos resultados das operações realizadas. As instruções geralmente possuem um formato bem definido, contendo, além do opcode, alguns endereçamentos em uma mesma operação. Outros modelos de formatos de instruções podem ser observados na figura a seguir. Opcode A) Opcode Address1 Address2 C) Opcode Address B) Addr1Opcode Addr2 Addr3 D) Figura 146 – Modelos simplificados de formatos de instrução Fonte: Tanenbaum e Austin (2013, p. 285). Na parte A da figura anterior, observa‑se uma instrução que não possui endereçamento, sendo interpretada como uma instrução do tipo imediata, ou seja, não envolve outros registradores ou a 169 ARQUITETURA DE COMPUTADORES MODERNOS memória principal, pois a própria instrução já está contida no registrador em uso. Já nas partes B, C e D da figura anterior, nota‑se que sempre há um ou mais endereços (address) relacionados ao opcode. Alguns computadores possuem instruções com o mesmo comprimento (em bits), porém em outros o tamanho pode ser diferente, variando inclusive em relação ao tamanho da palavra. Instruções que têm o mesmo tamanho da palavra facilitam a decodificação, embora possam desperdiçar espaço para o armazenamento. Na figura a seguir, destacam‑se as diferentes relações entre as instruções com diferentes comprimentos e larguras. 1 Palavra 1 Palavra 1 Palavra Instrução Instrução Instrução Instrução Instrução Instrução Instrução Instrução Instr. Instr. Instrução Instrução Instrução Instrução Instrução InstruçãoInstrução A) B) C) Figura 147 – Relações entre diferentes formatos de instrução Fonte: Tanenbaum e Austin (2013, p. 285). Na parte A da figura anterior, observa‑se que o tamanho da palavra possui o mesmo tamanho das instruções, o que facilita a interpretação realizada pela unidade de controle do computador. Na parte B, as instruções têm exatamente metade do tamanho da palavra, por exemplo, para uma palavra de 64 bits tem‑se uma instrução de 32 bits. Já na parte C, verifica‑se que há uma variação nos tamanhos das instruções, facilitando o armazenamento ao custo de uma maior dificuldade de padronização na decodificação de cada instrução. Dessa forma, em um projeto de uma arquitetura de computadores, deve‑se planejar, de forma criteriosa, qual será o tamanho das instruções, pois uma máquina moderna deve ser capaz de operar com diferentes tamanhos de instruções para poder “sobreviver”, por tempo suficiente, às mudanças de tecnologia impostas por diferentes gerações de processadores (TANENBAUM; AUSTIN, 2013). O fato de se diminuir o tamanho das instruções tornará os processadores mais rápidos devido à menor quantidade de largura de banda (número de bits que a memória pode fornecer) de transmissão do processador para a memória principal. Instruções mais curtas, nesse contexto, significam que o processamento será mais veloz, e como os processadores atuais são capazes de executar mais instruções a cada ciclo de clock, quanto maior for a quantidade de busca, decodificação e execução de instruções, mais potente é o computador. Dessa forma, o aspecto do tamanho da instrução e da cache de instrução é um fator muito importante no projeto de um computador e terá influência direta em seu desempenho. Outro critério em um projeto está relacionado ao espaço requerido pelo tamanho da instrução para que ela possa expressar todas as operações desejadas. Um computador com 2n operações que tenha instruções menores do que n bits será impossível, pois simplesmente não haveria espaço suficiente no opcode para indicar qual instrução será necessária. Um terceiro critério se refere ao número de bits contidos em um campo de endereço. 170 Unidade II A eficiência de uma determinada arquitetura também está relacionada com a quantidade de alterações que essa tecnologia passará ao longo dos anos. Por exemplo, se os acessos à memória forem rápidos, o uso de acesso a registradores ou memória baseado no conceito de pilha será eficiente. Contudo, se os acessos forem lentos, será mais eficiente se o computador possuir um conjunto muito grande de registradores, como a CPU advanced risc machine (ARM). Mais um fator importante se refere à capacidade de transmissão de dados da memória cache, que está situada dentro do processador. Se a largura de banda de comunicação de uma memória cache para instruções for t bps (bits por segundo) e o comprimento médio da instrução for r bits, a memória cache poderá entregar no máximo t/r instruções por segundo. Esse é o limite superior da taxa a qual o processador pode executar instruções, o que também é limitado pelo comprimento da instrução. 6.5.1 A expansão de opcodes Considere uma instrução contendo (n + k) bits além de um opcode de k bits e um endereçamento único de n bits. Essa instrução poderá permitir que ocorram até 2k operações diferentes e utilizar 2n células de memória endereçáveis. Em outra possibilidade, os mesmos (n + k) bits podem ser desmembrados em um opcode de (k – 1) bits e um endereço de (n + 1) bits, que significa apenas a metade do número de instruções, mas duas vezes mais memória endereçável, e que pode ser traduzido também como a mesma quantidade de memória, mas possuindo o dobro da resolução. Um opcode de (k + 1) bits e um endereço de (n – 1) bits terá mais operações, porém à custa de um menor número de células endereçáveis ou uma menor resolução. Uma possibilidade para resolver esses impasses é conhecida como expansão de opcodes. Esse conceito pode ser observado da seguinte forma: considere um computador em que as instruções possuem 16 bits de comprimento e os endereços possuem 4 bits de comprimento, como mostra a figura a seguir. Opcode 15 14 13 12 Endereço 1 11 10 9 8 Endereço 2 7 6 5 4 Endereço 3 3 2 1 0 Figura 148 – Opcode de 4 bits e três campos de endereços de 4 bits Fonte: Tanenbaum e Austin (2013, p. 287). No exemplo da figura anterior, a máquina possui 16 registradores com endereços de 4 bits, onde ocorrem todas as operações aritméticas, como também é observado na figura a seguir. 171 ARQUITETURA DE COMPUTADORES MODERNOS 16 bits Número do bit 15 12 11 8 7 4 3 0 0000 xxxx yyyy zzzz 0001 xxxx yyyy zzzz 0010 xxxx yyyy zzzz ⋮ 1100 xxxx yyyy zzzz 1101 xxxx yyyy zzzz 1110 xxxx yyyy zzzz Opcode de 4 bits 15 instruções de três endereços 1111 0000 yyyy zzzz 1111 0001 yyyy zzzz 1111 0010 yyyy zzzz ⋮ 1111 1011 yyyy zzzz 1111 1100 yyyy zzzz 1111 1101 yyyy zzzz Opcode de 8 bits 14 instruções de dois endereços 1111 1110 0000 zzzz 1111 1110 0001 zzzz ⋮ 1111 1110 1110 zzzz 1111 1110 1111 zzzz 1111 1111 0000 zzzz 1111 1111 0001 zzzz ⋮ 1111 1111 1101 zzzz 1111 1111 1110 zzzz Opcode de 12 bits 31 instruções de um endereço 1111 1111 1111 0000 1111 1111 1111 0001 1111 1111 1111 0010 ⋮ 1111 1111 1111 1101 1111 1111 1111 1110 1111 1111 1111 1111 Opcode de 16 bits 16 instruções sem endereço Figura 149 – Expansão de opcode Fonte: Tanenbaum e Austin (2013, p. 288). O opcode 15 significa que esse código de operação está contido nos bits, que vão de 8 a 15, em vez de 12 a 15. Os bits de 0 a 3 e os bits de 4 a 7 formarão mais dois endereços. As 14 instruções de dois endereços possuem todas 1111 nos 4 bits da extrema esquerda e números que vão de 0000 a 1101 nos bits de 8 a 11. Instruções que possuem 1111 nos 4 bits da extrema esquerda e 1110 ou 1111 nos bits de 8 a 11 possuem um tratamento especial, pois seus opcodes podem estar alocados entre os bits de 4 a 15. Dessa forma, o resultado será 32 novos opcodes. Todavia, como são necessários somente 31 opcodes, o 172 Unidade II opcode codificado como 111111111111 é interpretado como significado de que está contido nos bits de 0 a 15, resultando em 16 instruções sem nenhum endereço. A expansão de opcode pode demonstrar um compromisso entre o espaço para opcodes e o espaço para outras informações utilizadas no processo. Em termos práticos, os opcodes expandidos não são tão regulares como no exemplo; na verdade, há dois modos individuais para explorar a capacidade de uso dos diferentes tamanhos dos opcodes. Primeiro, todas as instruções precisam de mais bits para especificarem outras funções; segundo, o tamanho da instrução pode ser minimizado através da escolha dos opcodes mais curtos em instruções comuns e opcodes mais longos em instruções utilizadas raramente. 6.6 Intel Core i7 e suas instruções As instruções no Intel Core i7 têm uma complexidade maior, além de serem mais irregulares, podendo ter até seis campos de comprimento variáveis, cinco dos quais são opcionais. O padrão das instruções do i7 é mostrado na figura a seguir. Qual operando é fonte? Byte/palavra Mod Reg R/M Bits 2 3 3 Scale Index Base Bits 2 3 3 OpcodePrefixo Mode Sib ImediatoDeslocamento Bytes 0‑5 1‑2 0‑1 0‑1 0‑4 0‑4 Bites 6 1 1 Instrução Figura 150 – Formatos de instrução no Intel Core i7 Fonte: Tanenbaum e Austin (2013, p. 289). Nesse caso, a instrução pode conter alguns campos, como o prefixo para a identificação da instrução, o código da operação que relaciona a instrução com os operandos de origem, o modo de endereçamento, além de campos associados ao deslocamento de busca dos dados na memória principal ou em outros registradores. Nas arquiteturas Intel mais antigas, os opcodes possuíam 1 byte de prefixo, o que também é interpretado como um opcode extra introduzido na frente da instrução a fim de alterar sua ação. Os bits individuais nos opcodes do i7 não contêm muitas informações sobre a instrução referida.Uma única estrutura no campo de opcode pode ser usada para um bit de ordem baixa com algumas instruções indicando o byte/palavra, e a utilização de um bit adjacente é feita para indicar se o endereço da memória é de origem ou destino. 173 ARQUITETURA DE COMPUTADORES MODERNOS No geral, o opcode deve ser decodificado por completo para que seja possível determinar a qual classe de operação esta será executada e, consequentemente, qual deverá ser o comprimento da instrução. Isso pode dificultar as implementações que requerem um alto desempenho, pois será preciso uma decodificação extensiva antes mesmo de se definir onde a próxima instrução irá começar. Logo na sequência ao byte de opcode de referência a um operando, há um segundo byte para informar tudo sobre o operando, sendo separado em 8 bits, subdivididos em um campo denominado MOD de 2 bits e dois campos com registradores de 3 bits (REG e R/M). Geralmente, os três primeiros bits desse byte são utilizados como extensão para o opcode, o que resulta em um total de 11 bits. Porém, o campo de modo de 2 bits significa que há apenas quatro modos de endereçamento dos operandos, e um deles deve ser sempre um registrador. 6.7 Endereçamento de instruções Os campos de endereços para instruções mais simples possuem um formato relativamente pequeno. É de interesse que haja uma grande variedade de técnicas de endereçamento envolvendo alguma troca de intervalos de endereços ou mesmo uma flexibilidade para a realização do endereçamento. Além disso, é preciso usar um grande número de referências à memória que estão contidas dentro da própria instrução e que devem ser atendidas, incluindo o cálculo de endereçamento. Os principais modos de endereçamento para memória e/ou para registradores são: imediato, direto, indireto, por registradores, indireto por registradores, por deslocamento e endereçamento de pilha. 6.7.1 Tipo de endereçamento imediato O endereçamento imediato é o formato mais simplificado de endereçamento, e nele o valor do operando está presente na própria instrução, por exemplo: operando=A Esse tipo de endereçamento é aplicado para definir valores iniciais das variáveis. No geral, o número será armazenado em duas formas complementares com o bit à esquerda do operando para bit de sinal, de modo que, quando o operando é carregado em um registrador de dados, o bit de sinal será estendido para a esquerda até que o tamanho total da palavra de dados seja completado. Em outros casos, o valor em binário imediato é interpretado como um número inteiro e sem sinal (negativo ou positivo). Uma das vantagens do endereçamento imediato é que não há necessidade de referenciar algum endereço da RAM, pois a instrução já está contida no próprio operando, economizando ciclos de memória principal ou memória cache. Todavia, a desvantagem desse tipo de endereçamento é em relação ao tamanho do campo de endereço, que pode ser considerado pequeno se comparado ao tamanho da palavra. 174 Unidade II 6.7.2 Tipo de endereçamento direto Nesse tipo, o próprio campo de endereço contém o endereço efetivo do operando que será utilizado, por exemplo: EA=A Essa técnica era muito usada nas primeiras gerações dos computadores, mas não é aplicada nas arquiteturas atuais. Sua grande vantagem é requerer apenas uma referência de memória e nenhum cálculo de endereçamento especial. A principal desvantagem é sua limitação em relação ao espaço para o endereçamento dos operandos. 6.7.3 Tipo de endereçamento indireto Possui o tamanho do campo de endereço menor do que o tamanho da palavra, limitando o intervalo de endereços. Uma possível solução para essa limitação é ter um campo de endereço com referência ao endereço de uma palavra da memória que, por sua vez, conterá o endereço completo da operação a ser executada. Por exemplo: EA=(A) Nesse exemplo, os parênteses são interpretados como o conteúdo de um operando, no caso o A. Uma das vantagens visíveis desse tipo de endereçamento consiste no tamanho N da palavra, pois será disponibilizado um endereçamento de 2N. A desvantagem é que a execução da instrução irá requerer duas referências da memória para que o operando seja obtido, isto é, uma para obter o endereço do operando e outra para obter o valor do operando. Caso o número de palavras que podem ser endereçados seja 2N, o número de endereços diferentes que poderão ser referenciados em qualquer momento será limitado a 2k, em que k será o tamanho do campo de endereço. Em uma variação do endereçamento indireto, é possível o uso de vários níveis de endereços para acesso a diferentes conteúdos, como é observado no exemplo: EA=(...(A)...) 6.7.4 Tipo de endereçamento de registradores Esse endereçamento é semelhante ao endereçamento direto, sendo sua única diferença o campo de endereço se referir a um registrador em vez de um endereço na memória principal, determinado como: EA=R Em que R significa referência a um registrador. Por exemplo, se um campo de endereço de um registrador dentro de uma instrução for 3, então o registrador R3 será o endereço pretendido, e o valor do operando está contido em R3. Geralmente, um campo de endereço para referência de registradores possui de 3 a 5 bits, com um total de 8 a 32 registradores de uso geral. 175 ARQUITETURA DE COMPUTADORES MODERNOS Uma das vantagens do endereçamento baseado em registradores consiste na utilização de apenas um pequeno campo de endereço contido na instrução, além de não necessitar de nenhuma referência à memória. Como desvantagem pode‑se citar o espaço para o endereçamento de registradores ser pequeno e limitado. Quando há um uso muito grande de endereçamento por registradores em um conjunto de instruções, por consequência haverá um uso exacerbado dos registradores contidos no processador. Como o processador possui um número limitado de registradores, o uso exacerbado destes só faz sentido de modo eficiente. Se cada operando for inserido no registrador a partir da memória e utilizado apenas uma vez e depois enviado à memória principal, então seu uso não será otimizado, sendo necessário um passo intermediário no processo, aumentando uma etapa no ciclo de instrução. Por outro lado, se o operando permanecer no registrador durante algumas operações, então haverá economia de etapas no ciclo de busca e execução dos operandos. 6.7.5 Endereçamento indireto por registradores Assim como o endereçamento por registradores é semelhante ao direto (memória), o endereçamento indireto por registradores, por sua vez, é semelhante ao indireto (memória). Nos dois casos, a diferença é em relação ao campo de endereço, que difere ao se referenciar a um registrador ou à memória principal. Outra característica no indireto por registradores é quanto à menor utilização de referências à memória se comparada ao endereçamento indireto. 6.7.6 Endereçamento por deslocamento Combina as capacidades de endereçamento direto e indireto por registradores e pode ser representado como: EA=A+(R) Nessa modalidade é necessário que a instrução possua dois campos de endereçamento, dos quais um deverá ser explícito, ou seja, o valor contido em um campo de endereço como (A) deverá ser utilizado diretamente. Em um outro campo de endereço, será aplicada uma referência implícita baseada no opcode, que por sua vez refere‑se a um registrador cujo conteúdo é adicionado em A, de modo a produzir um endereço efetivo. Há três usos comuns para o endereçamento por deslocamento: endereçamento relativo, endereçamento por registrador base e indexação. Endereçamento relativo Ocorre quando o registrador program conter (PC) é referenciado, ou seja, o endereço da próxima instrução será adicionado ao campo de endereço da operação. Assim, o endereço efetivo é o deslocamento relativo para a operação em uso. O uso de endereçamentos relativos economiza bits, pois a maioria das referências de memória já está na próxima instrução a ser executada. 176 Unidade II Endereçamento por registrador base Nessavariação, o registrador base contém um endereço de memória, e o campo de endereço possui um deslocamento, geralmente um número inteiro sem sinal. As referências aos registradores nesse caso podem ser de forma explícita ou implícita, o que também é considerada uma forma eficiente para executar a segmentação de instruções. Em algumas implementações de endereçamento, um único registrador de segmento pode ser usado implicitamente. Já em outras situações, o programador de hardware pode escolher um registrador para guardar o endereço base de um segmento, e a instrução deverá referenciá‑lo explicitamente. Nesta última opção, se o tamanho do campo de endereço for k e o número de possíveis registradores for N, então uma instrução pode referenciar qualquer uma de N áreas de 2k palavras. Indexação Nesse caso, o campo de endereço referencia uma posição que contém um endereço na memória principal, e o registrador que for referenciado conterá um deslocamento positivo desse endereço. Como o campo de endereço é considerado um endereço de memória na indexação, geralmente ele conterá mais bits quando comparado a um campo de endereço de uma instrução com endereçamento por registrador base. Apesar disso, o método para calcular o EA será o mesmo aplicado para o endereçamento por registrador base e indexação, e nos dois casos a referência do registrador será algumas vezes explícita; em outras, implícita, em diferentes processadores. Uma das opções na indexação é a permissão para que algum mecanismo possa efetuar operações iterativas. Por exemplo, suponha uma lista de números armazenados, iniciando‑se na posição A. Suponha também que se queira adicionar 1 a cada elemento de uma lista. Será necessário obter cada valor, adicionar 1 a esse número e armazená‑lo de volta. A sequência de endereçamentos efetivos requeridos será A, A + 1, A + 2, A + 3..., até a última posição dessa lista. Ao se utilizar o endereçamento por indexação, essa tarefa é realizada de modo mais fácil, pois o valor A será armazenado no campo de endereço da instrução, e o registrador indexador será inicializado com zero. Após cada operação, o registrador indexador será incrementado por 1. Os registradores indexadores são comumente usados em tarefas iterativas, o que torna normal a necessidade de incrementar e decrementar o registrador indexador após cada referência a ele. Por se tratar de uma operação muito comum, alguns sistemas fazem isso de forma automática no próprio ciclo de instrução, o que é conhecido como autoindexação. Se forem utilizados registradores de uso geral para a indexação, a operação de autoindexação pode exigir uma sinalização feita por 1 bit dentro da própria instrução. Pode‑se descrever como exemplo de autoindexação para o uso de incremento: EA=A+(R) (R)←(R)+1 177 ARQUITETURA DE COMPUTADORES MODERNOS Em alguns computadores, o endereçamento indireto e a indexação fazem parte de sua estrutura, sendo possível usar as duas possibilidades em uma mesma instrução. A indexação é executada antes ou depois da indireção. Se a indexação for executada depois da indireção, ela será chamada pós‑indexação e pode ser representada como: EA=(A)+(R) O conteúdo dos campos de endereço é geralmente utilizado para acesso ao local de memória que contém o endereço direto. Depois, esse endereço será indexado por um valor contido no registrador. Tal técnica será útil para o acesso do interior de vários blocos de dados de formato fixo. Por exemplo, nos sistemas operacionais é necessário implementar um bloco de controle de processos (program control block – PCB), onde todos os dados referentes ao processo são armazenados. Assim, a operação executada será a mesma, independentemente de qual bloco está sendo manipulado no momento, de forma que os endereços nas instruções que fazem referência ao bloco podem apontar para um local (valor=A) contendo um ponteiro para o início do PCB. Ao utilizar a pré‑indexação antes da indireção, tem‑se: EA=(A+(R)) O endereçamento é calculado da mesma forma que na indexação simples, pois, nesse caso, o endereço calculado não contém o operando, mas o endereço de onde o operando se encontra. Por exemplo, pode‑se citar uma tabela contendo múltiplos endereços de desvio. Em um certo ponto do programa, pode haver uma ramificação para uma série de posições diferentes que dependem de sua condição. Uma tabela de endereços poderá ser definida com início em A. Baseando‑se na indexação dessa tabela, a localização desejada poderá ser encontrada. 6.7.7 Endereçamento de pilha Uma pilha pode ser definida como um vetor linear de posições e contém um conjunto de elementos em que somente um deles pode ser acessado de cada vez. Uma pilha tem um tamanho variável, e o ponto de acesso à pilha é denominado topo da pilha, assim como o último elemento da pilha é conhecido como base da pilha. Os itens adicionados ou removidos da pilha só podem ser acessados do seu topo e, por esse motivo, uma pilha também pode ser conhecida como último a entrar, primeiro a sair (Last In First Out – LIFO). A figura a seguir mostra algumas operações básicas de uma pilha. 178 Unidade II SP → SP → I J J SP → J K K K SP → J × K L L L L M M M M • • • • • • • • • • • • BP → • BP → • BP → • BP → • SP = stack pointer (ponteiro de pilha) BP = base pointer (ponteiro de base) Estado inicial Após PUSH Após POP Após operação de multiplicação En de re ço s d ec re sc en te s Figura 151 – Operações básicas de pilha Fonte: Stallings (2010, p. 321). No exemplo da figura anterior, nota‑se que a pilha é constituída de alguns elementos em seu estado inicial. O estado irá se modificar através da operação PUSH, que tem como função acrescentar um elemento novo ao topo da pilha. A operação POP, na sequência, irá retirar o elemento do topo da pilha. Nesses dois casos, o topo da pilha se modifica de acordo com a operação realizada. Operadores binários também podem ser usados e exigirão dois operandos (multiplicar, dividir, somar, subtrair). Nesse caso, ao utilizar dois itens no topo da pilha como operandos, serão removidos dois itens relacionados à operação e o resultado será colocado novamente no topo da pilha. Em outras operações, conhecidas como unárias, exige‑se apenas um operando (NOT) para modificar o topo da pilha. Algumas operações em pilhas podem ser observadas no quadro a seguir. Quadro 1 – Operações orientadas à pilha PUSH Acrescenta um novo elemento ao topo da pilha POP Retira um elemento do topo da pilha Operação unária Realiza operação sobre o elemento do topo da pilha. Substitui o elemento do topo pelo resultado Operação binária Realiza operação sobre os dois elementos do topo da pilha. Exclui os dois elementos da pilha. Coloca o resultado da operação no topo da pilha Fonte: Stallings (2010, p. 322). 179 ARQUITETURA DE COMPUTADORES MODERNOS A tabela a seguir mostra, de forma resumida, as possíveis operações de cálculo de endereçamento discutidas até o momento. Tabela 8 – Modos básicos de endereçamento Modo Algoritmo Principal vantagem Principal desvantagem Imediato Operando=A Nenhuma referência de memória Magnitude de operando limitada Direto EA=A Simples Espaço de endereçamento limitado Indireto EA=(A) Espaço de endereçamento grande Múltiplas referências de memória Registrador EA=R Nenhuma referência de memória Espaço de endereçamento limitado Indireto por registrador EA=(R) Espaço de endereçamento grande Referência extra de memória Deslocamento EA=A+(R) Flexibilidade Complexidade Pilha EA=topo da pilha Nenhuma referência de memória Aplicabilidade limitada Fonte: Stallings (2010, p. 331). 6.8 O computador e as interrupções Todo computador ou sistema embarcado oferece algum mecanismo para que operações que envolvam alguma comunicação com a memória, o processador ou dispositivos de E/S possam ser interrompidas em algum momento de sua operação. Observação Embora possa parecer ao usuário que uma máquina trabalhe melhor sem ser interrompida, as interrupções na verdadegarantem uma operação otimizada de um computador. No quadro a seguir, destacam‑se os tipos mais comuns de classes de interrupções. Quadro 2 Programa Gerada por alguma condição que ocorre como resultado da execução de uma instrução, como o overflow aritmético, divisão por zero, tentativa de executar uma instrução de máquina ilegal ou referência fora do espaço de memória permitido para o usuário Timer Gerada por um timer dentro do processo. Isso permite que o sistema operacional realize certas funções regularmente E/S Gerada por um controlador de E/S para sinalizar o término normal de uma operação ou para sinalizar uma série de condições de erro Falha de hardware Gerada por uma falha como falta de energia ou erro de paridade de memória Fonte: Stallings (2010, p. 60). 180 Unidade II As interrupções são inseridas durante o ciclo de instruções como uma forma de otimizar a eficiência do processamento das instruções. Em um exemplo simulado, imagine que um processador esteja transferindo dados a um dispositivo (impressora) utilizando o esquema de ciclo de instrução. Após cada operação para realização de escrita (gravação dos dados), o processador deve permanecer ocioso até que o dispositivo de impressão o acesse. O tempo dessa pausa deve ser da ordem de centenas de ciclos de instrução que não envolverão acesso à memória, o que ocasiona uma ociosidade de uso do processador, que ficará aguardando instruções nesse período. A figura a seguir ilustra essa situação, em que o programa de usuário realiza uma série de chamadas WRITE intercaladas com algum processamento. É possível observar também que os segmentos de código 1, 2 e 3 referem‑se às sequências de instruções que não envolvem alguma comunicação com dispositivos de E/S. Programa do usuário Write Write Write Programa de E/S Comando de E/S End 1 2 3 5 4 Figura 152 – Fluxo de controle de programa sem interrupções Fonte: Stallings (2010, p. 61). 181 ARQUITETURA DE COMPUTADORES MODERNOS Geralmente, o programa de E/S consiste em três seções: • Uma sequência de instruções (anotado como 4 na figura anterior) é utilizada a fim de preparar a operação de E/S, o que pode incluir a cópia dos dados para a saída alocada em um buffer (memória auxiliar temporária). • O comando de E/S (sem o uso de interrupções) é emitido e o programa precisa esperar até que o dispositivo de E/S esteja pronto para realizar a função desejada ou sondar, de forma periódica, se a operação de E/S terminou. • A instrução seguinte (anotada como 5 na figura anterior) completará a operação, o que pode incluir uma notificação (flag) para indicar o sucesso ou falha na operação. Lembrete As operações de E/S levam um longo tempo para serem finalizadas e o programa de E/S geralmente fica esperando que a operação termine. 6.8.1 As interrupções e o ciclo de instrução O uso de interrupções durante o ciclo operacional do computador pode otimizar o desempenho do processador. Considere, como exemplo, o fluxo de controle de um programa da próxima figura. Nessa operação, o programa de usuário alcança um ponto em que é realizada uma chamada sistema (system call) na forma de uma chamada WRITE. O programa de E/S será invocado depois que algumas poucas instruções tiverem sido executadas. Então, o controle retorna ao programa de usuário enquanto o dispositivo externo está ocupado aceitando/imprimindo dados oriundos da memória principal. A operação de E/S será realizada simultaneamente com a execução de instruções no programa de usuário. Quando algum dispositivo de E/S estiver pronto para aceitar mais dados do processador, o módulo de E/S para o dispositivo externo enviará um sinal de interrupção ao processador, de modo que o processador responderá suspendendo a operação do programa em execução, desviando para um programa do sistema operacional (tratador de interrupção) atender a algum dispositivo de E/S, retomando a execução original depois que o dispositivo for atendido. 182 Unidade II Programa do usuário Write Write Write Programa de E/S Comando de E/S End Tratador de interrupção 1 3b 2b 3a 2a 5 4 Figura 153 – Fluxo de controle de programa com interrupções de curta espera Fonte: Stallings (2010, p. 61). Uma interrupção é definida, simplificadamente, também como uma quebra na sequência de execução normal de algum software ou hardware. Quando o tratamento da interrupção tiver finalizado, a execução retornará do mesmo ponto de onde foi interrompida. O processador e o sistema operacional são os responsáveis pela suspensão do programa de usuário para depois retorná‑lo ao mesmo ponto. Dessa forma, o programa de usuário não precisará conter qualquer outro código especial para acomodar as interrupções, como mostra o esquema da figura a seguir. 183 ARQUITETURA DE COMPUTADORES MODERNOS Programa do usuário Tratador de interrupção Interrupção ocorre aqui 1 2 i i + 1 M Figura 154 – Transferência de controle de tarefas via interrupções Fonte: Stallings (2010, p. 62). Para que as interrupções ocorram, um novo ciclo de interrupção será acrescentado ao ciclo de instrução simples, como pode ser observado na figura a seguir. Ciclo de busca Ciclo de execução Ciclo de interrupção Interrupções desabilitadas Interrupções habilitadas Início Fim Buscar próxima instrução Executar instrução Verificar interrupção: processar interrupção Figura 155 – Ciclo de instruções com interrupções Fonte: Stallings (2010, p. 62). No ciclo de instrução onde ocorrerão interrupções, o processador verifica se há algum sinal de interrupção. Se nenhuma interrupção ocorrer ou estiver pendente em um certo período, o processador pode seguir para a próxima etapa do ciclo de busca, que será ler a próxima instrução do programa em execução. Porém, se alguma interrupção estiver pendente, o processador executará as seguintes tarefas (STALLINGS, 2010): 184 Unidade II • Primeiro suspenderá o programa que está em execução e salvará o endereço da próxima instrução (indicada pelo program counter – PC) a ser executada ou qualquer outro dado relacionado à operação em atividade. • Depois irá armazenar no program counter o endereço inicial da rotina que será tratado a interrupção. Como observado na figura anterior, o ciclo de busca obtém a primeira instrução da rotina de tratamento de interrupção que irá atender à interrupção solicitada. Então, o tratador de interrupção determina qual é a finalidade da interrupção e executa as ações necessárias para sua realização. No exemplo da figura 153 (fluxo de interrupção de curta espera), o tratador define qual módulo de E/S foi o responsável pelo sinal de interrupção e desvia a solução para um programa que escreverá os dados no dispositivo de E/S. Quando a rotina de tratamento de interrupção terminar, o processador poderá retomar a execução do programa de usuário que estava em operação antes da interrupção justamente do ponto de parada. Esse tipo de operação de tratamento de interrupção geralmente engloba o uso excessivo de memória, conhecido como overhead; apesar disso, devido à quantidade de tempo relativamente grande envolvida no processo, o uso indevido de tempo do processador pode ser desperdiçado simplesmente pela longa espera de um sinal que envolva a comunicação do processador com algum dispositivo de E/S, tornando muito mais eficiente o uso de interrupções durante o processo. O tempo exigido para a operação de E/S será relativamente mais curto (interrupção de curta espera), ou seja, menos do que o tempo total para completar a execução das instruções entre as operações de escrita no programa de usuário. Situações com respostas mais lentas, como dispositivos de impressão, resultarão em operações de E/S com muito mais tempo de execução para uma sequência de instruções do usuário. A figura a seguir mostra uma situação em que o programa de usuário alcança a segunda chamada WRITE antes do término da primeira operação de E/S. O resultado dessa operação é que o programado usuário ficará travado nesse ponto, de modo que, quando a operação de E/S anterior tiver terminado, essa nova chamada WRITE será processada, fazendo com que uma nova operação de E/S seja iniciada. 185 ARQUITETURA DE COMPUTADORES MODERNOS Programa do usuário Write Write Write Programa de E/S Comando de E/S End Tratador de interrupção 1 2 5 4 3 Figura 156 – Fluxo de controle de programa com interrupções de longa espera Fonte: Stallings (2010, p. 61). Já a figura a seguir mostra o diagrama de ciclo de instruções revisado, onde é possível verificar a inclusão do ciclo de interrupção. Como pode ser observado, o processo se inicia geralmente com o cálculo do endereço da próxima instrução. Após esse primeiro estágio, são realizadas a busca da instrução e a decodificação dos operandos envolvidos no processo. 186 Unidade II Armazenamento do operando Busca do operando Busca da instrução Cálculo do endereço da instrução Cálculo do endereço do operando Decodificação da operação da instrução Cálculo do endereço do operando InterrupçãoVerificação da interrupção Operação dos dados Múltiplos operandos Instrução completa, busca a próxima instrução Retorna dados de string ou vetor Nenhuma interrupção Múltiplos resultados Figura 157 – Diagrama de ciclo de instruções com interrupções Fonte: Stallings (2010, p. 64). Na sequência, é realizado o cálculo do endereço de onde estão esses operandos para que eles sejam buscados e, finalmente, a operação de dados seja executada. O processo é finalizado com um novo cálculo do endereço para que seja possível armazenar o resultado em um novo operando. Note que, na figura, durante esse ciclo inicial não houve nenhuma interrupção, o que poderia ter ocorrido em qualquer momento do ciclo. Se houver uma interrupção, é possível observar que ela será atendida prioritariamente e um novo ciclo será iniciado com a busca da instrução de interrupção requerida. Após o término do tratamento da interrupção, o ciclo voltará a ser executado do estágio em que havia sido interrompido inicialmente. Lembrete As interrupções abordadas até o momento destacaram a ocorrência de interrupções simples, ou seja, que ocorrem uma a uma. 6.8.2 Interrupções múltiplas Em uma nova situação, podemos incorporar um caso em que ocorram múltiplas interrupções, em que um programa receberá dados de um controlador de linha de comunicações e precisará imprimir o resultado disso, de forma que a impressora gere uma interrupção toda vez que dados unitários chegarem. Nessa situação, pode‑se empregar duas técnicas para tratar as múltiplas interrupções. Na primeira, desativam‑se as interrupções enquanto uma interrupção já estiver sendo tratada, o que significa que o processador poderá ignorar qualquer tipo de sinal de requisição de interrupção novo. Se alguma interrupção ocorrer durante esse período, ela permanecerá pendente e será averiguada pelo processador após ele ter habilitado novamente as operações de interrupções. Depois que a rotina de tratamento de interrupção tiver sido finalizada, as interrupções são novamente habilitadas antes 187 ARQUITETURA DE COMPUTADORES MODERNOS que o programa de usuário dê continuidade do ponto da parada inicial, de modo que o processador verificará se houve interrupções adicionais durante o período em que as interrupções adicionais foram desabilitadas. Apesar de simples, essa técnica é muito boa, pois as interrupções são tratadas de forma sequencial, como pode ser observado na figura a seguir. Uma desvantagem dessa técnica é que ela não considera a prioridade relativa ou mesmo necessidades de tempo crítico em que, por exemplo, a entrada chega à linha de comunicações e precisa ser absorvida rapidamente para que seja liberado mais espaço para outras entradas, de forma que, se o primeiro lote de entrada não for processado antes da chegada do segundo lote, alguns dados ou todos poderão ser perdidos. Programa de usuário ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ Tratador de interrupção X ____ ____ ____ ____ ____ Tratador de interrupção Y ____ ____ ____ ____ ____ Figura 158 – Transferência de controle de execução de processos com interrupção sequencial Fonte: Stallings (2010, p. 65). Em uma outra técnica de interrupções múltiplas, definem‑se as prioridades de interrupção a fim de permitir que uma interrupção de maior prioridade possa ter um tratamento de interrupção distinto ao de menor prioridade, inclusive ocasionando a pausa deste último, como se observa na figura a seguir. Programa de usuário ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ Tratador de interrupção X ____ ____ ____ ____ ____ Tratador de interrupção Y ____ ____ ____ ____ ____ Figura 159 – Transferência de controle de execução de processos com interrupção aninhada Fonte: Stallings (2010, p. 65). 188 Unidade II Por exemplo, considere um sistema formado por três dispositivos de E/S (impressora, disco rígido e alguma linha de comunicação com dispositivos externos) constituídos com as prioridades 2, 4 e 5, respectivamente. Um usuário inicia uma tarefa em t = 0, e em t = 10 ocorre uma interrupção ocasionada pela impressora. A informação do usuário é posta na pilha do sistema, e a execução continua na rotina de serviço de interrupção, como mostra a figura a seguir. Programa de usuário ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ Rotina de serviço de interrupção de impressora ____ ____ ____ ____ ____ ____ ____ Rotina de serviço de interrupção de comunicação ____ ____ ____ ____ ____ Rotina de serviço de interrupção de disco ____ ____ ____ ____ ____ t = 0 t = 10 t = 15 t = 40 t = 25 t = 25 t = 35 Figura 160 – Sequência de tempo para múltiplas interrupções aninhadas Fonte: Stallings (2010, p. 66). Durante a execução dessa rotina, temos que em t = 15 ocorre uma interrupção de comunicação, de forma que, como a linha de comunicação possui prioridade maior se comparada à impressora, a interrupção será aceita. Sendo aceita a interrupção da impressora, seu estado será colocado na pilha de execução contínua. Contudo, para complicar a situação, ocorre uma nova interrupção de disco em t = 20 durante o processo em execução (serviço de comunicação). Como esse tipo de interrupção tem menor prioridade (disco rígido) do que o serviço de comunicação, ela será retida, e o serviço de comunicação será executado até o final. Quando o serviço de comunicação termina em t = 25, o estado anterior do processador (impressora) é restaurado. Entretanto, antes que uma instrução da rotina seja executada, o processador aceita a interrupção de disco rígido que estava em espera e que possuía maior prioridade que a impressora, transferindo o controle para a rotina de serviço de interrupção. Por fim, quando t = 40 (última rotina), o controle retorna para o programa de usuário, aguardando novas instruções. 6.9 Pipeline de instruções As etapas de pipeline podem ser entendidas como um processo de linha de montagem de uma fábrica, como na figura a seguir, onde um produto na linha de montagem passa por vários estágios que podem ser trabalhados de forma simultânea. Esse processo ficou conhecido como pipelining, pois, como em uma esteira, novas entradas serão aceitas em um lado da linha de fabricação antes que as entradas aceitas anteriormente apareçam finalizadas na saída do outro lado da linha de produção, ou seja, antes do término de todo o processo. 189 ARQUITETURA DE COMPUTADORES MODERNOS Figura 161 – Linha de montagem de placas‑mãe Disponível em: https://bit.ly/3DeMRwC. Acesso em: 24 jan. 2023. Aplicando esse conceito aos computadores, sabe‑se que uma instrução também possui vários estágios de processamento, como observado na figura anterior onde se nota a fabricação em série de placas‑mãe. Utilizando instruções a serem processadas como exemplo, considere dividir todo o processamento das instruções em apenas dois estágios: ler instrução e executar instrução. Nessecaso, haverá momentos durante a execução de uma instrução em que a memória principal não será acessada, ou seja, ficará ociosa. Essa “fatia” do tempo poderia ser usada para obter a próxima instrução, de forma paralela e não interferindo na execução da instrução atual, como está exemplificado na figura a seguir. Instrução Instrução Resultado Leitura Execução Figura 162 – Pipeline de instruções de dois estágios simplificados Fonte: Stallings (2010, p. 365). Como observado na figura anterior, o pipeline possui dois estágios independentes, e o primeiro deles obtém a instrução e a coloca em espera (buffer). Após o segundo estágio estar liberado, o primeiro estágio repassa para ele a instrução do buffer. Enquanto o segundo estágio está em execução, o primeiro aproveita qualquer ciclo de memória que não está sendo utilizado para obter a próxima instrução a ser executada e a coloca no buffer. Esse processo ficou conhecido como busca antecipada (prefetch) ou busca sobreposta (STALLINGS, 2010). Uma possível desvantagem nessa abordagem de tratamento de instruções em paralelo é a grande utilização de registradores que são aplicados para guardar não só instruções, mas também dados usados entre os estágios. Apesar disso, o processo de pipelining irá acelerar a execução das instruções, e se os estágios de leitura e execução tiverem o 190 Unidade II mesmo tempo de duração, o ciclo de instrução poderá ser reduzido pela metade do tempo. Porém, ao verificar o esquema da próxima figura, nota‑se que seria pouco provável dobrar a taxa de execução em razão dos seguintes aspectos: • O tempo de execução, que é maior do que o tempo de leitura da instrução, de forma que o estágio de leitura poderá ter que esperar por algum tempo antes de esvaziar seu buffer. • Uma instrução de desvio condicional pode ocorrer durante a execução da instrução, o que faz com que o endereço da próxima instrução, que ainda será obtida, não seja conhecido. Dessa forma, o estágio de leitura precisará esperar até que receba o endereço da próxima instrução contida no estágio de execução, daí o estágio de execução também precisará esperar até que a próxima instrução seja recebida. Instrução Instrução Resultado Leitura Execução Descartar Espera EsperaNovo endereço Figura 163 – Pipeline de instruções de dois estágios expandidos Fonte: Stallings (2010, p. 362). Nesse exemplo com desvio incondicional, uma instrução passa do estágio de leitura para o estágio de execução. O estágio de leitura obtém a próxima instrução na memória principal após a instrução de desvio; se o desvio requerido não for atendido, nenhum tempo será perdido durante o processo. Entretanto, se o desvio for atendido, a instrução ativa no processo poderá ser descartada e uma nova instrução será lida e executada. De fato, esses fatores podem reduzir a eficiência do processo de pipeline de dois estágios, mas algum ganho na aceleração ainda ocorrerá, de forma que, para obter mais velocidade, o pipeline deverá conter mais estágios a fim de tratar possíveis atrasos em estágios de forma individual. Para que o pipeline obtenha maior desempenho, mais estágios serão necessários, de forma que os estágios possam ser decompostos, possuindo menos operações a cada ciclo. Essa divisão de estágios varia em tamanho, de acordo com a capacidade do hardware de conter ou não mais registradores em seu processador, possibilitando maior armazenamento de instruções em um buffer. Um sistema de pipeline padrão é constituído por seis estágios, divididos em: • Buscar instrução (fetch instruction – FI): tem como objetivo ler a próxima instrução esperada em um buffer. • Decodificar instrução (decode instruction – DI): tem como meta determinar o código da operação (opcode) e a especificação dos operandos. 191 ARQUITETURA DE COMPUTADORES MODERNOS • Calcular operandos (calculate operand – CO): tem como fito o cálculo do endereço de cada operando. Essa operação pode envolver o endereçamento por deslocamento, o indireto por registrador, o endereçamento indireto pela memória e outros tipos. • Obter operandos (fetch operands – FO): tem como propósito obter cada operando da memória principal. Nesse caso, os operandos que estão nos registradores não precisarão ser lidos da memória. • Executar instrução (instruction execution – IE): tem como intuito executar a operação indicada após a obtenção dos operandos e armazena o resultado em algum local específico. • Escrever operandos (write operands – WO): tem como objetivo o armazenamento do resultado da operação na memória principal. A partir dessa decomposição de uma instrução, baseada em seis estágios, é possível quantificar qual o tempo de duração de cada etapa. A figura a seguir destaca essa situação hipotética de processamento paralelo utilizando o pipeline; vê‑se que é possível reduzir o tempo de execução das instruções em paralelo (tempo 14) em vez de executá‑las todas em série (enfileiradas). Tempo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Instrução 1 FI DI CO FO EI WO Instrução 2 FI DI CO FO EI WO Instrução 3 FI DI CO FO EI WO Instrução 4 FI DI CO FO EI WO Instrução 5 FI DI CO FO EI WO Instrução 6 FI DI CO FO EI WO Instrução 7 FI DI CO FO EI WO Instrução 15 FI DI CO FO EI WO Instrução 16 FI DI CO FO EI WO Figura 164 – Diagrama temporal para operação de instruções em paralelo Fonte: Stallings (2010, p. 366). O esquema apresentado na figura anterior mostra que cada instrução atravessa os seis estágios do pipeline e que todos os estágios podem ser executados em paralelo, supondo‑se também que não haverá em nenhum momento algum conflito de memória. Todavia, os estágios FI, FO e WO geralmente envolvem acesso à memória, o que implica que nesses casos os acessos podem ocorrer de forma simultânea, o que fará com que sistemas de memória não permitam tais acessos simultâneos. Porém, o valor desejado na operação pode estar contido na memória cache ou mesmo os estágios FO ou WO podem estar nulos, causando diversos conflitos, mas que, por sua vez, não irão desacelerar o processo de pipeline. 192 Unidade II Observação Outros fatores poderão limitar o desempenho no pipeline. Em uma situação real, os seis estágios não terão a mesma duração, ocasionando espera em vários estágios diferentes. Uma instrução de desvio condicional pode invalidar várias leituras de instruções, de modo semelhante ao mostrado no esquema da figura a seguir. Tempo Penalidade por desvio 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Instrução 1 FI DI CO FO EI WO Instrução 2 FI DI CO FO EI WO Instrução 3 FI DI CO FO EI WO Instrução 4 FI DI CO FO Instrução 5 FI DI CO Instrução 6 FI DI Instrução 7 FI Instrução 8 FI DI CO FO EI WO Instrução 9 FI DI CO FO EI WO Figura 165 – Diagrama temporal para operação de instruções em paralelo com desvio condicional Fonte: Stallings (2010, p. 367). Como ilustrado na figura anterior, o tempo 3 (eixo Y) representa um desvio condicional para a instrução 15 (eixo X). Antes de a instrução ser executada não há como prever qual instrução entrará na sequência. Dessa forma, o pipeline irá carregar a próxima instrução (instrução 4) na sequência e prosseguirá com o carregamento das próximas instruções. Na figura 164 não ocorre nenhum desvio; assim, houve um benefício total do aumento do desempenho do pipeline. Entretanto, na figura anterior o desvio ocorre sem ser interpretado até o fim da unidade de tempo 7 (eixo Y), sendo que nesse ponto será necessário que o pipeline seja limpo das instruções que não serão úteis. Assim, durante o tempo 8 (eixo Y) a instrução 15 (eixo X) entra no pipeline, fazendo com que nenhuma instrução seja completa durante as unidades de tempo de 9 a 12 (eixo Y). Isso caracteriza uma penalidade de desempenho do pipeline, pois não foi possível, durante todo o processo, antecipar o desvio como sendo uma interrupção a ser tratada pelo tratador de interrupção e depois retornar ao ponto da parada do processo. Como observado, o fato de “limpar” as instruções do pipeline fazcom que os dados e instruções já carregados no processo possivelmente sejam perdidos (STALLINGS, 2010). A figura a seguir mostra, na forma de um fluxograma, a lógica necessária no funcionamento do pipeline para computar desvios e interrupções. 193 ARQUITETURA DE COMPUTADORES MODERNOS Desvio ou interrupção? Desvio não condicional? Busca instrução Decodificar instrução Calcular operandos Buscar operandos Executar instrução Escrever operandos Atualizar PC Esvaziar pipeline Sim Sim EO EI OO CO DI OI Não Não Figura 166 – Pipeline de seis instruções com desvio condicional Fonte: Stallings (2010, p. 368). Algumas situações que antes não eram vistas no pipeline com somente dois estágios surgem com o aumento do número de estágios. O estágio calcular operandos (CO) pode ter que depender do conteúdo de um registrador que é alterado por uma instrução anterior que ainda esteja contida no pipeline. Outros conflitos podem ocorrer com registradores e a memória principal, de modo que o sistema operacional que gerencia todos os dispositivos também precisa lidar com esses conflitos. A partir dos exemplos de pipeline discutidos, é possível concluir o seguinte: quanto maior o número de estágios do pipeline, maior será a taxa de execução de instruções, aumentando seu desempenho de processamento paralelo. Além disso, outras conclusões podem ser obtidas: 194 Unidade II • A cada estágio do pipeline existirá algum esforço extra na movimentação de dados de um sistema de buffer para outro para efetuar a entrega de dados. Esse esforço desacelera o tempo total de execução de uma única instrução, o que melhora o desempenho em situações em que as instruções sequenciais são dependentes umas das outras ou mesmo pelo uso demasiado de desvios de acesso à memória principal. • A lógica de controle necessária para lidar com a dependência de memória e registradores, além de otimizar o uso do pipeline, aumentará em razão do número de estágios. Outro fator a ser considerado é o aumento de tempo gasto pelos buffers de pipeline, que elevarão o tempo total do ciclo de instruções. Por fim, a conclusão é que o pipeline de fato é uma técnica muito poderosa para melhorar o desempenho de um processador; em contrapartida, o projeto requer muitos cuidados para que sejam alcançados bons resultados, devido à atual complexidade dos sistemas. 6.9.1 Desempenho do pipeline Para obter o cálculo do desempenho do pipeline, inicialmente é preciso definir quais parâmetros estão envolvidos no processo. O tempo de ciclo (tau) de uma instrução de pipeline é definido como o tempo necessário para que uma instrução avance um estágio no processo, de modo que cada coluna (eixo Y) nas figuras 164 e 165 simbolizava um tempo de ciclo. Assim, o tempo de ciclo do pipeline pode ser definido como: τm = max[τi] + d para 1 < i < k Em que: • τi é o tempo de demora de resposta do circuito no estágio i do pipeline; • τmé o tempo de demora máximo de resposta do estágio; • k é o número de estágios no pipeline; • d é o tempo de resposta do ciclo utilizado para avançar de um estágio para outro. Rearranjando a expressão de modo a isolar para descobrir o tempo gasto em cada ciclo de instrução unitário (buscar, decodificar, executar etc.), temos: τi= τ ‑ d 195 ARQUITETURA DE COMPUTADORES MODERNOS Exemplo de aplicação Qual é o tempo estimado de resposta de um único ciclo, dado que o computador em operação possua frequência de clock τ = 20 MHz e um tempo estimado para transição entre estágios d = 33,45 ns? Resolução Colocando os valores em notação científica: 20 x 106 Hz e 33,45 x 10‑9 segundos, e substituindo na equação modificada, lembrando que: τ = = 20 x 106 1 f 1 50 x 10‑9 segundos ou 50 ns (nanossegundos) Tem‑se: τi 50 x 10 ‑9 – 33,45 x 10‑9 = 16,55 x 10‑9 segundos ou 16,55 ns (nanossegundos) Suponha agora que n instruções serão processadas sem nenhum desvio. Considere Tk,n o tempo total necessário para que um pipeline que possua k estágios processe n instruções, como: τkn = [k + (n ‑ 1)] τ Um total de k ciclos é exigido para que se complete a execução da primeira instrução, de modo que o restante de n – 1 instruções irá requerer n – 1 ciclos? Essa equação pode ser obtida através do entendimento da figura 164, em que se nota que a instrução nove completará o ciclo no tempo quatorze, resultando em: 14 = [(6 + (9 – 1)]. Em uma nova situação, considere que um processador possua funções equivalentes ao exemplo anterior, entretanto sem o uso do pipeline. Suponha ainda que o tempo de ciclo da instrução seja kτ. Então, será necessário calcular o fator de aceleração, também conhecido como Speedup, para as instruções do pipeline, comparado com a execução sem pipeline, definido como: Speedup = [k + (n‑1)] τ nkτ Nota‑se na equação anterior que o valor ocorre tanto no numerador quanto no denominador e pode ser cortado, resultando em: Speedup = [k + (n‑1)] nk 196 Unidade II Exemplo de aplicação Qual será o Speedup para um computador que possua um pipeline de k = 6 estágios e é solicitado que ele execute n = 320 instruções? Qual será o tempo total (em milissegundos) para que todas as instruções sejam executadas? Considere também que um outro computador execute as mesmas n = 320 instruções, entretanto utilizando um pipeline de k = 3 estágios. Ao final, faça um comparativo do desempenho dos dois computadores, levando em consideração a influência que o número de estágios produz no resultado. Resolução Para o primeiro computador, n = 320 e k = 6. Speedup = [6 + (320‑1)] 320.6 = 5,90 ms Para o segundo computador, n = 320 e k = 3. Speedup = [3 + (320‑1)] 320.3 = 2,98 ms De acordo com os resultados obtidos, percebe‑se que houve um ganho de 1,98 na aceleração do processamento das instruções para o computador com apenas k = 3 estágios em comparação com o computador que possuía k = 8 estágios. • Observação 1: o ganho foi obtido através da divisão dos resultados. • Observação 2: o ganho é adimensional e não possui unidade de medida. Entretanto, esse ganho pode não ser de fato o real, pois não há como garantir que o desempenho em cada estágio será o mesmo ou melhor do que o outro estágio unitário, podendo haver atrasos, incluindo perda de tempo de processamento. Assim, um estágio que possui como objetivo buscar uma instrução não terá o mesmo tempo de duração que um outro estágio, por exemplo, se comparado com o estágio de execução. Além disso, diminuir o número de estágios implica que os estágios reduzidos terão muito mais funcionalidades, aumentando seu tempo operacional. Outro grau comparativo que também pode ser abordado é o uso da mesma quantidade de estágios em um computador, somente variando a quantidade de instruções envolvidas. Nessa situação, como o computador utilizaria o mesmo número de estágios, obviamente que operar menos instruções geraria um ganho real. Assim, em algumas situações o ganho pode até diminuir devido a fatores como: • aumento de custo computacional na implementação; • atrasos possíveis entre estágios do pipeline; • atrasos ocorridos no processo de esvaziamento do pipeline. 197 ARQUITETURA DE COMPUTADORES MODERNOS A figura a seguir mostra o fator de aceleração (Speedup) como uma função do número de instruções que são executadas sem desvio. Como observado, no limite n → ∞ (lê‑se “n tendendo ao infinito”), tem‑se uma aceleração pelo fator k. Fa to r d e ac el er aç ão Número de instruções (Escala logarítmica) k = 12 estágios k = 9 estágios k = 6 estágios 2 4 8 16 32 64 1281 12 10 8 6 4 2 0 Figura 167 – Fator de aceleração em função do número de instruções em escala logarítmica Fonte: Stallings (2010, p. 370). Já a figura a seguir mostra o fator de aceleração como uma função do número de estágios no pipeline da instrução. Nesse exemplo, o fator de aceleração se aproxima do número de instruções que podem ser utilizadas no pipeline sem desvios. Dessa forma, hipoteticamente, quanto maior o número de estágiosde pipeline, maior será a aceleração. Contudo, em termos práticos, os ganhos reais dos estágios adicionais do pipeline podem ser confrontados pelo aumento do custo de tempo e computacional, além de possíveis atrasos entre estágios, porque os desvios geralmente requerem o esvaziamento do pipeline, que deverá ser recarregado com novas instruções. Fa to r d e ac el er aç ão Número de estágios n = 30 instruções 5 10 15 200 14 12 10 8 6 4 2 0 n = 20 instruções n = 10 instruções Figura 168 – Fator de aceleração em função do número de instruções Fonte: Stallings (2010, p. 370). 198 Unidade II Considerando o número de ciclos necessários para executar um conjunto de instruções, a priori pode até parecer que o pipeline não melhora o desempenho de execução de um processador. Ao se projetar um pipeline, aumenta‑se o número de ciclos de clock necessários para executar um dado programa, pois algumas funções ficam aprisionadas no pipeline aguardando que as instruções que geram suas entradas sejam executadas. Assim, a duração do ciclo em um processador que utiliza o pipeline ficará dependente de quatro fatores: • duração do ciclo de clock; • número de estágios do pipeline; • homogeneidade na divisão de tarefas entre os estágios do pipeline; • latência dos latches (registradores encarregados de armazenar dados temporários). Exemplo de aplicação Considere um processador que não tenha em sua estrutura o uso do pipeline. Esse processador possui duração de ciclo de clock de 100 ms (milissegundos ou x 10‑6 segundos). Qual será a duração do ciclo de uma versão desse processador com pipeline de 6 estágios divididos homogeneamente se cada latch tem uma latência de 1 ms? Suponha também, em uma outra situação, um processador dividido em 20 estágios de pipeline com o mesmo tempo de 1 ms de latência de latch. Resolução Para o primeiro caso, com um sistema sem pipeline possui tempo de ciclo de 100 ms, se considerar os 3 estágios e a latência de 1 ms, tem‑se (CARTER, 2002): Duração do ciclo com pipeline = 6 estágios 100ms + 1ms Reescrevendo em notação científica, temos: 6 estágios 100 x 10‑6 + 1 x 10‑ 6 = 1,76 x 10‑ 5 segundos. ou 17,66 x 10‑6 segundos, o que equivale a 17,66 ms em notação científica. Para o segundo caso, em que a duração do ciclo sem pipeline também é 100 ms, porém aumentando‑se o número de estágios para 30, tem‑se: Duração do ciclo com pipeline = 20 estágios 100 ms +1 ms = 6 ms Enquanto o pipeline pode reduzir a duração do ciclo de um processador, elevando a taxa de rendimento das instruções, ele aumenta a latência do processador em, pelo menos, a soma de todas as latências dos latches. A latência de um pipeline é a soma do tempo que uma única instrução demora para passar através do pipeline, o que é o produto do número de estágios pela duração de ciclo de clock. 199 ARQUITETURA DE COMPUTADORES MODERNOS 6.9.2 Hazards de pipeline São definidos como eventos em que a próxima instrução de pipeline não poderá ser executada no ciclo de clock seguinte, o que irá causar um efeito “bolha” no pipeline. Isso ocorre devido a alguma parte do processo de pipeline precisar parar de executar por alguma situação que não permite sua execução contínua (sem interrupção), por exemplo, um desvio (interrupção de uma etapa do pipeline para execução de outra etapa de outra instrução em espera). Os hazards de pipeline são subdivididos em três categorias: de recursos, de dados e de controle (STALLINGS, 2010). Hazard de recursos Conhecido como hazard estrutural, esse tipo de bolhas de recursos ocorre quando duas ou mais instruções, que já estão no pipeline, necessitam do mesmo recurso resultando que as instruções precisarão ser executadas em série em vez de paralelo, o que, como já abordado, piora seu desempenho. Suponha um pipeline simples contendo cinco estágios, em que cada estágio ocupa um ciclo de clock, como mostra a figura a seguir. Em uma situação idealizada, uma nova instrução entra no pipeline a cada ciclo de clock. Ciclo de clock 1 2 3 4 5 6 7 8 9 In st ru çã o I1 FI DI FO EI WO I2 FI DI FO EI WO I3 FI DI FO EI WO I4 FI DI FO EI WO Figura 169 – Hazard de recursos de cinco estágios Fonte: Stallings (2010, p. 371). Suponha em um outro caso em que a memória principal tenha uma única porta de entrada/saída, ou seja, responsável por realizar as leituras e escritas de instruções e que deva ser executada uma a uma. Nessa situação, uma leitura ou escrita do operando na memória principal não poderá ser executada em paralelo, como exemplificado na figura a seguir. Nessa situação, assume‑se que o operando de origem para a instrução I1 no eixo y da figura a seguir está na memória principal em vez de estar alocado em algum registrador. Assim, o estágio responsável pela busca de uma instrução deverá ficar ocioso por um ciclo de instrução antes de começar a busca da instrução para a instrução I3. Ciclo de clock 1 2 3 4 5 6 7 8 9 In st ru çã o I1 FI DI FO EI WO I2 FI DI FO EI WO I3 Ocioso FI DI FO EI WO I4 FI DI FO EI WO Figura 170 – Hazard de recursos de cinco estágios com operando de origem na memória Fonte: Stallings (2010, p. 371). 200 Unidade II Outro conflito de recurso pode ocorrer quando várias instruções estão prontas para entrar na fase de execução da instrução, entretanto só há uma ULA disponível. Uma solução para essa bolha de recursos é aumentar os recursos disponíveis, por exemplo, ter múltiplas portas para acesso à memória principal ou para a ULA. Hazard de dados Uma bolha de dados irá ocorrer quando houver um conflito no acesso de uma posição na memória de algum operando. Um hazard de dados também pode ser definido da seguinte forma: duas instruções de um programa estão a ponto de serem executadas na sequência, de modo que ambas as instruções acessam um determinado operando localizado ou na memória ou em algum registrador ao mesmo tempo. Contudo, se as instruções são executadas em um pipeline, então possivelmente o valor do operando será atualizado de forma que produza um resultado diferente do que o esperado do obtido por uma instrução em série. Isso tudo pode ser traduzido como um programa que gera um resultado incorreto para o usuário devido ao uso do pipeline. Pode‑se tomar como exemplo uma sequência de instruções em uma máquina com arquitetura x86. A primeira instrução no exemplo irá somar o conteúdo dos registradores EAX e EBX e armazenar o resultado em EAX. A segunda instrução irá subtrair o conteúdo EAX de ECX e armazenar o resultado em ECX. A figura a seguir mostra como será o comportamento desse pipeline. Ciclo de clock 1 2 3 4 5 6 7 8 9 10 ADD, EAX, EBX FI DI FO EI EO SUB ECX, EAX FI DI Ocioso FO EI WO I3 FI DI FO EI WO I4 FI DI FO EI WO Figura 171 – Hazard de dados Fonte: Stallings (2010, p. 372). Como mostra a figura 171, a instrução de soma ADD não atualiza EAX até o fim do estágio cinco, que ocorre no ciclo cinco de clock (eixo X). Todavia, a instrução de subtração (SUB) necessita desse valor no começo de seu estágio dois, que ocorre no ciclo quatro de clock. Assim, para manter a operação de forma correta, o pipeline deverá atrasar dois ciclos de clock. Então, na falta de hardware disponível e de algoritmos específicos que evitem esse tipo de problema, o hazard de dados poderá resultar em um uso ineficiente do pipeline. O hazard de dados pode ainda ser subdividido em três tipos: • Leitura após escrita ou dependência verdadeira: quando uma instrução modificará o conteúdo de um registrador ou de uma posição da memória principal de modo que uma instrução subsequente irá ler os dados dessa posição. Nessa situação, a operação de leitura ocorre antes de a operação de escrita ter sido completada. 201 ARQUITETURA DE COMPUTADORES MODERNOS • Escrita após leitura ou antidependência: caso em que uma instrução irá ler o conteúdo de um registrador ou posição da memória e uma instrução subsequente será escrita nessa posição. Nessa situação, o hazard ocorre se a operaçãode escrita for completada antes da operação de leitura. • Escrita após escrita ou dependência de saída: caso em que duas instruções escrevem dados ou instruções na mesma posição (memória ou registrador). O problema nesse caso ocorre quando as operações de escrita são executadas na sequência inversa da qual era esperada. Hazard de controle Uma bolha de controle, conhecida também como hazard de desvio, ocorre quando o pipeline toma uma decisão equivocada ao tentar prever algum tipo de desvio e, dessa forma, trazer instruções que precisarão ser descartadas para dentro do pipeline. 6.9.3 Previsão de desvio em pipeline Um dos problemas ao se implementar um projeto otimizado de pipeline é garantir um fluxo estável e contínuo de instruções para os estágios iniciais do pipeline, o que é geralmente afetado por desvios condicionais. Assim, até que a instrução seja de fato executada, é quase impossível prever se o desvio para uma outra instrução será tomado ou não. Essa indecisão sobre a tomada de decisão para desvios, que podem afetar o desempenho do pipeline, pode ser implementada através de soluções com as seguintes abordagens: múltiplos fluxos, busca antecipada do alvo de desvio, buffer de laço de repetição, previsão de desvio e desvio atrasado. Os múltiplos fluxos Mesmo um pipeline simplificado possuirá atrasos (penalidades) na execução de uma instrução, pois durante a busca por duas ou mais instruções algumas delas podem estar incorretas. Nessa situação, uma possível abordagem envolve um esforço do tipo força bruta, que replica as partes iniciais do pipeline e permite que as instruções corretas sejam obtidas, mantendo assim o uso de dois fluxos. No entanto, ainda existem dois problemas com essa abordagem: • Devido aos múltiplos pipelines, ainda existirão atrasos no acesso à memória principal ou aos registradores. • Algumas instruções de desvio adicionais também podem entrar no pipeline antes mesmo da solução da tomada de decisão referente ao desvio original, o que ocasionaria fluxos adicionais e desnecessários para tomadas de decisão. Apesar das desvantagens apresentadas, a estratégia de múltiplos fluxos ainda pode melhorar o desempenho do pipeline, como os obtidos nas máquinas IBM 370/168 e IBM 3033. 202 Unidade II Busca antecipada do alvo de desvio Após um desvio condicional ser reconhecido durante o processo, o alvo do desvio condicional é lido antecipadamente. Assim, o alvo é salvo até que a instrução de desvio seja executada completamente, de maneira que, se o desvio for tomado, o alvo já terá sido obtido. Buffer de laço de repetição É um pequeno e rápido espaço de memória (buffer) mantido no estágio de busca de instrução e que contém n instruções recentemente lidas na sequência. Dessa forma, se um desvio está a ponto de ser tomado, o hardware verifica se o alvo do desvio está no buffer. Assim, se estiver, a próxima instrução será obtida do buffer. Nessa abordagem, o buffer de laço de repetição traz alguns benefícios: • Por meio da busca antecipada, o buffer de laço irá conter algumas instruções na sequência, antes do endereço da instrução atual. Dessa forma, as instruções obtidas na sequência ficarão disponíveis, sem a necessidade do uso do tempo para acesso à memória principal. • Se, porventura, o desvio para o alvo estiver contido em apenas algumas posições na frente do endereço da instrução de desvio, então o alvo já estará no buffer, o que é muito útil em ocorrências de tomadas de decisão IF‑THEN‑ELSE. • Se, porventura, o buffer de laço de repetição for muito grande para conter todas as instruções do laço, então essas instruções precisarão estar disponíveis na memória apenas uma vez, logo na primeira iteração. Nas demais iterações, todas as instruções necessárias já estarão no buffer. O buffer de laço de repetição pode ser compreendido como uma memória cache dedicada somente para instruções. A única diferença é que o buffer de laço pode guardar apenas instruções na sequência; além disso, ele possui um tamanho e custo menor se comparado com uma memória propriamente cache. Previsão de desvio As abordagens baseadas em previsão de desvio podem se valer do uso de várias técnicas, como: previsão nunca tomada, previsão sempre tomada, previsão por código de operação (opcode), chave tomada/não tomada e tabela de histórico de desvio. As três primeiras abordagens são estáticas e não dependem do histórico de execução até ocorrer a instrução de desvio condicional. Já as duas últimas abordagens (chave tomada/não tomada e tabela de histórico de desvio) são dinâmicas, o que significa que dependerão do histórico da execução. Nas situações mais simples como a previsão nunca tomada e previsão sempre tomada, assume‑se que o desvio nunca será tomado e continuarão se valendo da obtenção das instruções sequencialmente, ou também se pode assumir que o desvio será tomado, obtendo‑se o alvo do desvio para ser tratado. 203 ARQUITETURA DE COMPUTADORES MODERNOS Observação Alguns estudos que lidam com o tratamento de desvio e seu comportamento indicam que os desvios condicionais nos programas são tomados em cerca 50% das ocasiões, de maneira que, se o custo de uma busca antecipada dos dois caminhos for o mesmo, a realização da busca antecipada no mesmo endereço do alvo do desvio pode, de fato, oferecer um ganho no desempenho. Ao realizar‑se uma busca, utilizando por exemplo uma memória virtual como a paginação, poderá ocorrer uma falha na página de busca, o que trará como consequência alguma penalidade no desempenho (STALLINGS, 2010). A abordagem estática toma uma decisão baseada no código de operação da instrução de desvio, de modo que o processador assumirá que o desvio realizado será executado somente para alguns códigos de operações, e não para outros, reportando uma taxa de sucesso superior a 75%. Já as abordagens dinâmicas tentam melhorar não só o desempenho como a precisão da previsão, principalmente armazenando um histórico de instruções de desvios condicionais contidas em um programa. Por exemplo, alguns bits podem ser associados com cada instrução de desvio condicional referente ao histórico recente da instrução. Esses bits, conhecidos como uma chave tomada/não tomada, direcionam o processador a tomar uma decisão na próxima vez que a instrução desejada for encontrada. Geralmente, esses bits contidos no histórico não são associados com a instrução na memória principal, mas sim guardados em um armazenamento temporário. Outra possibilidade seria associar esses bits com qualquer instrução de desvio condicional que esteja associada em uma memória cache. Assim, quando a instrução for substituída na cache, o seu histórico será perdido. Entre outras possibilidades, é possível manter uma tabela com instruções de desvio recentemente executadas. Assim, o processador pode acessar a tabela usando os bits de ordem mais baixa do endereço da instrução de desvio condicional. Com apenas um bit, o que pode ser guardado se refere à última execução dessa instrução, que resultou em um desvio condicional ou não. Logicamente que há desvantagens nessa abordagem, uma delas é que usar um bit único pode levar a instrução de desvio a sempre tomar como uma instrução um loop repetitivo. Além disso, com apenas um bit no histórico, um erro de previsão de desvio ocorrerá duas vezes para cada uso do loop: uma vez ao entrar no loop e outra vez ao sair do loop. Se dois bits forem utilizados, então sua função será guardar o resultado das duas últimas instâncias da execução da instrução associada ao processo no momento. A figura a seguir mostra um fluxograma representando o comportamento de uma previsão de desvio. Iniciando o fluxograma a partir da leitura da próxima instrução do desvio condicional, à medida que cada instrução de desvio condicional na sequência for tomada, o processo de decisão poderá prever se o próximo desvio será tomado. 204 Unidade II Desvio tomado? Sim Desvio tomado? Ler próxima instrução de desvio condicional Preverque não será tomado Prever que não será tomado Sim Não Ler próxima instrução de desvio condicional Desvio tomado? Ler próxima instrução de desvio condicional Prever que será tomado Prever que será tomado Não Sim Não Desvio tomado? NãoSim Ler próxima instrução de desvio condicional Figura 172 – Fluxograma contendo tomadas de decisão para previsões de desvio Fonte: Stallings (2010, p. 375). Se durante o processo uma única previsão estiver errada, então o algoritmo continuará prevendo que o próximo desvio também será tomado. Logo, apenas se dois ou mais desvios seguidos não forem atendidos, isso fará com que o algoritmo seja direcionado para o lado direito do fluxograma. Somente nos casos em que o algoritmo contiver duas previsões erradas é que ele irá de fato mudar sua decisão de previsão. A figura a seguir ilustra uma forma mais compacta para a previsão de desvios que pode ser obtida através da representação de máquina de estados finitos. 205 ARQUITETURA DE COMPUTADORES MODERNOS Prever que será tomado Prever que não será tomado Prever que não será tomado Prever que não será tomado To m ad o Nã o to m ad o Tomado Não tomado Não tomado Tomado Não tomado Tomado Figura 173 – Previsão de desvio baseado em máquinas de estados finitos Fonte: Stallings (2010, p. 375). Ao utilizar o histórico de desvios, algumas desvantagens podem ocorrer: se houver uma decisão de aceitar e tomar o desvio, a instrução alvo não poderá ser obtida até que o endereço do alvo seja decodificado. Obtém‑se uma eficiência maior no processo se a leitura da instrução for iniciada assim que a decisão de desvio tomada for realizada. Para isso, mais informações do processo precisam ser salvas no buffer de alvo do desvio ou em uma tabela de histórico de desvio. Saiba mais Conheça um pouco mais sobre processamento paralelo em: PROCESSAMENTO paralelo chega aos computadores de mesa. Inovação Tecnológica, 2007. Disponível em: https://bit.ly/3GJqtfu. Acesso em: 18 jan. 2023. 6.10 Princípios da linguagem de montagem Uma linguagem de montagem é definida como uma codificação de baixo nível e nela cada declaração (instrução) produzirá exatamente uma operação, ou seja, existe uma correspondência um‑para‑um entre as instruções de máquina e as declarações obtidas no programa de montagem. Dessa forma, se para cada linha no código em linguagem de montagem houver uma declaração e para cada palavra de máquina houver uma instrução, então um código em linguagem de montagem terá n linhas e produzirá um código em linguagem de máquina de n instruções (TANENBAUM; AUSTIN, 2013). As linguagens de montagem fazem parte da estrutura de todos os computadores modernos. Esse tipo de linguagem possui características diferentes quando comparado aos demais níveis da arquitetura de um computador, por exemplo, nível Instruction Set Architecture (ISA – arquitetura do conjunto de instrução) ou nível de sistema operacional, pois se implementa através da tradução em vez de uma 206 Unidade II interpretação. Os tradutores são programas que convertem um código em nível de usuário em um outro programa. A linguagem na qual o código original é escrito denomina‑se linguagem‑fonte e, por sua vez, a linguagem na qual esse código é convertido denomina‑se linguagem‑alvo. Outra diferença entre as linguagens é que, na tradução, o código original na linguagem‑fonte não é executado diretamente, pois primeiro ele é convertido para um programa equivalente, denominado programa‑objeto ou programa binário executável. Essa tarefa de conversão é realizada somente após a conclusão da tradução, gerando, nesses casos, duas etapas distintas: • geração de um programa equivalente na linguagem‑alvo; • execução do programa recém‑gerado na linguagem‑alvo. Essas etapas não ocorrerão simultaneamente, pois a segunda etapa só pode iniciar após a conclusão da primeira. Já no processo de interpretação, só há uma etapa, que é a execução do programa‑fonte original. Assim, não é preciso gerar, com alguma antecedência, qualquer código equivalente, mesmo que em algumas situações exista a necessidade de o programa‑fonte ser convertido para alguma forma intermediária de codificação, como ocorre na linguagem de programação de alto‑nível como o Java e seus bytecodes. Os tradutores são geralmente divididos em dois grupos: • Assembler (montador): nessa situação, a linguagem‑fonte se baseia em uma representação simbólica para uma linguagem de máquina numérica. • Assembly: expressa a linguagem de montagem legível para o ser humano e é utilizada para programar códigos específicos identificados pelas máquinas. Observação O uso da linguagem de montagem é justificado pela dificuldade em se programar diretamente em código binário (0’s e 1’s) ou mesmo em codificação hexadecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F), dificultando seu manuseio pelo usuário final. É muito mais simples para um usuário final trabalhar com nomes ou abreviaturas simbólicas (mnemônicos) como ADD, SUB, MUL e DIV para operações de soma, subtração, multiplicação e divisão do que utilizar valores numéricos em binários como os usados pela máquina. Os tipos mais comuns de operações em linguagem de máquina são: transferência de dados, aritmética, lógica, conversão, E/S, controle do sistema e transferência de controle. O quadro seguir mostra os tipos mais comuns de operações aplicadas em linguagens de máquina. 207 ARQUITETURA DE COMPUTADORES MODERNOS Quadro 3 – Operações lógicas e aritméticas do conjunto de instruções Tipo Nome da operação Descrição Transferência de dados Move (transferência) Transfere palavra ou bloco da origem ao destino Store (armazenamento) Transfere palavra do processador para a memória Load (busca) Transfere palavra da memória para o processador Exchange (troca) Troca o conteúdo da origem e do destino Clear (reset) Transfere palavra de 0s para o destino Set Transfere palavra de 1s para o destino Push Transfere palavra da origem para o topo da pilha Pop Transfere palavra do topo da pilha para o destino Aritmética Soma Calcula a soma de dois operandos Subtração Calcula a diferença de dois operandos Multiplicação Calcula o produto de dois operandos Divisão Calcula o quociente de dois operandos Absoluto Substitui o operando pelo seu valor absoluto Negativo Troca o sinal do operando Incremento Soma 1 ao operando Decremento Subtrai 1 do operando Lógica AND Realiza o AND lógico OR Realiza o OR lógico NOT (complemento) Realiza o NOT lógico Exclusive‑OR Realiza o XOR lógico Test Testa condição especificada; define flag(s) com base no resultado Compare Comparação lógica/aritmética de dois ou mais operandos; define flag(s) com base no resultado Definir variáveis de controle Classe de instruções para definir controles para fins de proteção, controle etc. Shift Desloca o operando para a esquerda (direita), introduzindo constantes na extremidade Rotate Desloca ciclicamente o operando para a esquerda (direita), de uma à direita Fonte: Stallings (2010, p. 18). 208 Unidade II Quadro 4 – Principais operações de controle e transferência de dados do conjunto de instruções Tipo Nome da operação Descrição Transferência de controle Jump (desvio) Transferência incondicional; carrega PC com endereço especificado Jump condicional Testa condição especificada ou carrega PC com endereço especificado Jump para sub‑rotina Coloca informação do controle do programa atual em local conhecido Return Substitui conteúdo do PC por outro registrador de local conhecido Execute Busca operando do local especificado e executa como instrução Skip Incrementa o PC para saltar para a próxima instrução Skip condicional Testa condição especificada; ou salta ou não faz nada, com base na condição Halt Termina a execução do programa Wait (hold) Termina a execução do programa; testa condição especificada repetidamente No operation Nenhuma operação é realizada, mas a execução do programa continua Entrada/SaídaInput (leitura) Transfere dados da porta de E/S ou dispositivo especificado para o destino Output (escrita) Transfere dados da origem especificada para porta de E/S ou dispositivo Start I/O Transfere instruções para o processador de E/S para iniciar operação de E/S Test I/O Transfere informações de estado do sistema de E/S para o destino especificado Conversão Translate Traduz valores em uma seção da memória com base em uma tabela de correspondências Convert Converte o conteúdo de uma palavra de uma forma para outra Fonte: Stallings (2010, p. 18). Lembrete Um desenvolvedor que utiliza linguagem de montagem pode atribuir nomes simbólicos a endereços da memória RAM e deixar que o assembler (emulador para assembly) se ocupe em fornecer os valores numéricos corretos. As linguagens de montagem possuem outras propriedades além do mapeamento de declarações um‑para‑um. Diferentemente de quem desenvolve em linguagens de alto nível, o desenvolvedor em linguagem de montagem possuirá acesso a todos os recursos e instruções disponíveis na máquina‑alvo. As linguagens de montagem possuem acesso completo ao hardware, além de facilitar a configuração de várias aplicações de hardware embarcado (embedded systems). Assim, tudo o que pode ser realizado em linguagem de máquina também pode ser feito em linguagem de montagem; entretanto, muitas instruções, registradores ou outros recursos não estarão disponíveis para uso por um programador de linguagem de alto nível. Nem tudo é vantagem nas linguagens de montagem. Linguagens de alto nível podem, a princípio, ser executadas em todos os computadores atuais, porém linguagens de montagem só podem ser executadas em uma família específica de máquinas, como a família Intel x86 ou a família Advanced 209 ARQUITETURA DE COMPUTADORES MODERNOS Risc Machine (ARM). Já em se tratando de codificação, a estrutura de uma declaração em linguagem de montagem é parecida com a estrutura de linguagem de máquina, de forma que praticamente todas as operações aritméticas e lógicas podem ser representadas em linguagem de montagem sem problemas de identificação. A tabela a seguir mostra alguns fragmentos de programas de linguagem de montagem em uma arquitetura do tipo x86 com o objetivo de efetuar o cálculo N = I + J. Tabela 9 – Cálculo de N = I + J na arquitetura Intel x86 Etiqueta Opcodes Operandos Comentários Fórmula: MOV EAX,I ;registrador EAX=I ADD EAX,J ;registrador EAX=I+J MOV N,EAX ;N=I+J I DD 3 ;reserve 4 bytes com valor inicial 3 J DD 4 ;reserve 4 bytes com valor inicial 4 N DD 0 ;reserve 4 bytes com valor inicial 0 Fonte: Tanenbaum e Austin (2013, p. 416). Nesse exemplo, as declarações são comandos requeridos para o assembler reservar memória para as variáveis I, J e N. Nesse caso, são necessários no máximo dois endereços de memória para referenciar os operandos de origem. Os resultados dessas operações precisam ser armazenados, o que sugere a exigência de um terceiro endereço a ser definido para abrigar o operando de destino. Após o término de uma instrução, a próxima instrução precisará ser buscada e seu endereço também será necessário para realizar a operação. Através dessa linha de raciocínio, observa‑se que uma instrução pode conter quatro referências de endereços, sendo dois operandos de origem, um operando de destino e o endereço da próxima instrução. Na figura a seguir, é possível observar uma comparação entre instruções típicas de um, dois e três endereços de operandos, os quais são usados para realizar o cálculo: Y = (A‑b) C+(D . E) . Instrução Comentário SUB Y, A, B Y ← A ‑ B MPY T, D, E T ← D × E ADD T, T, C T ← T + C DIV Y, Y, T Y ← Y ÷ T Figura 174 – Programa para executar a operação aritmética utilizando três operandos de endereçamento Fonte: Stallings (2010, p. 290). Nesse exemplo, observa‑se o início do programa realizando uma operação aritmética de subtração SUB Y, A, B, em que os conteúdos de A e B são subtraídos e armazenados temporariamente no operando Y. Na linha seguinte, é feita a operação de multiplicação de MPY D, E, armazenando o resultado da operação em T. A penúltima operação envolve a adição do resultado contido na 210 Unidade II multiplicação e armazenada em T, somado ao operando C e armazenando o resultado da operação também em T. Para finalizar a operação, o resultado da subtração (A – B) armazenado em Y é dividido pelo resultado da operação (C + (D . E)) armazenado em T, colocando‑se tudo como resposta em Y. A mesma equação pode ser resolvida utilizando somente dois endereços de operandos, como mostra a figura a seguir. Instrução Comentário MOVE Y, A Y ← A SUB Y, B Y ← Y - B MOVE T, D T ← D MPY T, E T ← T × E ADD T, C T ← T + C DIV Y, T Y ← Y ÷ T Figura 175 – Programa para executar a operação aritmética utilizando dois operandos de endereçamento Fonte: Stallings (2010, p. 290). O programa inicia fazendo uma cópia do conteúdo do operando A, movendo‑o para o endereço do operando Y. Depois, realiza‑se a subtração de Y, B, que nada mais é do que a subtração de (A – B). Na terceira linha, move‑se o conteúdo do operando D para o endereço T. Em seguida, multiplica‑se T, E. Na penúltima linha, aciona‑se o resultado obtido na multiplicação anterior armazenado em T por C, como na equação original. Por fim, dividem‑se os valores armazenados em Y, resultantes de (A – B) pelos valores contidos em T (C + (D . E)). Para operações que envolvem apenas um endereço de operando, as instruções são mais simples. Para que esse tipo de instruções funcione, um segundo endereço precisa ser implícito, como ocorria em computadores mais antigos. Um endereço implícito geralmente corresponde a um registrador acumulador (AC). O acumulador irá conter um dos operandos que será usado para armazenar o resultado, como mostra o exemplo da figura a seguir. Instrução Comentário LOAD D AC ← D MPY E AC ← AC × E ADD C AC ← AC + C STOR Y Y ← AC LOAD A AC ← A SUB B AC ← AC - B DIV Y AC ← AC ÷ Y STOR Y Y ← AC Figura 176 – Programa para executar a operação aritmética utilizando um operando de endereçamento Fonte: Stallings (2010, p. 290). 211 ARQUITETURA DE COMPUTADORES MODERNOS Nesse último exemplo, inicialmente o operando D é carregado para o acumulador através da operação LOAD. Após ter carregado D, a operação seguinte é a multiplicação do operando E pelo conteúdo do acumulador (D). A operação prossegue com a soma do conteúdo do acumulador pelo operando C. Com a parte do denominador da equação já resolvida (C + (D . E)), o resultado é transferido para o operando Y através da operação LOAD, pois o acumulador terá seus valores alterados com as próximas operações. A operação do numerador se inicia com o carregamento do operando A para o acumulador, pela operação LOAD A. Depois, o conteúdo do acumulador (A) é subtraído de B, terminando as operações no numerador. Por fim, necessita‑se dividir o numerador pelo denominador através da operação DIV Y, que representa a divisão do conteúdo armazenado em Y pelo conteúdo armazenado no acumulador, tudo isso sendo armazenado novamente em Y (STOR Y). Exemplo de aplicação Considere um processador do tipo RISC que utiliza apenas dois operandos em cada linha de operação (relação um‑pra‑um) da ULA. Esse mesmo processador precisa resolver a seguinte equação matemática: X = 12 ‑ B Y ‑ W * A Resolução Como não há nenhuma incógnita entre parênteses, podemos então iniciar a resolução a partir do denominador obedecendo à regra de precedência para valores expoentes e depois resolvemos a expressão do numerador; por fim, dividimos o resultado no numerador pelo denominador: MOVE X, J MPY X, X SUB X, B MPY W, A SUB Y, W DIV Y, X MOVE X, Y Saiba mais Para conhecer um pouco mais sobre linguagens de baixo nível, leia o capítulo 3 da obra indicada a seguir: ANIDO, R. Linguagens de montagem. 9. ed. Rio deJaneiro: Elsevier, 2016. 212 Unidade II 7 FUNDAMENTOS DAS ARQUITETURAS RISC X CISC, PROCESSAMENTO PARALELO, PROCESSADORES SUPERESCALARES, MULTITHREADING E MULTICORE 7.1 Arquitetura RISC Atualmente muito utilizadas em sistemas embarcados, as arquiteturas de computadores RISC (Reduced Instruction Set Computer – computador contendo um conjunto reduzido de instruções) foram um grande avanço nas arquiteturas dos processadores modernos. Esse tipo possui grande quantidade de vantagens em sua operação, como será abordado a seguir (MONTEIRO, 2019). 7.1.1 Menor quantidade de instruções e todas com largura fixa Entre as principais características do sistema RISC está a sua tendência natural de possuir um conjunto de instruções menor se comparado com o das máquinas CISC (Complex Instrucion Set Computer – computador com conjunto complexo de instruções) com a mesma configuração de hardware. Essa arquitetura teve seu início com a família Spark, da SUN Microsystems, por volta da década de 1980, e possuía cerca de 50 instruções. Como comparativo, os computadores VAX‑11/780 eram totalmente CISC e possuíam até 300 instruções; já o Intel 80486 foi lançado com a capacidade de 147 instruções. Vale ressaltar que uma menor quantidade de instruções, e cada uma delas possuindo uma execução otimizada, resultará em um sistema com melhor desempenho no geral. Dessa forma, menos instruções logicamente também irão ocasionar programas um pouco mais longos se comparados a sistemas com um maior número de instruções, pois muitas vezes é necessário repetir instruções para se obter o mesmo resultado. Outras vantagens podem ser observadas ao se utilizar um conjunto reduzido de instruções: • Uma menor quantidade de transistores no chip do processador, obtendo‑se assim um menor espaço físico para a implementação do VLSI (Very Large Scale Integration – integração em escala muito grande) e, consequentemente, reduzindo‑se o custo. • Redução na complexidade do compilador ou decodificador de instruções, baseado em uma menor largura de entrada e saída, diminuindo‑se o tempo total para a decodificação das instruções. Como as instruções seriam menores nessa situação, também haveria uma menor quantidade de bits no campo do código da operação ou opcode da instrução, o que reduziria o tamanho dos programas. 7.1.2 Execução otimizada de chamada: funções Outra característica importante nas arquiteturas do tipo RISC, e que também se difere das arquiteturas CISC, refere‑se ao modo de realizar chamadas para as rotinas de parâmetros. No geral, os programas usam muito as chamadas funções, consumindo um tempo razoável do processador, mas aplicando usualmente poucos dados no processo, resultando em um consumo grande de processamento na transferência de dados/instruções. 213 ARQUITETURA DE COMPUTADORES MODERNOS Nas máquinas CISC, a chamada rotina de funções conduz a operações que envolvam escrita/leitura constantes na memória principal (RAM), a fim de passar os parâmetros que serão lidos ou gravados. Já para máquinas com arquitetura do tipo RISC, essa transferência ocorre basicamente no processador; assim, para não perder o desempenho, utiliza‑se uma quantidade maior de registradores do que os usualmente encontrados nas arquiteturas CISC. 7.1.3 Menor quantidade de modos de endereçamento Outra característica na arquitetura RISC está relacionada aos diferentes modos de endereçamento de memória pelo conjunto de instruções. Máquinas CISC tendem a possuir uma quantidade maior de endereçamentos, de maneira que uma operação simples para soma de dois valores armazenados em registradores possa ocorrer de forma mais rápida, a menos que um dos operandos usados na soma esteja na memória e o outro operando no registrador, ou pior, com os dois operandos contidos na memória, o que tornará o processo mais demorado, devido ao processo de busca na memória. As arquiteturas RISC buscam por soluções mais simples, e uma delas ficou conhecida como Load/Store (Load – transfere o dado oriundo da memória para o registrador específico do processador, Store – operação contrária ao Load, que irá transferir um dado do registrador específico para algum endereço de memória). Embora pareça simples, essa técnica de implementação de execução de instruções diminui drasticamente os ciclos de clock necessários para o processamento da operação. 7.1.4 Modos de execução baseados no uso de pipeline Como estudado anteriormente, as técnicas de pipeline tendem a ter um desempenho elevado na execução de instruções em paralelo (se comparados aos processos executados em série). Todavia, para que se extraia o seu melhor desempenho, é preciso que as instruções possuam formato e complexidade similares, ocasionando um tempo redundante em todas as etapas, equilibrando o tempo de execução em cada uma delas. 7.1.5 Execução de cada instrução em um ciclo de clock Computadores do tipo CISC levam um tempo maior para executar instruções devido, entre outros fatores, ao uso de um microcódigo ou micro‑operações (microops), o que implicará a interpretação de cada uma das micro‑operações envolvidas no processo, causando um atraso total na execução das instruções. Em arquiteturas RISC, por outro lado, como utilizam poucas instruções e por elas serem mais simples, não haverá a necessidade do uso de microcódigos. 7.2 Arquitetura RISC da IBM Especificamente, o computador com arquitetura RISC foi desenvolvido na década de 1980 pela IBM no laboratório de pesquisas Thomas J. Watson, em Nova Iorque (TANEMBAUM; AUSTIN, 2013). Esse projeto tinha o nome de IBM 801, não por causa de um termo técnico, mas sim em razão do nome do edifício onde a pesquisa estava ocorrendo. A IBM tinha como objetivo desenvolver um processador para o gerenciamento de uma central telefônica de grande porte, capaz de manipular, simultaneamente, 214 Unidade II 300 chamadas por segundo. Como requisito inicial, o 801 da IBM deveria completar a execução de uma instrução a cada ciclo de clock, além de possuir um desempenho de 12 MIPS, de modo que seria capaz de executar até 20 mil instruções por chamada. Embora seu projeto inicial fosse o emprego do 801 na central telefônica, ele se mostrou muito popular no emprego do processamento de grandes mainframes. Depois, o processador do 801 passou a ser chamado ROMP (Research/OPD – microprocessor ou microprocessador do departamento da IBM), em Austin, Texas (Office Products Division). Uma evolução do IBM 801 foi o mainframe RS/6000 (figura a seguir), que se tornou um sucesso de vendas devido ao seu alto desempenho. Figura 177 – Mainframe IBM RS/6000 Disponível em: https://bit.ly/3HbWtuc. Acesso em: 18 jan. 2023. O RS/6000 tinha como principais características: • Desenvolvido para ser utilizado também como estação de trabalho ou minicomputador. • Tamanho fixo de instruções com 4 bytes. • Acesso à memória principal usando o esquema load/store. • 32 registradores de 32 bits para realizar o endereçamento de memória. • 32 registradores de 64 bits para executar operações em ponto flutuante. • Utilizava somente a ULA e sem acesso à memória para operações de lógica e aritmética. • Uso de pipeline em unidades independentes de execução, além de quatro modos de endereçamento. • Conjunto de 183 instruções, com nove formatos diferentes, além de quatro modos para o endereçamento. • Endereços de 32 bits, permitindo um endereçamento de memória de até 4 GB. • Caches L1, uma para dados e outra para instruções. 215 ARQUITETURA DE COMPUTADORES MODERNOS Lembrete O pipeline serve para executar instruções em paralelo e geralmente é utilizado quando se quer melhorar o desempenho de processamento. 7.3 Pipeline na arquitetura RISC Em máquinas RISC, a maioria das instruções é realizada com operações registrador‑para‑registrador, envolvendo apenas dois estágios de pipeline, havendo as seguintes instruções: • I: busca a instrução. • E: executa a instrução (efetua uma operação entre a ULA e os registradores). Em operações de carregamentoe armazenamento em memória principal, serão necessários três estágios de pipeline: • I: busca a instrução. • E: executa a instrução (calcula um endereço da memória principal). • D: operação de armazenamento entre o registrador e a memória ou vice‑versa. A figura a seguir mostra um exemplo para o tempo decorrido de uma sequência de instruções sem pipeline executada sequencialmente. Nele, observa‑se um desperdício de tempo de execução de instruções, visto que elas são executadas em série, somente paralelizando as instruções ao término das instruções anteriores. I E D I E D I E I E D I E Figura 178 – Execução de instruções sequencialmente Fonte: Stallings (2017, p. 474). 216 Unidade II Na figura a seguir, observa‑se uma pequena melhoria no processamento paralelo, pois foi usado um pipeline de dois estágios, I e E, executados de forma simultânea. I E D I E D I E I E D I E I E Figura 179 – Pipeline de dois estágios Fonte: Stallings (2017, p. 474). Nesse exemplo, os dois primeiros estágios do pipeline serão para a realização da busca da instrução e um estágio para a execução, além do armazenamento em memória da instrução resultante, o que incluirá operações de registrador para a memória ou memória para o registrador. Conforme ilustrado na figura anterior, o estágio de busca de instrução seguinte poderá ser executado em paralelo, ao mesmo tempo que a primeira parte do estágio, que irá realizar a operação execução/memória. Contudo, o estágio que faz a execução/memória da segunda instrução deverá ser atrasado, até que a primeira instrução possa esvaziar o segundo estágio. Mesmo com essa penalidade, o pipeline de dois estágios ainda pode aumentar em até duas vezes a taxa de execução das instruções se comparado com um sistema de execução sequencial (em série). Mesmo assim, dois problemas impedem que seja obtido o melhor desempenho na velocidade do pipeline. O primeiro envolve o acesso à memória, que, como se sabe, nessa situação será único e será usado apenas um acesso por estágio. O segundo é que, quando ocorre um desvio na instrução, o fluxo sequencial de execução também é interrompido, de forma que, para acomodar isso utilizando‑se a menor quantidade de estágios possíveis, insere‑se uma instrução no ciclo de estágios, o que, claramente, irá resultar em um ciclo de pipeline mais longo e demorado. Como problemas podem ocorrer no processo de pipeline, como mencionado, ele ainda pode ser melhorado, permitindo, por exemplo, dois acessos simultâneos à memória para cada estágio. Isso resultará na situação em que três instruções poderão ser sobrepostas, obtendo um melhoramento com fator 3. Essas melhorias podem ser visualizadas na figura a seguir. I E D I E D I E I E I E D I E Figura 180 – Pipeline de três estágios Fonte: Stallings (2017, p. 474). 217 ARQUITETURA DE COMPUTADORES MODERNOS Se alguma instrução de desvio entrar no pipeline durante o processamento, a aceleração máxima nunca será alcançada. Além disso, algumas dependências de dados poderão afetar esse circuito de processamento de instruções. Se alguma instrução necessitar alterar algum operando obtido da instrução anterior, ocorrerá um atraso, de forma que, novamente, uma instrução adicional será inserida no pipeline. No de três estágios, assim como nos anteriores, é interessante que todos os estágios possuam o mesmo tempo de duração, ou seja, teoricamente, o mesmo tamanho. Como o estágio E (execução) geralmente envolve alguma operação de ULA, ele será sempre mais demorado, assim, pode‑se dividir o estágio de execução em dois subestágios: • E1: realiza a leitura no banco de registradores. • E2: realiza a operação na ULA e a escrita em um registrador. Como as instruções na arquitetura RISC são mais simples e regulares, um projeto com três ou quatro estágios será facilmente implantado. A figura a seguir mostra o resultado de um pipeline com quatro estágios, baseado na execução estendida. I E1 E2 D I E1 E2 D I E1 E2 I E1 E2 I E1 E2 I E1 E2 D I E1 E2 I E1 E2 I E1 E2 Figura 181 – Pipeline de quatro estágios Fonte: Stallings (2017, p. 474). 7.4 Processador superescalar e superpipeline Um processador superescalar é definido como aquele que possui múltiplos e independentes pipelines de instruções. Dessa forma, uma implementação do tipo superescalar, executada na arquitetura de um processador que possui instruções do tipo aritméticas de inteiros, de ponto flutuante, leitura/escrita e desvios condicionais, pode realizar essas tarefas de forma simultânea e independente (STALLINGS, 2010). Uma das grandes vantagens da implementação de pipelines múltiplos é o aumento no nível de paralelismo de execução das instruções, o que possibilita múltiplos fluxos que também podem ser processados simultaneamente. Em vez da busca de somente uma instrução a cada vez (como nos sistemas convencionais), um processador superescalar possui como tarefa buscar múltiplas instruções simultaneamente, realizando, na sequência, uma tentativa de localização das próximas instruções, para que, de modo independente, possa executá‑las em paralelo. Entretanto, assim como em um sistema de 218 Unidade II pipeline comum, se a entrada de alguma operação dada por uma instrução for dependente da saída da instrução anterior, então a instrução seguinte não poderá completar a execução da tarefa ao mesmo tempo ou mesmo antes da instrução anterior. Assim, uma vez que todas as dependências no processo sejam identificadas, o processador poderá executar, e até mesmo completar, todas as instruções em uma ordem que seja diferente do código de máquina originalmente programado. Uma forma de contornar esse problema pode ser o processador eliminar algum tipo de dependência de dados ou instruções desnecessárias, utilizando‑se, para isso, registradores adicionais, renomeando assim as referências obtidas dos registradores o código original. O projeto de processadores superescalares foi implementado em 1987, logo após o desenvolvimento da arquitetura RISC, embora a abordagem superescalar também possa ser implementada nas arquiteturas CISC. A figura a seguir mostra um comparativo entre uma organização escalar simples e uma organização de processamento superescalar. A) Organização escalar Memóri Unidade funcional de inteiro com pipeline Unidade funcional de ponto flutuante com pipeline Banco de registradores de inteiro Banco de registradores de ponto flutuante B) Organização superescalar Memória Unidade funcional de inteiro com pipeline • • • Unidade funcional de ponto flutuante com pipeline Banco de registradores de inteiro Banco de registradores de ponto flutuante • • • Figura 182 – Organização escalar (A) e organização superescalar (B) Fonte: Stallings (2017, p. 493). Na organização escalar convencional (parte A da figura anterior), existe uma unidade funcional em um pipeline único para realizar operações inteiras e outro pipeline para executar operações de ponto flutuante. Nesse tipo de organização, o paralelismo será obtido quando se habilitam múltiplas instruções em diferentes estágios do pipeline de uma só vez. Já em uma organização superescalar, existem várias unidades funcionais, e cada uma será implementada com um único pipeline. Cada uma dessas unidades efetivará um grau de paralelismo em função da estrutura. Assim, é de responsabilidade do hardware e do compilador garantir que a execução em paralelo não viole algum propósito do programa original. 219 ARQUITETURA DE COMPUTADORES MODERNOS Saiba mais Para entender melhor o que é um compilador e como ele funciona, acesse: SAIBA quais são as diferenças entre compilador e interpretador. S.O.S. Digital, 2021. Disponível em: https://bit.ly/3kgqpfK. Acesso em: 18 jan. 2023. 7.4.1 Comparativo entre processadores superescalar e superpipeline A evolução da organização de pipeline simples ficou conhecida como superpipeline, desenvolvida em 1988. Sua organização permite que sejam realizados vários estágios de pipeline; para tal,executam‑se tarefas que exigem metade do tempo de um ciclo de clock. Dessa forma, a velocidade de clock possibilitará que duas tarefas sejam realizadas em apenas um único ciclo. A figura a seguir mostra um comparativo entre as abordagens de pipeline simples, superescalar e superpipeline, todas considerando quatro estágios: buscar, decodificar, executar e escrever (salvar na memória). Chave: Busca Decodificação Escrita Execução In st ru çõ es su ce ss iv as Tempo em ciclos básicos 0 1 2 3 4 5 6 7 8 9 Superpipeline Pipeline simples de 4 estágios Superescalar Figura 183 – Comparação entre as abordagens de pipeline simples, superpipeline e superescalar Fonte: Stallings (2017, p. 494). 220 Unidade II Na figura anterior, observa‑se que as várias instruções podem ser executadas concorrentemente, sendo que apenas uma delas estará em seu estágio de execução. A parte seguinte da figura anterior mostra uma implementação do superpipeline, que é capaz de executar dois estágios de pipeline em um único ciclo de clock. Dessa forma, observa‑se que as funções executadas em cada estágio poderão ser divididas em duas partes, não ocorrendo sobreposição, e cada uma delas poderá ser executada na metade de um ciclo de clock. Por fim, na parte mais baixa da figura, nota‑se uma implementação superescalar, capaz de executar duas instâncias dentro de cada estágio em paralelo. É válido destacar que tanto a implementação da organização superpipeline como a organização superescalar devem possuir o mesmo número de instruções sendo executadas ao mesmo tempo em um determinado estado. Assim, o processador de superpipeline ficará atrasado em relação ao processador superescalar no início de cada programa ou quando houver algum desvio. 7.4.2 Limitações Considerando o nível de instrução, o paralelismo pode ter algumas limitações ao executar tarefas em paralelo. Assim, é necessária uma combinação ótima entre as técnicas de implementação de paralelismo em hardware em conjunto com o compilador, a fim de maximizar o paralelismo das instruções. Observe algumas limitações: • Dependência de dados verdadeira: quando uma segunda instrução só pode ser executada ao término de execução da primeira instrução, devido ao compartilhamento dos dados ou mesmo do uso do resultado da primeira operação pela segunda operação. • Dependência procedural: quando há algum desvio na sequência de execução das instruções, complicando a operação do pipeline. • Conflitos de recursos: quando há uma competição de duas ou mais instruções pelos mesmos recursos (memória, processador, dado, instrução) simultaneamente. • Dependência de saída: quando duas ou mais instruções necessitam armazenar seu resultado em um mesmo endereço e ao mesmo tempo. • Antidependência: quando uma instrução, ao utilizar um local ou operando, entra em conflito com a instrução seguinte, que também tenta usar o mesmo local ou operando. A figura a seguir mostra a execução de instruções em paralelo. Utiliza‑se um pipeline de quatro estágios que compara situações sem dependência de dados em relação a outros sistemas com dependências de dados, procedural e conflito de recursos. 221 ARQUITETURA DE COMPUTADORES MODERNOS Chave: Busca Decodificação Escrita Execução Tempo em ciclos básicos 0 1 2 3 4 5 6 7 8 9 i0 i2 i3 i4 i5 1/desvio Dependência procedural i0 i1 Sem dependência i0 i1 Dependência de dados (i1 usa dados computados por i0) i0 i1 Conflito de recurso (i0 e i1 usam a mesma unidada funcional) Figura 184 – Efeito de dependências em um sistema de processamento superescalar Fonte: Stallings (2017, p. 495). Conforme ilustrado na figura anterior, em um sistema paralelo sem dependências, as instruções podem ser executadas simultaneamente sem nenhum atraso. Quando há uma dependência de dados, o estágio de execução terá um atraso em um ciclo de clock, aguardando a obtenção do resultado da primeira instrução logo acima. Na dependência procedural há um desvio de instruções, que deverão ser executadas primeiro deixando o fluxo para execução das instruções atrasadas, aguardando o término do estágio “executar”. Quando há algum conflito de recurso, novamente o estágio “executar” na primeira operação deve ser finalizado para que o processamento paralelo possa utilizar o dado resultante, ou mesmo usar memória/processador para que seu processo seja de fato executado e escrito. 222 Unidade II 7.5 Multithreading Considerada uma abordagem alternativa, permite um número maior no paralelismo se comparado com os esquemas superescalar ou superpipeline. No multithreading, os vários ciclos de instruções são divididos em ciclos menores, também conhecidos como threads, e cada thread poderá ser executado em paralelo. Ele é subdividido entre implícito e explícito. Na abordagem de multithreading explícito, é vital que o processador disponibilize um contador de programa (program conter – PC), para que cada thread em operação possa ser executado concorrentemente. O tipo implícito se refere a uma execução concorrente de vários threads retirados de um único programa que, originalmente, estava sendo executado de forma sequencial. Dessa forma, os threads implícitos também podem ser definidos de forma estática pelo próprio compilador do software utilizado ou de forma dinâmica pelo hardware do computador. O multithreading pode se basear no uso de várias técnicas já conhecidas, a fim de otimizar a execução de um thread singular, por exemplo, previsão de desvio, renomeação de registradores ou mesmo técnicas de processamento superescalar. As diversas técnicas de multithreading explícitos podem ser divididas entre: • Multithreading intercalado: também conhecido como multithreading de granularidade fina, nesse esquema o processador pode operar dois ou mais contextos de thread simultaneamente, alternando entre eles a cada ciclo de clock. Se algum thread for bloqueado devido a alguma dependência de dados ou mesmo por falta de recursos como memória disponível, ele será alternado para um thread que esteja pronto para ser executado. • Multithreading bloqueado: também conhecido como multithreading de granularidade grossa, nesse esquema as instruções de um thread serão executadas de forma progressiva até que algum novo evento ocorra, causando um atraso. Esse evento induzirá a uma troca de thread e em operação para outro thread e só será eficiente se o processador executar as tarefas de forma ordenada e, se possível, sem nenhuma falha de cache. • Multithreading simultâneo (SMT): nesse tipo, as instruções a serem efetuadas são enviadas de forma simultânea a partir de vários threads para as unidades de execução de um processador superescalar. Assim, o multithreading simultâneo combinará a capacidade de envio de instruções superescalares através do uso de múltiplos contextos de thread. • Chip multiprocessado: nesse caso, o processador inteiro será replicado em um único chip, de forma que cada processador irá operar threads separados. Uma das grandes vantagens dessa abordagem é que sua área lógica disponível no chip será utilizada eficientemente, sem a dependência do crescimento da complexidade no projeto do pipeline. A figura a seguir faz um comparativo entre algumas abordagens de arquiteturas de pipeline envolvendo o uso de multithreading e as compara com outras abordagens também de pipeline, mas que não usam o multithreading. 223 ARQUITETURA DE COMPUTADORES MODERNOS A Ci cl os A A A A) Thread escalar único A B C D A A A A A A A B B B B B B B B D D D D D D D D C C C C C C K) Chip multiprocessador (multicore) A A A A A A A A A A A D) Superescalar Tr oc as d e th re ad s A B C D A A A B B C) Multithread escalar bloqueado Tr oc as d e th re ad s A B C D A B C A D B B) Multithread escalar intercalado Tr oc as d e th re ad s A B C D A B C A D B A B N A D N N B N N D N N N N N D N H) Multithread intercalado VLIW A B C D A B C A D B A B A D BD D E) Multithread superescalar intercalado Tr oc as d e th re ad s A B C D I) Multithread bloqueado VLIW A A B B C A A N B N N N N B N N N N N N A A A A A A N A A N N A A N N A N G)VLIW Ciclo de latência Tr oc as d e th re ad s A B C D F) Multithread superescalar bloqueado Janela de em issão A A B B C A A B B A B C D J) Multithread simultâneo (SMT) A D D C B A A D D D D B A D D D A B A A A A A D B A A A A D B A A A A D B B B A B D C D C A B DTr oc as d e th re ad s Figura 185 – Diferentes tipos de abordagens para execução de múltiplos threads Fonte: Stallings (2017, p. 537). As linhas horizontais da figura anterior representam os slots de envio de instruções para o ciclo de execução, ou seja, a largura de cada linha irá corresponder ao número máximo de instruções que serão emitidas a cada ciclo de clock. Já as linhas levemente curvadas acima de cada item indicam os threads únicos ou múltiplos de instruções sendo adicionados no esquema. Na vertical é ilustrada a sequência de tempo de cada ciclo de clock. Os slots vazios, sombreados na figura, representam slots de execução que não são utilizados no processo de pipeline. Cada um dos processos é definido a seguir: 224 Unidade II • Thread escalar único: é um tipo de pipeline simplificado, encontrado tanto em máquinas RISC quanto CISC tradicionais, sem o uso de multithreading. • Multithread escalar integrado: é uma abordagem simplificada e fácil de ser implementada. Nela, ocorrerá uma troca de thread para outro thread a cada ciclo de clock, e os múltiplos estágios de pipeline poderão ser mantidos ocupados ou parcialmente ocupados. • Multithread escalar bloqueado: nele apenas um único thread será executado até que ocorra um evento que cause algum atraso no pipeline, sendo que, nesse momento, o processador realizaria a troca de um thread para outro. • Superescalar: a abordagem superescalar básica não possui multithread, e somente alguns ciclos de slots de envio são utilizados, ocasionando uma “perda horizontal”. Em outros ciclos de instruções, nenhum slot de envio será usado, e esses ciclos são conhecidos como perda vertical. • Multithread superescalar intercalado: durante a execução dos ciclos de clock são emitidas diversas instruções, o tanto quanto forem possíveis naquele tempo determinado, de forma que um único thread seja capaz de processá‑lo. Logicamente, isso ocasiona atrasos potenciais, pois haverá trocas de threads que não serão possíveis de serem executadas, ou seja, serão eliminadas. Entretanto, o número de instruções que é enviado para qualquer ciclo pode ser limitado de acordo com as suas dependências, seja de dados, seja de recursos dentro daquele thread. • Multithread superescalar bloqueado: nessa operação as instruções de apenas um thread podem ser emitidas durante o ciclo e, como consequência, o multithread bloqueado poderá ser utilizado. • Slot de envio ou VLIW (very long instruction word): o emprego de uma VLIW é elaborado em dualidade com o compilador, que coloca operações, que poderão ser executadas em paralelo, numa mesma palavra. Em máquinas VLIW simples, não é possível preencher uma palavra de modo completo com instruções que ainda serão emitidas em paralelo. • VLIW multithread intercalado: oferece uma eficácia semelhante àquela do multithread intercalado para uma arquitetura superescalar. • Multithread VLIW bloqueado: oferece uma eficácia semelhante àquela do multithread bloqueado para uma arquitetura superescalar. • Multithreading simultâneo: esquema capaz de emitir oito instruções simultâneas. Nele, se um thread possuir um alto grau de paralelismo em nível de instruções, ele pode ser capaz de preencher todos os slots horizontais. • Chip multicore: combina dois ou mais processadores em um único chip. 225 ARQUITETURA DE COMPUTADORES MODERNOS Saiba mais Descubra mais sobre os processadores multithreading e hyperthreading em: DESCOBERTA vulnerabilidade nos processadores com hyper‑threading. Inovação Tecnológica, 2005. Disponível em: https://bit.ly/3XmJPyk. Acesso em: 18 jan. 2023. 7.6 Multicore Há mais de uma década o uso de chips utilizando um único processador atingiu o seu limite de desempenho e de execução de instruções, mesmo empregando técnicas de processamento paralelo. Com o desenvolvimento da arquitetura multicore, foi possível explorar e melhorar o processamento multithreading em vários núcleos do processador. Assim, fica claro que o uso de uma arquitetura que oferece vários núcleos em vez de um único também aumentará o número de níveis de memória cache, aumentando o desempenho geral de processamento. Um processador multicore combinará dois ou mais processadores em um único chip de silício. Essas mudanças na organização do projeto dos processadores (baseado no aumento do nível de paralelismo no chip) facilitaram a execução de instruções simultâneas durante o mesmo ciclo de clock. Como será maior o número de núcleos em um processador, consequentemente, o desempenho do pipeline aumentará, assim como do processamento superescalar e do multithreading simultâneo, pois para cada núcleo haverá no mínimo uma cache L1 e uma cache L2 compartilhada, conforme o modelo do processador, como pode ser observado na figura a seguir. 226 Unidade II Banco de registradores de thread único Unidade de execução e filas Contador do programa Unidade de busca de instruções Lógica de envio A) Superescalar Cache L1 de dadosCache L1 de instruções Cache L2 Lógica de envio B) Multithreading simultâneo • • • • • • Unidade de busca de instruções PC 1 PC n Re gi st ra do r 1 Re gi st ra do re s n Unidade de execução e filas Cache L1 de dadosCache L1 de instruções Cache L2 C) Multicore Co re 1 (su pe re sc al ar o u SM T) L1 ‑ I L1 ‑ D Co re 2 (su pe re sc al ar o u SM T) L1 ‑ I L1 ‑ D Co re 3 (su pe re sc al ar o u SM T) L1 ‑ I L1 ‑ D Co re n (su pe re sc al ar o u SM T) L1 ‑ I L1 ‑ D • • • Cache L2 Figura 186 – Organização de processamento multicore Fonte: Stallings (2017, p. 561). 227 ARQUITETURA DE COMPUTADORES MODERNOS As principais variáveis na organização multicore são: • o número de núcleos no chip; • o número de níveis de memória cache; • a quantidade de memória cache a ser compartilhada. A figura a seguir mostra algumas alternativas dentro da organização multicore e nelas é possível encontrar cache L1 dedicada, cache L2 dedicada, cache L2 compartilhada e cache L3 compartilhada. A) Cache L1 dedicada Core de CPU 1 L1‑IL1‑D Core de CPU n L1‑IL1‑D • • • Cache L2 Memória principal E/S B) Cache L2 dedicada Core de CPU 1 L1‑IL1‑D Core de CPU n L1‑IL1‑D • • • Cache L2 Memória principal E/S Cache L2 C) Cache L2 compartilhada Core de CPU 1 L1‑IL1‑D Core de CPU n L1‑IL1‑D • • • Cache L2 Memória principal E/S D) Cache L3 compartilhada Core de CPU 1 L1‑IL1‑D Core de CPU n L1‑IL1‑D • • • L2 Cache Memória principal E/S L2 Cache Cache L3 Figura 187 – Organização multicore Fonte: Stallings (2017, p. 567). Uma organização tradicional que contenha cache L1 dedicada geralmente é dividida entre cache de dados e cache de instruções. Um exemplo típico dessa organização é o processador ARM Cortex M3, como o da figura a seguir. 228 Unidade II Figura 188 – Processador ARM Cortex M3 Disponível em: https://bit.ly/3Wk7Qou. Acesso em: 18 jan. 2023. Em situações que contenham cache L2 dedicada há uma área disponível no próprio chip que permite o compartilhamento da cache. Um exemplo dessa de organização com cache L2 dedicada é o processador AMD Opteron, como o da figura a seguir. Figura 189 – Processador AMD Opteron Disponível em: https://bit.ly/3Hfsl1a. Acesso em: 18 jan. 2023. 229 ARQUITETURA DE COMPUTADORES MODERNOS Arquiteturas contendo cache L2 e L3 compartilhadas podem conter algumas vantagens se comparadas às caches dedicadas,como: • O uso de interferência construtiva pode reduzir as taxas de falhas de cache, ou seja, se um thread em um determinado núcleo acessar uma posição da memória principal (RAM), tal operação trará um quadro contendo a posição buscada na cache compartilhada. Se algum outro thread em um outro núcleo acessar esse mesmo endereço buscando o mesmo bloco logo em seguida, as posições de memória já estarão liberadas, ou seja, disponíveis para uso do chip. • A comunicação entre os processadores será mais fácil de ser implementada por causa das posições das memórias caches compartilhadas. Dessa forma, quando se aumenta o poder de processamento de um processador aumentando‑se o número de núcleos, também é relevante considerar questões relacionadas ao software, e não somente ao hardware. A arquitetura multicore também traz diversos benefícios de desempenho, e um exemplo pode ser destacado ao analisar o uso de vários núcleos. Essa comparação é realizada através da lei de Amdahl. Essa equação afirma que o ganho (que representa uma unidade adimensional) na velocidade será igual ao tempo para executar um programa utilizando um único processador pelo tempo de execução desse mesmo programa usando N processadores (STALLINGS, 2010). Em termos matemáticos, essa expressão é dada por: Ganho = 1 (1 ‑ f restante) + N futilizada Onde N é o número de núcleos do processador e f é a fração do tempo de execução de um certo código de programa. Dessa forma, a equação mostra que quando f é pequeno, o uso de processadores em paralelo tem pouco efeito, mas quando N se aproxima de infinito, o ganho é ilimitado. Exemplo de aplicação Exemplo 1 Uma operação de software utiliza 43% do tempo em operações de ponto flutuante em uma máquina de seis núcleos. Qual será o ganho resultante? Resolução Ganho = 1 (1 ‑ 0,057) + 6 0,43 → Ganho = 1,993 Exemplo 2 Uma operação de software usa 33% do tempo em operações lógicas em uma máquina de oito núcleos. Qual será o ganho resultante? 230 Unidade II Resolução Ganho = 1 (1 ‑ 0,067) + 8 0,33 → Ganho = 2,693 Saiba mais Descubra mais sobre processadores multicore em: NOVO hardware acelera comunicação em processadores <i>multicore</i>. Inovação Tecnológica, 2011. Disponível em: https://bit.ly/3ZM8vBR. Acesso em: 18 jan. 2023. 8 TÓPICOS EM SISTEMAS EMBARCADOS, IOT, SMART CITIES E TI VERDE 8.1 Sistemas embarcados Basicamente, o que difere os sistemas embarcados dos computadores tradicionais é o fato de que os sistemas embarcados possuem atividades para determinadas atividades direcionadas (STALLINGS, 2017). Já os computadores, como já discutido anteriormente, são de “uso geral”, ou seja, podem ser programados de acordo com a necessidade do usuário, operando em vários tipos de sistemas operacionais e executando praticamente qualquer tipo de programa. Observação A expressão sistemas embarcados é utilizada para determinar dispositivos baseados no uso de hardware (eletrônica) e software (programas) inseridos (ou embarcados) dentro de um equipamento. Algumas restrições fazem parte do funcionamento dos sistemas embarcados, como limitação de velocidades de CPUs, capacidade das memórias, massa do dispositivo, consumo de energia, tipo de ambiente de operação, espaço físico ocupado pelo equipamento e a capacidade de resposta em relação a uma ação interna ou externa. Isso ocorre justamente devido às limitações de hardware/softwares que esses dispositivos apresentam, visto que sua utilização é específica, não deve abranger itens desnecessários para as tarefas para as quais não foram projetados. Algumas melhorias ou correções realizadas na programação dos sistemas embarcados podem fazer com que o sistema extrapole a previsão operacional em relação ao consumo de energia ou área de memória disponível (NULL; LOBUR, 2010). Entre essas restrições mencionadas, o consumo limitado de energia é geralmente a mais importante a ser verificada em um projeto de um hardware como esse, pois um baixo consumo de energia exigirá 231 ARQUITETURA DE COMPUTADORES MODERNOS uma baixa dissipação de calor, o que pode significar menos gastos com equipamentos que realizem essa tarefa, resultando mais energia nas baterias para executar outras operações pelo sistema. A grande maioria dos sistemas embarcados utilizados mundialmente pode ser dividida em apenas três categorias, com base em seus requisitos de energia, que são: sistemas operados à bateria, sistemas de consumo fixo e sistemas de alta densidade. • Sistemas operados a bateria: exigem a maximização da vida útil da bateria e a minimização de seu tamanho. • Sistemas de consumo fixo: devem possuir suprimento de energia ilimitado e seu principal objetivo é oferecer o máximo de desempenho dentro das restrições da energia disponível. • Sistemas de alta densidade: também conhecidos como sistemas de alto desempenho ou multiprocessados, são desenvolvidos com foco na eficiência energética devido à dissipação de calor. Frequentemente, possuem suprimento de energia ilimitado, entretanto, devem limitar o consumo de energia para evitar o superaquecimento. Outra questão importante envolvida nos sistemas embarcados se refere à temporização dos sinais de E/S. Desenvolvedores de sistemas embarcados devem possuir aptidão precisa sobre o inter‑relacionamento entre os sinais gerados por eventos do mundo externo em relação aos sinais que ocorrem de forma rotineira dentro do próprio sistema embarcado. Qualquer conjunto de eventos pode ocorrer a qualquer momento e de maneira aleatória e, muitas vezes, a reação a esses estímulos deve ocorrer na ordem de milissegundos. Em sistemas que operam em tempo real, por exemplo, uma reação tardia pode ocasionar uma falha que, consequentemente, ocasionará um acidente. Dessa forma, os sistemas embarcados devem ser funcionais e flexíveis a mutações, devem ser pequenos e de baixo custo (logicamente, excluindo sistemas embarcados grandes, haja vista seu foco operacional). Outro fator relevante se refere ao consumo energético, que sempre é uma questão a ser pensada em um projeto, pois determinará o tempo de vida operacional do sistema como um todo. Sistemas embarcados são muito usados na telemetria (medição de coisas) de aeronaves que empregam aplicações de alta complexidade, o que pode exigir muito desempenho de seus componentes. Em casos como esse, sua fabricação deve ser a mais específica possível. Como se trata de uma operação crítica, geralmente são usados processadores específicos em seu projeto. Entre os diversos tipos de sistemas embarcados, destacam‑se: • Smartphones: esse tipo pode ser literalmente traduzido como um “telefone inteligente”. Basicamente, é a evolução de um telefone celular que possuía somente a capacidade de receber e realizar chamadas. Esses dispositivos também possuem embarcado um pequeno sistema operacional capaz de controlar todo o hardware e aplicativos do aparelho. 232 Unidade II Figura 190 – Smartphone Disponível em: https://bityli.com/nw9eP. Acesso em: 18 jan. 2023. • Robôs assistentes: podem auxiliar na limpeza diária de uma residência ou até mesmo de uma empresa. Eles operam de forma autônoma e podem ser programados para realizar suas tarefas de forma escalonada, além de serem recarregáveis. Essa é apenas uma das várias possibilidades da utilização de robôs, visto que eles podem ser usados em outras tarefas, como na área médica, na construção civil, em funções militares, aviação etc. Figura 191 – Robô assistente de limpeza Disponível em: https://bit.ly/3XIhH8m. Acesso em: 18 jan. 2023. 233 ARQUITETURA DE COMPUTADORES MODERNOS • Drones: essencialmente, são robôs voadores, de pequeno porte, operados por controle remoto (podendo também ser autônomos). Todos possuem hardware e software dedicados baseados em placas microprocessadas ou microcontroladas e podem ser usados tanto para hobby ou até mesmo para uso militar. Figura 192 – Drone Disponível em: https://bit.ly/3iLSqvk. Acesso em: 18 jan. 2023. • Impressoras 3D: são capazesde imprimir em formato tridimensional utilizando resinas plásticas baseando‑se em modelagens via laser. Figura 193 – Impressoras 3D Disponível em: https://bit.ly/3ISBDS2. Acesso em: 18 jan. 2023. 234 Unidade II • Veículos autônomos: são um meio de transporte que não depende da condução humana para ir de um ponto a outro de forma segura. Eles são dotados de um sistema operacional que controla todos os seus sensores, radares e sonares para orientar o veículo por ruas ou rodovias. Figura 194 – Veículo autônomo Disponível em: https://bit.ly/3XjDmUU. Acesso em: 18 jan. 2023. Os embarcados citados anteriormente são somente alguns exemplos de uma vasta quantidade de dispositivos utilizados para finalidades específicas, como: smartwatchs, tablets, smart TVs, GPS, satélites, roteadores de internet etc. Todos os sistemas embarcados possuem algum tipo de processamento, seja microprocessado, seja microcontrolado. Existem, basicamente, três classificações para processadores embarcados: padronizados, processadores reconfiguráveis e totalmente customizados. Neste livro‑texto serão abordados apenas os sistemas embarcados do tipo padronizado. 8.1.1 Sistemas padronizados de hardware embarcado Os avanços obtidos na tecnologia VLSI (Very Large Scale Integration) possibilitaram a criação dos microcontroladores, que são uma variação dos microprocessadores. Em suma, um microcontrolador difere do microprocessador porque possui uma memória ROM e RAM interna ao processador, o que não ocorre em um microprocessador, onde ambas as memórias estão fisicamente situadas do lado de fora. Os microcontroladores, embora oriundos dos processadores de uso geral, possuem limitação de operação e, devido a isso, são vendidos por uma fração do valor de um processador de uso geral. Atualmente, ocorre uma enorme popularização dos microcontroladores, como os modelos 8051 da Intel, PIC 18F da Microchip. Hoje o mais usado é o Atmel ATMega 328, também da Microchip. 235 ARQUITETURA DE COMPUTADORES MODERNOS Figura 195 – Microcontrolador Atmel Atmega 328 Disponível em: https://bit.ly/3J6w0zw. Acesso em: 18 jan. 2023. Como já mencionado, os microcontroladores possuem muito em comum com os processadores de propósito geral, pois um microcontrolador é programável e pode acessar uma grande variedade de periféricos. Ao contrário de um processador de propósito geral, um microcontrolador possui um clock menor, por exemplo, o Atmega 328 tem um clock de 20 MHz, infinitamente menor que um processador i7 de última geração, que tem normalmente 3 GHz de processamento. Um diagrama simplificado de um microcontrolador é observado na figura a seguir. ROM Relógio E/S E/S Controlador de E/S Núcleo do microprocessador SRAM Controlador do barramento Temporizador vigia Figura 196 – Diagrama básico de um microcontrolador Fonte: Null e Lobur (2010, p. 53). 236 Unidade II Esse microcontrolador básico da figura anterior possui: CPU; memória para programas (SRAM) e dados; portas de E/S; controladores de E/S e do barramento do sistema; um clock (relógio) e um temporizador vigia (watchdog). Esse temporizador vigia é um mecanismo que tem como função, como o próprio nome sugere (cão de guarda), verificar possíveis falhas no sistema. Computadores de propósito geral, por exemplo, não necessitam desse tipo de temporizador vigia, pois nessas situações a própria interação informando uma falha pode ser interpretada pelo usuário, de modo que o próprio indivíduo poderá corrigir o erro informado. Em sistemas embarcados, esse processo de verificação de falhas pelos humanos não é tão trivial assim, pois esses sistemas podem estar posicionados em locais de difícil acesso ao humano, como usinas nucleares, satélites, antenas etc. Uma placa microcontrolada bastante conhecida atualmente é a Arduino Uno. Lembrete O Arduino é uma plataforma de prototipagem open source (código aberto) associada a uma linguagem de programação intuitiva e embarcada em um ambiente de desenvolvimento integrado (IDE – Integrated Development Environment) (BLUM, 2016). Como a plataforma Arduino é open source, facilita‑se seu acesso por parte dos usuários a todos os projetos, bibliotecas, diagramas esquemáticos e códigos‑fontes disponíveis na internet, tudo de forma gratuita e abrangente a todos que queiram desenvolver nessa plataforma, popularizando e democratizando o uso dos sistemas embarcados. Por ser open source, é possível também que desenvolvedores de placas possam fabricar “clones” do Arduino e comercializar suas próprias placas (desde que não usem o nome Arduino) e aplicá‑los em projetos de hardware dedicados, atingindo um público ainda maior. Figura 197 – Placa microcontrolada Arduino Uno Disponível em: https://bit.ly/3iLXwaW. Acesso em: 18 jan. 2023. 237 ARQUITETURA DE COMPUTADORES MODERNOS As placas Arduino possuem características e funções específicas, de acordo com o modelo de placa. Seus componentes‑chave são: • microcontrolador Atmel (podendo variar conforme o modelo de placa); • interface de programação (IDE); • E/S de comunicação USB; • regulador de tensão e conexões de alimentação; • pinos de interrupção de E/S; • LEDs de depuração, energia e RX/TX; • botão de reset; • conectores de programação serial no circuito (ICSP – In‑Circuit Serial Programming). Botão reset Conector USB Circuito serial ‑ USB Entrada 7‑12VDC Pino de energia e pinos auxiliares Entradas do conversor analógico‑digital MCU ATMega 328 Conector de programação MCU [ICSP] LED de depuração E/S geral Figura 198 – Componentes da placa microcontrolada Arduino Uno Adaptada de: Blum (2016). No geral, os programas usados nos microcontroladores ATMega são codificados em linguagem C ou até mesmo em linguagem assembly. Para isso, basta utilizar a IDE (sketch) do Arduino e carregar o arquivo codificado via bootloader pela porta USB da placa. 238 Unidade II Figura 199 – IDE Arduino Disponível em: https://bit.ly/3wcNqTD. Acesso em: 18 jan. 2023. O bootloader é um pequeno código carregado de fábrica no ATMega utilizando um cabeçalho ICSP que permite que uma USART (Universal Synchronous/Asynchronous Receiver/Transmitter) carregue o programa no Arduino. No geral, os microcontroladores AVR (Alf and Vegard’s Risc processor) são programados com um ICSP que se comunica com o microcontrolador através de uma interface periférica serial (SPI – Serial Peripheral Interface). Quando a placa é inicializada pela primeira vez, o Arduino inicializa o bootloader, que opera por alguns segundos até receber um comando de programação a partir do IDE através da UART (Universal Asynchronous Receiver/Transmitter) e que carrega o programa que está lhe sendo enviado, direcionando‑o para a memória do microcontrolador (BLUM, 2016). Existem alguns modelos de placa microcontrolada Arduino, todas com diferentes configurações e para diferentes aplicações. Para os modelos Arduino Uno e Arduino MEGA 250, utiliza‑se um microcontrolador secundário (ATMega 8U2 ou 16U2) como interface entre o cabo USB e os pinos USART seriais do microcontrolador principal. O Arduino Leonardo, por exemplo, usa um microcontrolador principal, o modelo 32U4, e tem uma USB integrada, fazendo com que não seja necessário um microcontrolador secundário. 239 ARQUITETURA DE COMPUTADORES MODERNOS Figura 200 – Placa microcontrolada Arduino Leonardo Disponível em: https://bit.ly/3CXfE8H. Acesso em: 18 jan. 2023. Sem dúvida, um dos componentes mais importantes da placa microcontrolada Arduino são os pinos de E/S de uso geral e os pinos ADC (Analogic‑Digital Converter). Os pinos ADC servem como entradas e saídas digitais e também podem atuar como entradas analógicas, medindo tensões entre 0V e 5V. Muitos desses pinos ADC também são multiplexados e servem como funções adicionais, como: interfaces seriais, saídas de largura de pulso moduladas e interrupções externas. Na maioria dos projetos desenvolvidos na plataforma Arduino, utiliza‑se a energia 5V, fornecida à placa pelo computadoratravés do cabo USB, obviamente, enquanto o projeto ainda está em fase de testes. A partir do momento em que o projeto se torna robusto e funcional, outras entradas de voltagem podem ser usadas, como a entrada 6V e 20V, conectadas via corrente contínua (DC) diretamente ou através do pino Vin da placa. A placa Arduino possui ainda reguladores de 5V e 3,3V integrados. Observe suas características: • 5V é utilizado em toda a placa, inclusive para situações em que se deseja simular um comportamento dos bits 0 e 1 (0V e 5V); • 3,3V é derivado para um pino onde se deseja acomodar shields (placas acopladas ao Arduino) e circuitos externos. Além do modelo Arduino Leonardo, há um muito utilizado em projetos que requerem um hardware reduzido tanto em tamanho quanto em desempenho e funcionalidade, que é a placa Arduino Nano, como mostra a figura a seguir. 240 Unidade II Figura 201 – Placa microcontrolada Arduino Nano Disponível em: https://bit.ly/3Xn3SMU. Acesso em: 18 jan. 2023. Essa placa foi projetada para ser montada diretamente em um soquete de prototipagem ou protoboard. Ela possui memória flash de 32 KB, memória SRAM de 2 KB, EEPROM de 1 KB e um clock de 16 MHz. Outras opções aparecem no mercado, por exemplo, a placa microcontrolada Arduino Mega 2560, constituída de maior quantidade de canais ADC e quatro interfaces seriais, além de memória flash de 8 KB, SRAM de 8 KB, EEPROM de 4 KB e um microcontrolador de 16 MHz. Figura 202 – Placa microcontrolada Arduino Mega Disponível em: https://bit.ly/3Wk9q9U. Acesso em: 18 jan. 2023. Saiba mais Para conhecer mais sobre o universo das placas Arduino, acesse o site: Disponível em: https://www.arduino.cc/. Acesso em: 18 jan. 2023. 241 ARQUITETURA DE COMPUTADORES MODERNOS As CPUs dos microcontroladores possuem pequena faixa operacional no processamento de instruções, que vão geralmente de 4 bits até 64 bits, com memórias que podem variar entre poucos kilobytes a muitos megabytes. Os microcontroladores também são considerados sistemas computacionais em miniatura ou sistemas em um único chip (SOCs – System On a Chip). Os SOCs se distinguem dos microcontroladores no sentido de terem maior complexidade e maior quantidade de recursos no chip, de modo que os SOCs podem conter mais do que apenas uma CPU (multiprocessado). Por exemplo, um roteador de internet contém vários processadores do tipo RISC que tratam o tráfego de comunicação e também um processador CISC para configuração e gerenciamento do próprio roteador. Como os SOCs têm memórias com maior capacidade, eles podem acomodar sistemas operacionais de tempo real (RTOS – Real Time Operation Systems), que são muito utilizados em sistemas embarcados complexos. A placa microprocessada Raspberry Pi 2 é um exemplo de SOC multiprocessado e que comporta um sistema operacional customizado embarcado. Figura 203 – Placa microprocessada Raspberry Pi 2 Disponível em: https://bit.ly/3XBlk00. Acesso em: 18 jan. 2023. O coração do sistema Raspberry Pi consiste em um processador multimídia Broadcom modelo BCM2835 de 250 MHz, contendo uma unidade de processamento gráfico, assim como hardware auxiliar de áudio e comunicações (UPTON; HALFACREE, 2013). Ele possui também uma arquitetura de conjunto de instruções conhecida como ARM (Advanced Risc Machine). O Raspberry Pi opera com uma alimentação de energia de 1A e 5V, fornecida pela porta micro‑USB. Esse baixo consumo de energia da placa (mesmo em situações de processamento complexas) justifica inclusive o não uso de dissipadores em seu sistema. O BCM2835 também se baseia no uso da geração de processadores ARM11, projetada em 2002, apoiada em um sistema SIMD (Single Instruction Multiple Data), método de operação com várias unidades operacionais proporcionando processamento paralelo, como pipeline. A partir de placas microprocessadas ou placas microcontroladas, foi possível criar uma quantidade de possibilidades infinitas quando o intuito é criar sistemas embarcados para utilidades do cotidiano das pessoas, facilitando também a criatividade de “informatizar” as coisas, criando uma nova área, chamada IoT. 242 Unidade II 8.2 Internet das coisas (IoT – Internet of Things) A internet é definida como um ambiente virtual, repleto de informações provenientes de diversos dispositivos conectados no mundo todo, mesmo não havendo a necessidade de estarem, é claro, conectados fisicamente no mesmo ambiente para que haja comunicação entre eles (STEVAN JR, 2018). Assim, a internet comporta uma grande quantidade de dados que estão disponíveis virtualmente a todas as pessoas que assim desejarem. Dessa forma, qualquer dispositivo que esteja conectado à internet pode ser identificado pelos demais dispositivos através de endereços lógicos universais, conhecidos como endereços IP (Internet Protocol). Consequentemente, pode‑se considerar também que é possível identificar qualquer “coisa” que possua um IP e esteja conectada na internet. Isso é a base para a IoT, em que todo dispositivo que consegue se comunicar pela internet possa ser usado para algum ou vários fins específicos, gerais, privados ou públicos. Figura 204 – IoT conecta o mundo, as pessoas e as máquinas Disponível em: https://bit.ly/3ISGBOG. Acesso em: 18 jan. 2023. Saiba mais Para aprender mais sobre endereços IP (Internet Protocol) versão 4 ou IPv4, acesse o seguinte site: O QUE é endereço IP – definição e explicação. Kaspersky, [s.d.]. Disponível em: https://bit.ly/3CUaN8c. Acesso em: 18 jan. 2023. Também é possível classificar a IoT como algo que se refira à possibilidade de localização ou rastreio de algum item conectado à internet através de alguma busca no ambiente virtual, podendo haver alguma troca de informação entre o dispositivo e as pessoas ou mesmo entre dispositivos de forma 243 ARQUITETURA DE COMPUTADORES MODERNOS automatizada e inteligente. Assim, a IoT se baseia, atualmente, na interligação facilitada de diferentes tecnologias de rede, criadas com diferentes propósitos, como resultado da primeira evolução da internet. Ao compartilharem dados entre si, todas essas redes menores interligadas irão proporcionar milhares de interações entre dispositivos, gerando uma infinidade de novas aplicações para a sociedade. Paralelamente à evolução dos dispositivos microprocessados (já abordados anteriormente neste livro‑texto), diversos outros dispositivos microcontrolados e de baixo custo também surgiram no mercado, tanto como produto final como para fins de prototipagem. Essas novas plataformas necessitam também de endereçamentos de internet, fazendo parte da grande malha de componentes em rede mundialmente. Observação O termo internet se refere à camada de rede de computadores composta de dispositivos como roteadores e/ou switches interligados. Sua principal função é transportar os dados de um ponto a outro ponto de forma rápida, confiável e segura. Já o termo web se refere a uma camada de aplicativos que opera sobre a camada de internet. Nesse caso, sua função é oferecer uma interface amigável ao usuário e que proporcione o uso e a interação com os dados transmitidos. A internet surgiu em meados de 1969 nos EUA com a finalidade de interligar alguns laboratórios onde eram realizadas pesquisas militares. A internet era conhecida inicialmente como ARPAnet devido à sua localização nos laboratórios da agência militar ARPA (Advanced Research Projects Agency). Mesmo com apenas algumas dezenas de pontos de rede (60 nós), a internet cresceu rapidamente nos anos seguintes, principalmente após a criação do protocolo TCP/IP (Transfer Control Protocol/Internet Protocol) baseado no endereçamento de 32 bits, o que resultaria em 232 endereços de internet possíveis, ou aproximadamente 4,2 bilhões de combinações de endereços possíveis. Isso mostra a versatilidade e capacidade real de se conectarem milhares de dispositivos portáteis à internet. Mas somente em 1989 que a Organização Europeia para Investigação Nuclear (CERN – Conseil Europeenpour la Recherche Nucleaire) na Suíça propôs um sistema de gerenciamento de informações da internet utilizando o formato hipertexto, que ficou conhecido como World Wide Web ou apenas WWW (STEVAN JR, 2018). Com o advento das redes mundialmente conectadas, logo se pensou que haveria o esgotamento de endereços IPs possíveis no início dos anos 1990, foi daí que se começou a desenvolver a sexta versão do protocolo IP, ou somente IPv6, que possuía uma dimensão de 128 bits, resultando em um número gigantesco de possibilidades de endereçamento (2128), o que acabou com os problemas de falta de endereços possíveis no futuro. Outra tecnologia que surgiu devido à alta demanda de endereçamentos e múltiplos computadores conectados foi o conceito de computação em nuvem, que é o fornecimento de recursos de TI sob demanda. Além da possibilidade da computação em nuvem, também surgiu em 1999 um termo cunhado por Kevin Ashton que ficou conhecido como Internet of Things. As big techs (grandes empresas de tecnologia) como Amazon, Microsoft, Google, IBM, Oracle, Cisco, entre outras, logo enxergaram o potencial de IoT. Assim, entre 2008 e 2009 a IoT efetivamente surgiu para suprir a quantidade exponencial de dispositivos conectados à internet, que ultrapassou o número de pessoas conectadas. 244 Unidade II Tabela 10 – Relação entre usuários e dispositivos conectados de 2003 a 2020 2003 2010 2015 2020(previsão) População mundial 6,3 bilhões 6,8 bilhões 7,2 bilhões 7,6 bilhões Dispositivos conectados 0,5 bilhão 12 bilhões 25 bilhões 50 bilhões Dispositivos conectados por pessoas 0,08 1,84 3,47 6,58 Fonte: Stevan Jr. (2018, p. 23). A partir das medições realizadas pelo grupo de pesquisas estatísticas da Cisco Internet Business Solutions Group, foi contabilizada a quantidade de dispositivos conectados à internet, como smartphones, tablets, laptops, chegando‑se a um total de 12,5 milhões somente em 2010. Naquela época, a população mundial era de 6,8 bilhões de pessoas, o que resultou uma taxa superior a 1 (1,84 dispositivos por pessoa), número 23 vezes maior ao obtido no ano de 2003. É importante também ressaltar quão diversificada são as aplicações de IoT no cenário da matriz de produção de um país. Vários setores da indústria e do comércio podem se beneficiar dessa tecnologia de integração de dispositivos; cada aplicação poderá sanar um problema econômico e/ou social, de forma inteligente e segura, simplesmente por meio da interação via internet. Todos os sinais coletados trafegam através de pequenas redes locais, comumente gerenciadas a distância. Esse gerenciamento utiliza redes de concentração de informações conectadas a outras redes em nuvem. Assim, para acessar toda a informação relativa aos diferentes serviços operando na rede, basta que aplicativos conectados usem softwares de gerenciamento de dados e serviços ligados aos dispositivos. 8.2.1 IoT versus M2M No final da década de 1960, surgiu uma tecnologia que relacionava a comunicação de dispositivos de máquina a máquina ou M2M (Machine to Machine). Naquela época, essa tecnologia proporcionou ao sistema de telefonia existente a comunicação de dados entre máquinas a partir de sistemas totalmente computadorizados (STEVAN JR, 2018). Depois disso, com o surgimento da telefonia celular, já na década de 1990 o uso do M2M também foi aplicado em situações que envolviam o sistema wireless, criando o termo WM2M (Wireless Machine to Machine). Nessa mesma época (1995), a empresa Siemens lançou no mercado o módulo GSM (Global System for Mobile) para comunicação industrial utilizando seu telefone Siemens S6, permitindo a comunicação entre máquinas usando redes sem fio. Em 1997, foram apresentadas as primeiras aplicações de monitoramento e rastreamento, o que possibilitou a automação automotiva, incorporada pela empresa GM. Isso permitiu o desenvolvimento de equipamentos de 245 ARQUITETURA DE COMPUTADORES MODERNOS conectividade sem fio e a adoção de satélites para comunicação e geolocalização (GPS). Assim, foi possível fazer a troca de informação de forma rápida e eficiente em uma ampla variedade de dispositivos, incluindo sensores e/ou atuadores, computadores, robôs, veículos autônomos, telefones etc. Depois desses exemplos e conceitos, uma questão fica em aberto: qual é a diferença entre M2M e IoT? Inicialmente, o conceito é de que o acesso remoto a um dispositivo ou máquina é comum em ambas as soluções (IoT e M2M), porém existem diferenças no tipo de acesso de cada tecnologia. Por exemplo, em soluções M2M há uma dependência de as comunicações serem ponto a ponto, além de utilizarem módulos de hardware incorporados a redes com ou sem fio, dependentes ou não de telefonia celular. Já as tecnologias do tipo IoT dependem de redes baseadas em IP para a criação de uma interface dos dados do dispositivo para uma plataforma virtual (em nuvem). As aplicações M2M são basicamente compostas de módulos de hardware, incorporados em uma máquina no meio ambiente de um cliente, assim se comunicando por meio de redes sem fio dedicadas, redes celulares ou redes cabeadas proprietárias em um aplicativo de software dedicado, localizado em um servidor de serviços de telecomunicações. Por sua vez, as tecnologias IoT industriais acomodam os mesmos dispositivos e máquinas das aplicações M2M, assim como sensores e atuadores de baixo custo, o que pode não justificar financeiramente a necessidade de incorporar módulos de comunicações M2M dedicados. Dessa forma, os dispositivos IoT se comunicam por meio de redes baseadas em IP padrões, permitindo monitoramento de seus dados em aplicativos corporativos através da nuvem. A arquitetura baseada em nuvem torna a IoT mais escalável, eliminando a necessidade de conexões incrementais de instalações físicas e da utilização de cartões de rádio frequência (RFID) com identificações inerentes aos projetos de M2M, ou seja, tornando a IoT um facilitador universal. Figura 205 – Diferentes dispositivos de IoT conectados em nuvem Disponível em: https://bit.ly/3ZD7w6W. Acesso em: 18 jan. 2023. 246 Unidade II Saiba mais Saiba mais sobre as tecnologias M2M (Machine to Machine) em: O QUE é M2M? Veja o que significa o conceito da ‘comunicação das máquinas’. Techtudo, 2013. Disponível em: http://glo.bo/3WqFicO. Acesso em: 18 jan. 2023. 8.3 Smart houses e smart cities 8.3.1 Casas inteligentes (smart houses) Quando se utiliza o termo casa inteligente, instantaneamente pensamos em dispositivos de automação residencial que permitem que o ambiente se torne mais confortável e funcional aos seus residentes. Podemos exemplificar alguns desses processos de automatização como: automação de portões, sistemas de alarme, sistemas de controle de temperatura e controle de iluminação. Geralmente, o termo para essas automatizações é chamado de domótica (STEVAN JR, 2018). Observação O termo domótica adveio da união das palavras latinas domus, que significa casa, e do sufixo grego tica, automático. Ou seja, baseia‑se em um conjunto de sistemas capazes de automatizar uma residência, levando em consideração serviços de bem‑estar, segurança, controle de energia e de comunicação, todos integrados através de uma infraestrutura de redes internas ou externas, cabeadas ou sem fio, que tornarão o ambiente mais inteligente. 247 ARQUITETURA DE COMPUTADORES MODERNOS Cofres inteligentes Multimídia smart TV Wi‑fi internet Sensores de gás e fumaça (segurança) Sensores de luz solar Sensores de luz solar Sensores de segurança presença/abertura de porta Controle de consumo de energia Computadores/ smartphones Desodorizador inteligente Controle de temperatura Iluminação inteligente Abertura codificada ou com biometria Sistema de vídeo porteiro vigilância/alarme Cozinha: ‑ Eletrodomésticos inteligentes (micro‑ondas, cafeteira etc.) ‑ Refrigerador inteligente ‑ Despensa (armários) inteligente Área de serviço: ‑ Máquina de lavar/secar inteligente Figura 206 – Ambiente residencialinteligente Fonte: Stevan Jr. (2018, p. 33). Historicamente, somente em 1990, a partir do desenvolvimento da microeletrônica e do barateamento dos sistemas microcontrolados, que foi possível aperfeiçoar e popularizar a domótica. Contudo, foi só 1998, quando a internet se popularizou, que o conceito de smart houses foi de fato estabelecido, por meio da interconexão de diversos dispositivos conectados em rede. Etimologicamente, o termo inteligente se refere a uma habilidade que envolve raciocínio ou mesmo à capacidade de compreender ou aprender. Porém, nesse contexto sabemos que a domótica está limitada a comandos e rotinas preestabelecidas, o que não pode ser interpretado necessariamente como uma “inteligência”. Hoje o termo inteligência pode ser empregado por dispositivos e/ou equipamentos que se conectam entre si ou mesmo em rede, tornando os ambientes ubíquos (algo encontrado em todos os ambientes). Assim, essa interação entre todos (dispositivos) os torna reativos à variação de condições ambientais, e não somente à variação de comandos preestabelecidos. Atualmente, uma casa pode ser denominada inteligente se estiver equipada com “produtos inteligentes”, ou seja, que possua a capacidade de comunicação e interpretação de comandos predefinidos contidos nesses dispositivos, através do uso da internet, possibilitando a tomada de decisão dos dispositivos em função das características ou intervenções do ambiente. 248 Unidade II Uma pesquisa realizada pela Intel no ano de 2016 ouviu aproximadamente 9 mil pessoas em nove países a respeito do que elas entendiam sobre o termo “casa inteligente”. O resultado dessa pesquisa apontou que 75% dos entrevistados esperavam obter benefícios diretos ao morar em uma casa inteligente, e mais de 55% das pessoas esperavam ter redução nas contas de eletricidade e gás. Vale a pena ressaltar que os dispositivos de uma casa inteligente mais citados nessa pesquisa foram: iluminação inteligente 73%), eletrodomésticos (62%) e sistemas de aquecimento residencial (60%) (STEVAN JR, 2018). Ar‑condicionado (AC) Ar‑condicionado Computador central Computador local Dados de energia Dados de sensores Dados de sensores Controle Dados de sensoresdo AC Termostato Interface de acesso remoto Interface de ajustes de parâmetro do AC sMAP Internet Armazenamento e nuvem Sinais dos sensores Figura 207 – Controle inteligente de um sistema de climatização de ambiente Fonte: Stevan Jr. (2018, p. 37). Outro fator relevante trazido por essa pesquisa foi a preocupação das pessoas com a segurança, citado por 92% dos entrevistados. Ela ponderaram o perigo de haver algum tipo de acesso indevido aos seus dados. Esses 92% também evidenciaram a preferência pelo uso de dispositivos confiáveis, utilizando alguma segurança como reconhecimento biométrico, identificação da impressão digital, RFID, reconhecimento de voz ou íris (STEVAN JR, 2018). Figura 208 – Alguns tipos de controle seguro de acesso aos ambientes e dispositivos Fonte: Stevan Jr. (2018, p. 34). 249 ARQUITETURA DE COMPUTADORES MODERNOS O adensamento do uso de novas tecnologias na automação de residências, escritórios e na indústria motivou a criação de não somente ambientes inteligentes, mas de cidades inteligentes. 8.3.2 Cidades inteligentes (smart cities) O termo cidade inteligente é associado a diversos contextos, que não necessariamente são pertinentes à aplicação crescente das tecnologias de ponta, ou seja, está relacionada ao aspecto econômico ou sustentável que se relaciona a uma mudança mundial de hábitos. Uma cidade inteligente, por exemplo, pode receber essa denominação por ter boas soluções de engenharia no transporte público. Outra cidade pode apresentar soluções ambientais reduzindo sua taxa de emissão de poluentes, ou mesmo cidades que utilizam estratégias para reciclagem coletiva do lixo. Apesar de todas essas abordagens poderem ser efetivamente amparadas por redes de sensores de monitoramento em diferentes cenários e ao mesmo tempo permitirem que centrais possam atuar em alguma situação, elas não ser referem, de forma direta, à conectividade digital de todas as informações que as cidades produzem o tempo todo. Dessa forma, tecnicamente falando, o conceito de cidades inteligentes também deve agregar a capacidade de conectividade que uma cidade terá, permitindo que seus cidadãos possuam a habilidade de monitorar todas (ou quase todas) as variações de ambiente e assim promover decisões em diferentes circunstâncias, de forma sustentável, humana e aceitável socialmente. Meio ambiente Transporte e mobilidade Segurança Conectividade do cidadão Figura 209 – Ilustração de uma cidade inteligente e seus possíveis eixos de atuação Fonte: Stevan Jr. (2018, p. 53). Em uma pesquisa realizada em 2106 pela Juniper Research elencou as cinco cidades mais inteligentes do mundo, utilizando como critério dessa escolha um conjunto de parâmetros que incluíam: adoção de tecnologias de Smart Grid (sistemas de distribuição de energia de forma inteligente), iluminação inteligente, uso de tecnologia da informação para melhoria do tráfego de veículos, pontos de acesso wi‑fi para moradores e transeuntes, sensoriamento para aplicações sustentáveis etc. (JUNIPER..., 2022). 250 Unidade II Saiba mais Aprenda um pouco mais sobre smart grid, suas aplicações e vantagens em: CAMARGO, C. Smart grid: a rede elétrica inteligente. TecMundo, 2009. Disponível em: https://bit.ly/2SGeuF4. Acesso em: 18 jan. 2023. No transporte público ou privado, os principais esforços se concentram no uso de técnicas para redução de taxas de congestionamento, semáforos dinâmicos, uso de sensores rodoviários, estacionamentos inteligentes etc. A partir desse parâmetro comparativo, a cidade que obteve a maior pontuação na pesquisa foi Singapura, seguida por Barcelona (Espanha), Londres (Inglaterra), São Francisco (EUA) e Oslo (Noruega). Todas essas cidades apresentaram um grande nível de sensoriamento, sobretudo no trânsito, propondo soluções para a redução e o monitoramento do tráfego (JUNIPER..., 2022). Figura 210 – Cidade‑estado de Cingapura, considerada uma das mais inteligentes do mundo Disponível em: https://bit.ly/3XGyysl. Acesso em: 18 jan. 2023. Em Singapura, um volume grande de sensores e câmeras tem sido instalado, principalmente a partir do ano de 2014, com o intuito de rastrear a limpeza das ruas até o tráfego dos automóveis. O nível de sensoriamento dessa cidade é tão grande que é possível detectar as pessoas que estão fumando em zonas não autorizadas ou mesmo jogando lixo pelas janelas das casas ou prédios. Uma situação corriqueira nas cidades inteligentes se refere ao acesso aberto a um grande conjunto de informações coletadas por milhares de dispositivos instalados nelas. A população em geral pode consultar esses dados, o que possibilita o melhor desenvolvimento de aplicativos que proporcionem 251 ARQUITETURA DE COMPUTADORES MODERNOS ainda mais a inserção de inteligência nessas cidades, sempre levando em consideração a privacidade dos cidadãos. Para que seja possível ter uma grande quantidade de dispositivos conectados em rede, algumas empresas de consultoria, como a americana Gartner, têm realizado pesquisas que estimam que em 2016 já existiam 1,6 bilhões de dispositivos conectados à internet, o que representava um aumento de 39% sobre o que fora previsto anteriormente, em 2015. Destes, 518 milhões de dispositivos se referiam à IoT em prédios comerciais. Ainda dentro desse conceito de cidades inteligentes, o termo sustentabilidade é vital, pois deverá ser abordado em prédios inteligentes, onde deverá haver coleta seletiva e reciclagem de materiais, geração de energia limpa etc. Tudo isso implica um novo termo denominado inmótica. Ela é atribuída e aplicada em edifícios e prédios comerciais e industriais assim como a domótica é aplicada em edificações residenciais. Ou seja, ambas as tecnologias tratam da adição de conforto, monitoramento e automaçãode dispositivos (JUNIPER..., 2022). Historicamente, pode‑se definir a evolução das construções inteligentes em três momentos: edifícios automatizados (1980 a 2000), edifícios inteligentes (2000 a 2015) e construções cognitivas (após 2015), conforme observado na figura a seguir. 2000 - 2015 20151980 - 2000 Visualização de indicadores + Bom para classificar + Permite identificações generalistas ‑ Ruim para identificar desperdício de energia 1 Análise dos consumidores de energia + Entendimento do consumo de cômodos individuais e comuns ‑ Somente analisa dados primários 2 Aprendizagem de comportamento + Controle preditivo completo + Compreensão do fluxo de energia e da ocupação do edifício + Conforto do usuário como parâmetro + Análise de parâmetros climáticos e coletivos ‑ Grande necessidade de ferramentas ‑ Consequente necessidade de ferramentas avançadas de análise de dados 3 Volume de dados Volume de dados Volume de dados Edifícios automatizados Edifícios inteligentes Edifícios cognitivos Figura 211 – Evolução dos edifícios automatizados Fonte: Stevan Jr. (2018, p. 58). 252 Unidade II Percebe‑se que a evolução inicia com a automatização de alguns itens do edifício, principalmente processos de identificação de pessoas, até atingir um período de uma grande inserção de sensores com o objetivo de controlar parâmetros como temperatura, iluminação, segurança, prevenção de incêndios, controle de energia, entre outros. Atualmente, existe uma tendência que engloba construções que se adaptam ao perfil de cada usuário do edifício, avaliando e controlando a ocupação, o perfil, as preferências de conforto, a gestão de energia otimizada etc. Na atual perspectiva, vale a pena indicar que as principais características dos edifícios inteligentes são: • desenvolvimento de aplicações com interface amigável, promovendo a aceitação do usuário; • criação de dispositivos flexíveis que permitam futuras adaptações; • gestão independente ou modular das diferentes áreas do edifício. Percebe‑se que essa grande quantidade de sistemas de controle e automação inevitavelmente gera a coleta de uma quantidade muito grande de dados e informações. Além disso, a conexão entre todos os elementos gerados durante o funcionamento dos dispositivos permitirá a criação de um banco com todos esses dados. Uma vez que todos os dados desses dispositivos inteligentes podem ser acessados e monitorados e gerar relatórios, esses dispositivos tornam‑se uma poderosa ferramenta para a tomada de decisões assertivas, denominadas Business Intelligence. Essas informações geradas e coletadas podem ser utilizadas em ações preditivas, baseadas em históricos ou experiência adquirida pelos dispositivos e sistemas inteligentes. Saiba mais Conheça melhor o que é o Business Intelligence e seus impactos em sistemas e dispositivos inteligentes acessando: COMO o Business Intelligence funciona. Microsoft, [s.d.]. Disponível em: https://bit.ly/3CT4dPp. Acesso em: 18 jan. 2023. 8.4 TI verde e sustentabilidade O crescimento da TI também deve englobar o crescimento econômico sustentável visando garantir que a natureza continue a fornecer os recursos ambientais dos quais o ser humano necessita para viver bem (AKABANE; POZO, 2020). A inovação verde é basicamente composta pela inovação de produtos denominados “verdes”, além da inovação dos processos que contenham alguma tendência sustentável. Para que ocorra a inovação de produtos ecológicos, é preciso que haja um estudo dos impactos tanto positivos quanto negativos ao meio ambiente e, obviamente, seu impacto no dia a dia das pessoas e da sociedade. 253 ARQUITETURA DE COMPUTADORES MODERNOS Todas as pesquisas que envolvam a sustentabilidade na área de TI devem encontrar um equilíbrio entre a crescente demanda por recursos naturais e o meio ambiente. Isso pode trazer benefícios para um país que possua grandes recursos naturais como o Brasil. Em consonância com essa nova abordagem, observa‑se que existe uma demanda grande para a ecoinovação, seguindo temas propostos pela ONU (Organização das Nações Unidas) sobre as mudanças climáticas. Padrões de qualidade também são cruciais na melhoria dessa ecoinovação, contendo várias iniciativas e estratégias que estão sendo elaborados a fim de abordar os principais desafios na propagação da TI verde e motivar as pessoas a ter um consumo sustentável. Os principais programas que abordam esses temas contêm as seguintes métricas: • Incentivar as pequenas e médias empresas (PMEs), que representam cerca de 98,5 % dos negócios registrados no Brasil, fornecendo diferentes instrumentos financeiros no incentivo de adoção da TI verde. • Desenvolver uma infraestrutura que tenha uma análise do ciclo de vida dos softwares de uma empresa. • Capacitação tanto dos colaboradores da empresa quanto dos fornecedores. • Desenvolvimento tecnológico contínuo, orientado tanto pelo mercado quanto por órgãos (ONGs) que proponham o crescimento sustentável a longo prazo. A implantação de inovações verdes em países emergentes como o Brasil é considerada um forte impulsor na expansão dos mercados e no desenvolvimento econômico e sustentável, de modo que vários mecanismos para acelerar a difusão desse pensamento “verde” estão sendo explorados cada vez mais. A sustentabilidade social de um projeto também consiste na capacidade de proporcionar uma boa qualidade de vida aos seus usuários, gerando comunidades saudáveis e habitáveis, que proporcionem equidade, diversidade, conectividade e qualidade de vida. Essa condição social requer uma contínua manutenção por meio de valores compartilhados e direitos iguais aos seus componentes. Dessa forma, pode‑se argumentar que a sustentabilidade ambiental está associada aos conceitos de produção e consumo sustentáveis. Assim, a sustentabilidade ambiental de um projeto de, por exemplo, uma edificação, deve contemplar a capacidade de utilizar recursos naturais sem exceder sua capacidade regenerativa, protegendo o capital, evitando danos aos humanos e também ao ambiente. Isso pode significar a restrição do sistema econômico e humano dentro dos limites biofísicos do ecossistema global do qual uma determinada empresa depende. Existem vários sistemas internacionais que constituem uma avaliação precisa no que se refere às edificações inteligentes, conforme ilustrado na figura a seguir: 254 Unidade II Figura 212 – Edifício inteligente utilizando energia sustentável através de placas fotovoltaicas Disponível em: https://bit.ly/3iH0ZaZ. Acesso em: 18 jan. 2023. Segundo Pinheiro e Crivelaro (2020), deve‑se sempre levar em consideração (quando tratamos de edificações inteligentes) as seguintes etapas: • Planejamento: a implantação do estudo do solo e as alterações da ecologia e biodiversidade do local da futura construção. • Projeto: a eficiência energética e o uso de fontes renováveis. • Operação: a conservação e o reúso dos meios e recursos naturais. • Cargas ambientais: a poluição que será produzida. • Qualidade do ambiente interno: a qualidade do acesso aos usuários. • Qualidade dos serviços: o desempenho dos serviços, a usabilidade dos serviços, a sustentabilidade dos sistemas e os impactos aos edifícios vizinhos. 255 ARQUITETURA DE COMPUTADORES MODERNOS • Sistema de gestão de qualidade: a melhoria do produto e dos serviços oferecidos, incrementando valores fornecidos no ciclo de vida do produto. • Gestão ambiental: o incentivo à sustentabilidade. • Responsabilidade social e desenvolvimento econômico: o relacionamento com a comunidade local e a sociedade como um todo. Saiba mais Aprenda um pouco mais sobre TI verde e seus impactos na sociedade em: CIRIACO, D. Tecnologia verde. TecMundo, 2009. Disponível em: https://bit.ly/3HfNyrO. Acesso em: 18 jan. 2023. 256 Unidade II Resumo Nesta unidade, estudamos o quão importantes são as instruções de máquina para o pleno funcionamento de um computador. Vimos que as instruções são, em geral, tabeladas eusadas de acordo com sua funcionalidade, utilizando basicamente caracteres em base hexadecimal. Além disso, foi possível observar que os computadores podem ter um desempenho melhor se, em seu ciclo de funcionamento, houver interrupções simples ou múltiplas. Em se tratando da melhora no desempenho do processamento dos computadores, destacamos que o processo denominado pipeline pode otimizar o tempo total de processamento, executando as instruções em paralelo em vez de sequencialmente. Foram apresentados conceitos sobre os dispositivos de E/S, como impressoras, monitores, mouse, teclado, entre outros. Aprendemos como se dão as comunicações entre os diferentes dispositivos periféricos com o computador. Em seguida, abordamos conceitos específicos sobre as diferentes tecnologias envolvendo monitores de computadores LCD, LED etc. De forma abrangente, foram discutidos alguns conceitos referentes ao processamento paralelo, além do pipeline. Foi possível visualizar melhorias implementadas como o superpipeline e o processamento superescalar, que ainda é empregado nos computadores contemporâneos. Acentuaram‑se aspectos como o emprego de múltiplos núcleos nos processadores atuais e qual é o ganho em desempenho que esses vários núcleos podem oferecer, operando em conjunto com softwares capazes de processar paralelamente. Pudemos entender um pouco mais sobre o que são sistemas embarcados e como essa tecnologia está presente em nosso dia a dia mesmo sem percebermos. Essa nova tecnologia permite que pessoas e dispositivos se comuniquem e possibilitem o envio e o recebimento de informações em tempo real através da internet (IoT), realizando o monitoramento dos próprios equipamentos assim como dos seres humanos. Também foi possível entender que o uso desses sistemas embarcados está intrinsecamente ligado a casas e edifícios inteligentes que utilizam a tecnologia para o benefício dos usuários domésticos ou usuários em nível industrial de ambientes cada vez mais inteligentes. Essa tecnologia 257 ARQUITETURA DE COMPUTADORES MODERNOS também pode ser expandida não somente em casas e edifícios, cidades inteiras podem se beneficiar com seu uso. Por fim, aprendemos a verdadeira importância da sustentabilidade no cotidiano das pessoas e das empresas, sobretudo no que se refere a métricas e preocupações que os governos do mundo inteiro estão impondo às empresas para que elas tenham uma consciência verde e se preocupem cada vez mais com o futuro do planeta. 258 Unidade II Exercícios Questão 1. Leia o texto a seguir a respeito de periféricos de entrada e de saída. A classe de dispositivos utilizados atualmente para a realização de operações de entrada e saída (isto é, que atuam na troca de informações tendo de um lado um computador e do outro usuários humanos do sistema) é bastante ampla e diversa, apresentando inúmeras características e operações. Entre elas, estão as elencadas a seguir. • Impressoras: criam cópia em papel, ou similar, de textos e figuras. As impressoras variam em atributos, tendo como forma mais primitiva dispositivos que se assemelham a máquinas de escrever. Atualmente, as mais modernas usam como tecnologia a impressão a laser e podem imprimir até milhares de linhas por minuto. • Monitores (ou telas): mostram textos e figuras, ambos podendo ser formatados de diversas maneiras e usar várias cores. O tipo mais clássico utiliza um tubo não muito diferente de um tubo de televisão (tubo de raios catódicos). Atualmente, também são aplicados visores de cristal líquido, que consomem menos energia. • Dispositivos gráficos (ou plotters): criam cópias impressas de gráficos e curvas em papel. Com o avanço tecnológico, atualmente têm capacidade de produzir material gráfico de ótima qualidade. Os traçadores, dependendo de suas características, podem produzir desenhos com mais de um metro de largura e comprimento limitado pela bobina de papel. • Dispositivos de exploração ótica: podem ler diretamente documentos. Entre os mais primitivos, pode‑se citar as leitoras óticas de cartões ou folhas de marcas (como as usadas no vestibular para registro das respostas). Atualmente, existem dispositivos bem mais complexos, como os scanners, que podem transferir para o computador imagens obtidas em figuras, textos e fotografias. • Dispositivos de apontamento: podem indicar informações ao computador por meio do posicionamento de um cursor sobre a tela, como é o caso do mouse e da caneta luminosa (ou lightpen). WEBER, R. F. Fundamentos de arquitetura de computadores. Porto Alegre: Bookman, 2012. p. 332 (com adaptações). 259 ARQUITETURA DE COMPUTADORES MODERNOS Considerando esse contexto, avalie as asserções a seguir e a relação proposta entre elas. I – Uma impressora multifuncional é considerada como um dispositivo tanto de entrada quanto de saída. porque II – Por meio dela, é possível tanto enviar informações ao sistema computacional como recebê‑las. A respeito dessas asserções, assinale a alternativa correta. A) As asserções I e II são proposições verdadeiras, e a asserção II é uma justificativa correta da I. B) As asserções I e II são proposições verdadeiras, e a asserção II não é uma justificativa correta da I. C) A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. D) A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. E) As asserções I e II são proposições falsas. Resposta correta: alternativa A. Análise das asserções I – Asserção verdadeira. Justificativa: um dispositivo de entrada é capaz de enviar informações do mundo exterior ao sistema computacional. Como exemplo, podemos citar o scanner. Um dispositivo de saída, por sua vez, é capaz de externalizar informações oriundas do sistema computacional. Como exemplo, temos uma impressora comum. Nesse contexto, uma impressora multifuncional é um dispositivo híbrido, dotado tanto de recursos de entrada (como o scanner) quanto de recursos de saída (a impressora em si). II – Asserção verdadeira. Justificativa: por meio de uma impressora multifuncional, é possível enviar informações ao computador, assim como receber informações do computador. Conclui‑se que a impressora multifuncional é um dispositivo híbrido justamente porque, por meio dela, é possível tanto enviar informações ao sistema computacional quanto receber informações dele. Logo, a asserção II é uma justificativa da asserção I. 260 Unidade II Questão 2. (Idecan 2020, adaptada) No contexto de arquitetura e organização de computadores, existe o processador, que, de modo geral, é responsável por executar uma série de instruções dadas pela máquina. Considerando essas instruções, entre outros aspectos, um processador pode ser construído sob a linha de arquitetura CISC ou RISC. Considerando essas arquiteturas, assinale a alternativa correta. A) Na arquitetura RISC, o processador possui um conjunto de instruções simples e limitado, sendo que cada instrução é executada em um ciclo de relógio (clock). B) Na arquitetura CISC, o processador possui um conjunto de instruções complexas, sendo que cada instrução é executada em um ciclo de clock. C) Na arquitetura RISC, o processador possui um conjunto de instruções complexas, e há a necessidade de vários ciclos de clock para executar cada instrução. D) Na arquitetura CISC, o processador possui um conjunto de instruções simples, e há a necessidade de vários ciclos de clock para executar cada instrução. E) Nas arquiteturas RISC e CISC, o processador não possui um conjunto de instruções, sendo que essas instruções devem ser fornecidas pela memória. Resposta correta: alternativa A. Análise das alternativas A) Alternativa correta. Justificativa: a linha de arquiteturas de computadores RISC (Reduced Instruction Set Computer, ou computador contendo um conjunto reduzido de instruções) abrange as arquiteturas de conjuntos de instruções que têm menor quantidade de instruções quando comparada à linha de arquiteturas CISC (ComplexInstruction Set Computer, ou computador contendo um conjunto complexo de instruções). Além disso, a linha RISC abrange arquiteturas que exibem as seguintes características: instruções de largura fixa, quantidade limitada de modos de endereçamento, modos de execução baseados em uso de pipeline e execução de cada instrução em apenas um ciclo do clock. Em resumo, em um processador cuja arquitetura segue a linha RISC, o processador possui um conjunto de instruções simples e limitado, sendo que cada instrução é executada em um ciclo de clock. B) Alternativa incorreta. Justificativa: o processador cuja arquitetura do conjunto de instruções segue a linha CISC apresenta diversas instruções de comprimentos variados. Nesse caso, espera‑se que cada instrução seja executada em múltiplos ciclos de clock. 261 ARQUITETURA DE COMPUTADORES MODERNOS C) Alternativa incorreta. Justificativa: em uma arquitetura de linha RISC, o processador não possui um conjunto de instruções complexas. D) Alternativa incorreta. Justificativa: em uma arquitetura de linha CISC, o processador não possui um conjunto de instruções simples. E) Alternativa incorreta. Justificativa: cada processador, necessariamente, possui um conjunto de instruções, que corresponde ao conjunto de operações primitivas que ele consegue realizar. 262 REFERÊNCIAS Textuais AKABANE, G. K.; POZO, H. Inovação, tecnologia e sustentabilidade: histórico, conceitos e aplicações. São Paulo: Érica, 2020. ALECRIM, E. Processadores: fabricação, miniaturalização e encapsulamento. Infowester, 2009. Disponível em: https://bit.ly/3GU25YC. Acesso em: 18 jan. 2023. ANIDO, R. Linguagens de montagem. 9. ed. Rio de Janeiro: Elsevier, 2016. BLUM, J. Explorando o Arduino: técnicas e ferramentas para mágicas de engenharia. Rio de Janeiro: Altabooks, 2016. CAMARGO, C. Smart Grid: a rede elétrica inteligente. TecMundo, 2009. Disponível em: https://bit.ly/2SGeuF4. Acesso em: 18 jan. 2023. CARTER, N. Arquitetura de computadores. Porto Alegre: Bookman, 2002. CIRIACO, D. Como funcionam os monitores LCD. Canaltech, 6 maio 2009. Disponível em: https://bit.ly/3ZGaszL. Acesso em: 17 jan. 2023. CIRIACO, D. Tecnologia verde. TecMundo, 2009. Disponível em: https://bit.ly/3HfNyrO. Acesso em: 18 jan. 2023. CLEMENTS, A. Computer organization and architecture: therms and variations. Stamford: Cengage, 2014. COMO o Business Intelligence funciona. Microsoft, [s.d.]. Disponível em: https://bit.ly/3CT4dPp. Acesso em: 18 jan. 2023. CRIADO disco óptico que armazena dados em cinco dimensões. Inovação Tecnológica, 2009. Disponível em: https://bit.ly/3GS7QGh. Acesso em: 18 jan. 2023. DELGADO, J.; RIBEIRO, C. Arquitetura de computadores. Rio de Janeiro: LTC, 2014. DESCOBERTA vulnerabilidade nos processadores com hyper‑threading. Inovação Tecnológica, 2005. Disponível em: https://bit.ly/3XmJPyk. Acesso em: 18 jan. 2023. EDWARDS, E.; LEUNG, K. Memory. [s.d.]. Disponível em: https://bit.ly/3IWNPkz. Acesso em: 19 jan. 2023. EVOLUÇÃO dos computadores. Brasil Escola, 2022. Disponível em: https://bit.ly/3HbWtuc. Acesso em: 17 jan. 2023. 263 FOROUZAN, B.; MOSHARRAF, F. Fundamentos da ciência da computação. São Paulo: Cengage Learning, 2012. FREIBERGER, P. A. Von Neumann machine. Encyclopedia Britannica, 2022. Disponível em: https:// bit.ly/3XnAoyH. Acesso em: 18 jan. 2023. HELERBROCK, R. Grafeno. Mundo Educação, [s.d.]. Disponível em: https://bit.ly/3wfkYQU. Acesso em: 18 jan. 2023. IDOETA, I. V.; CAPUANO, F. G. Elementos de eletrônica digital. 40. ed. São Paulo: Érica, 2011. JORDÃO, F. Tabela de processadores Intel. TecMundo, 2013. Disponível em: https://bit.ly/3GPuTBG. Acesso em: 18 jan. 2023. JUNIPER Research aponta Xangai como a cidade mais inteligente. Infor Chanel, 2022. Disponível em: https://bit.ly/3krWOQD. Acesso em: 19 jan. 2023. MCROBERTS, M. Arduino básico. São Paulo: Novatec, 2013. MONTEIRO, M. A. Introdução à organização de computadores. 5. ed. Rio de Janeiro: LTC, 2019. MOORE, G. Cramming more components onto integrated circuits. Electronics, v. 38, n. 8, abr. 1965. Disponível em: https://intel.ly/2OZhsWY. Acesso em: 18 jan. 2023. NICOLOSI, D. E. C. Microcontrolador 8051 detalhado. 9. ed. São Paulo: Érica, 2013. NOVO hardware acelera comunicação em processadores <i>multicore</i>. Inovação Tecnológica, 2011. Disponível em: https://bit.ly/3ZM8vBR. Acesso em: 18 jan. 2023. NULL, L.; LOBUR, J. Princípios básicos de arquitetura e organização de computadores. Porto Alegre: Bookman, 2010. OLIVEIRA, J. Intel anuncia CPUs de 11ª geração de alto desempenho para notebooks gamer. Canaltech, 11 maio 2021. Disponível em: https://bit.ly/3XhIl8q. Acesso em: 18 jan. 2023. PANNAIN, R.; BEHRENS, F. H.; PIVA JR., D. Organização básica de computadores e linguagem de montagem. São Paulo: Elsevier, 2012. PINHEIRO, A. C. F. B.; CRIVELARO, M. Edificações inteligentes: smart buildings para smart cities. São Paulo: Érica, 2020. PROCESSAMENTO paralelo chega aos computadores de mesa. Inovação Tecnológica, 2007. Disponível em: https://bit.ly/3GJqtfu. Acesso em: 18 jan. 2023. 264 O QUE é endereço IP – definição e explicação. Kaspersky, [s.d.]. Disponível em: https://bit.ly/3CUaN8c. Acesso em: 18 jan. 2023. O QUE é HD (disco rígido): características e como funciona. Infowester, [s.d.]. Disponível em: https://bit.ly/3kmldXH. Acesso em: 19 jan. 2023. O QUE é M2M? Veja o que significa o conceito da ‘comunicação das máquinas’. Techtudo, 2013. Disponível em: http://glo.bo/3WqFicO. Acesso em: 18 jan. 2023. O QUE é memória cache? Entenda sua importância para o PC. Techtudo, 2022. Disponível em: http:// glo.bo/3QTlwpo. Acesso em: 18 jan. 2023. O QUE é memória ROM? Techtudo, 2012. Disponível em: http://glo.bo/3HczPSG. Acesso em: 18 jan. 2023. ROTMAN, D. We’re not prepared for the end of Moore’s Law. Technology Review, 2020. Disponível em: https://bit.ly/3Wu0yi4. Acesso em: 18 jan. 2023. SAIBA quais são as diferenças entre compilador e interpretador. S.O.S. Digital, 2021. Disponível em: https://bit.ly/3kgqpfK. Acesso em: 18 jan. 2023. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Fundamentos de sistemas operacionais. 9. ed. Rio de Janeiro: LTC, 2015. SODERSTROM, T. How to choose the right memory: a 2020 guide to DRAM. Tom’s Hardware, 2020. Disponível em: https://bit.ly/2MacOBV. Acesso em: 18 jan. 2023. STALLINGS, W. Arquitetura e organização de computadores. São Paulo: Pearson, 2010. STEVAN JR, S. L. Internet das coisas: fundamentos e aplicações em Arduino e NodeMCU. São Paulo: Érica, 2018. TANENBAUM, A. S. Sistemas operacionais modernos. São Paulo: Pearson, 2010. TANENBAUM, A. S.; AUSTIN, T. Organização estruturada de computadores. São Paulo: Pearson, 2013. TOCCI, R. J.; WIDMER, N. S.; MOSS, G. L. Sistemas digitais: princípios e aplicações. São Paulo: Pearson, 2011. ULTRAMAGNETRON: gravação magnética à velocidade da luz. Inovação Tecnológica, 2014. Disponível em: https://bit.ly/3WmtKat. Acesso em: 19 jan. 2023. UPTON, E.; HALFACREE, G. Rapsberry Pi: manual do usuário. São Paulo: Novatec, 2013. VIANA, A. L. S. Um pouco sobre RAID – configuração via software e via hardware. DevMedia, 2012. Disponível em: https://bit.ly/3HglwfM. Acesso em: 18 jan. 2023. 265 266 267 268 Informações: www.sepi.unip.br ou 0800 010 9000