Baixe o app para aproveitar ainda mais
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 faz
Compartilhar