Em Ciência da Computação e Engenharia de Computação, uma interrupção é um sinal de um dispositivo que tipicamente resulta em uma troca de contextos, isto é, o processador para de fazer o que está fazendo para atender o dispositivo que pediu a interrupção.

Computadores digitais geralmente oferecem uma maneira de iniciar rotinas de software em resposta a eventos eletrônicos assíncronos. Esses eventos são sinalizados para o processador através de pedidos de interrupção (IRQs). O processamento da interrupção compõe uma troca de contexto para uma rotina de software especificamente escrita para tratar a interrupção. Essa rotina é chamada rotina de serviço de interrupção, ou tratador de interrupção (interrupt handler). Os endereços dessas rotinas são chamados vetores de interrupção e são armazenados geralmente em uma tabela na memória RAM, permitindo sua modificação caso seja necessário. As Interrupções foram concebidas para evitar o desperdício de tempo computacional em loops de software (chamados polling loops) esperando eventos que serão disparados por dispositivos. Ao invés de ficarem parados esperando o evento acontecer, os processadores tornaram-se capazes de realizar outras tarefas enquanto os eventos estão pendentes. A interrupção avisa ao processador quando o evento ocorreu, permitindo dessa forma uma acomodação eficiente para dispositivos mais lentos.

Interrupções permitem aos processadores modernos responder a eventos gerados por dispositivos enquanto outro trabalho está sendo realizado. Os processadores também oferecem instruções para permitir os processos dispararem interrupções de software (traps). Isso pode ser usado para implementar uma multitarefa cooperativa.

Resumo Processadores atuais incluem mecanismos para o tratamento de situações especiais, conhecidas como interrupções. Em uma interrupção, o fluxo normal de instruções é interrompido para que a causa da interrupção seja tratada.

O processador pode auto-interromper-se para tratar exceções de execução, tais como um erro em uma operação aritmética, uma tentativa de execução de instrução ilegal ou uma falha de página em memória virtual.

Interrupções de hardware foram introduzidas como forma de evitar o desperdício de tempo valioso do processador em polling loops, a espera de eventos externos. Eles podem ser implementados no hardware como um sistema distinto, com linhas de controle, ou podem ser integrados no subsistema da memória.

Se implementado em hardware, um circuito controlador de interrupção, como o IBM PC’s Controlador Programável de Interrupção (PIC), pode ser conectado entre o dispositivo de interrupção e o pino de interrupção do processador para várias fontes multiplexadoras de interrupção em uma ou duas linhas disponíveis da CPU. Se implementado como parte do controlador de memória, as interrupções são mapeadas para dentro do sistema de espaço de endereço de memória.

Interrupções podem ser categorizadas em: maskable interrupt, non-maskable interrupt (NMI), inter-processor interrupt (IPI), software interrupt, e spurios interrupt. Maskable interrupt (IRQ): é uma interrupção de hardware que pode ser ignorada por configurar um bit em um registro da máscara de interrupção (IMR) bit-mask. Non-maskable interrupt (NMI): é uma interrupção de hardware que carece um bit-mask associado, então isto nunca pode ser ignorado. NMIs são frequentemente usados por timers, especialmente por watchdog timers. Inter-processor Interrupt (IPI): é um caso especial que é gerado por um processador para interromper outro processador em um sistema de multiprocessadores. Software Interrupt: é uma interrupção gerada dentro de um processador pela execução de uma instrução. Interrupções de software são frequentemente usadas para implementar chamadas de sistema porque elas implementam uma chamada de subrotina com a mudança de nível da CPU. Spurious Interrupt: (interrupção falsa) é uma interrupção de hardware que é indesejável. Elas são tipicamente geradas por condições do sistema, tais como interferência elétrica em uma linha de interrupção ou através de um hardware projetado incorretamente.

Os processadores têm tipicamente uma máscara interna de interrupção com o que permite o software ignorar toda interrupção de hardware externo ao mesmo tempo que é definido. Esta máscara pode oferecer acesso mais rápido do que acessar o registro da máscara de interrupção (IMR) em um PIC, ou desabilitar as interrupções do próprio dispositivo. Em alguns casos, como a da arquitetura x86, desabilitar e habilitar as interrupções no próprio processador, como uma barreira de memória, ele pode ser de fato mais lento.

Uma interrupção que deixa a máquina em um estado bem-definido é chamada de interrupção precisa.

Uma interrupção tem 4 propriedades: O PC (Program Counter) é salvo em um lugar conhecido. Todas as instruções antes apontadas pelo PC tem total execução. Sem instruções além do apontado e que está sendo executado pelo PC (que não é proibido na instrução, além do PC, as mudanças feitas nos registros ou memórias devem ser desfeitas antes que a interrupção aconteça). O estado de execução da instrução apontada pelo PC é conhecida.

Uma interrupção que não atenda a esse requerimento é chamada de interrupção imprecisa.

O fenômeno em que o desempenho geral do sistema é severamente prejudicado pela quantidade excessiva de tempo de processamento gasto na manipulação da interrupção, é chamado de tempestade de interrupção (interrupt storm).

Tipos de Interrupção Nível Desencadeado (Level-Triggered) Essa interrupção é uma classe de interrupções em que a presença de uma interrupção sem serviço é indicada por um nível alto (1), ou nível baixo (0), da linha de solução da interrupção. Um dispositivo deseja um sinal em uma linha de drives de interrupção e em seguida segue neste nível até a manutenção. Ele cessa afirmando a linha quando a CPU ordena que seja lida ou não a condição que fez o sinal de interrupção.

Normalmente, as amostras de processador de entrada de interrupção em horários pré-definidos durante cada ciclo de barramento como o estado T2 para o microprocessador Z80. Se a interrupção não está ativa quando a amostra do processador está, a CPU não a vê. Uma possibilidade para este tipo de interrupção é eliminar sinais falsos a partir de uma ruidosa linha de interrupção: um pulso falso, muitas vezes será tão curto que não será notado.

Vários dispositivos podem compartilhar uma nível desencadeado de interrupção, se eles forem projetados para isso. A linha de interrupção deve ter resistores pull down e pull up, para que quando não ativamente conduzido, pouse em seu estado inativo. Dispositivos ativamente afirmados da linha para indicar uma interrupção pendente/excelente, mas deixar a linha flutuar quando não sinalizar uma interrupção. A linha é seguida em seu estado afirmado quando qualquer (um ou mais de um) dos dispositivos de partilha é uma sinalização de interrupção pendente/excelente.

Essa classe de interrupção é favorecida por causa de um comportamento conveniente quando a linha é compartilhada. Ao detectar a afirmação da linha interrompida, a CPU deve buscar através de dispositivo de compartilhamento até um que necessite de serviço é detectado. Depois da assistência, os dispositivos da CPU podem reavaliar o estado da linha de interrupção para determinar se algum outro dispositivo também precisa de assistência. Se agora a linha é de-asserted, a CPU evita a verificação dos dispositivos restantes na linha. Uma vez que alguns dispositivos de interrupção são mais frequentes que outros, e outros dispositivos de interrupção são particularmente custosos, um pedido de cuidado é empregado para aumentar a eficiência.

Existem também problemas sérios com o compartilhamento de nível desencadeado (level triggered). Enquanto qualquer dispositivo na linha tem uma solicitação pendente para o serviço, a linha matém-se continua, assim não é possível detectar mudança no estado de qualquer outro dispositivo. Adiando um dispositivo de baixa prioridade a manutenção não é uma opção, porque isso impediria a detecção de solicitações de serviço de dispositivos de alta prioridade. Se existe um dispositivo na linha que a CPU não sabe como atender, então qualquer interrupção a partir desse dispositivo permanentemente bloqueia todas as interrupções de outros dispositivos.

A razão para isso foi o ganho de eficiência acima discutidos. (Versões mais recentes do PCI permitem, e PCI Express requer o uso de interrupções de mensagens sinalizadas).

Borda-desencadeada (Edge-Triggered) É uma classe de interrupção que é sinalizada pelo nível de transmissão sobre a linha de interrupção, quer seja uma borda de descida (1 a 0) ou uma borda de subida (0 a 1). Um dispositivo deseja um sinal a pulsos de drives de interrupção na linha e em seguida a libera para o seu estado de repouso. Se o pulso é muito curto para ser detectado pelo polled I/O em seguida, pode ser necessários hardwares especiais para detectar a borda (edge).

Vários dispositivos podem compartilhar uma linha de interrupção de borda-desencadeada (Edge-Triggered) se forem designados para isso. A linha de interrupção deve ter resistores pull down e pull up, para que quando não ativamente conduzido, pouse em um estado particular. Dispositivos de interrupção de sinalização de breve condução da linha para o seu estado de non-default, e deixar a linha flutuar (o não ativamento da condução) quando não sinalizar uma interrupção. Esse tipo de conexão é também referida como coletor aberto. A linha, em seguida, carrega todos os pulsos gerados por todos os dispositivos. (Isto é análogo ao cabo de tração em alguns ônibus e carros que qualquer passageiro pode puxar para sinalizar ao motorista que eles estão pedindo uma parada.) Entretanto, interrupção de pulsos a partir de diferentes dispositivos podem mesclar se ocorrerem próximos no tempo. Para evitar perder interrupções a CPU pode acionar a trailing edge do pulso (Por exemplo, a borda de subida, se a linha é puxada para cima e conduzido de baixo). Depois de detectar uma interrupção a CPU pode verificar todos os dispositivos por necessidade de serviço.

Interrupções da Edge-triggered não sofrem os problemas que as interrupções do level-triggered tem com o compartilhamento. Serviços de dispositivos de baixa-prioridade podem ser arbitrariamente adiados, e interrupções serão continuas para serem recebidas a partir de dispositivos de alta-prioridade que estão sendo atendidos. Se existir um dispositivo que a CPU não sabe como atender, ele pode causar uma interrupção falsa ou falsas interrupções periódicas, mas ela não interfere na sinalização de interrupção de outros dispositivos. Entretanto, isto é razoavelmente fácil para uma interrupção edge-triggered ser perdida – por exemplo, se as interrupções tem que ser mascaradas por um período – e a menos que exista algum tipo de hardware latch (trava) que grave o evento, é impossível recuperar. Tais problemas causados em muitos “travamentos” no hardware dos primeiros computadores porque o processador não sabia o que era preciso fazer. Hardwares modernos tem muitas vezes um ou mais registros de estado de interrupção que travam os pedidos de interrupção: os softwares de interrupção bem escritos edge-driven muitas vezes verificam esses registros para garantir que os eventos não sejam perdidos.

A antiga Industry Standard Architecture (ISA) usa interrupções edge-triggered mas não delega que os dispositivos sejam hábeis para o compartilhamento entre eles. A porta paralela também usa interrupções de edge-triggered. Muitos dispositvos antigos assumem que tem uso exclusivo de suas linhas de interrupção, fazendo isto eletricamente inseguro para o compartilhamento. No entanto, placas-mãe ISA incluem resistores pull-up nas linhas IRQ, dispositivos tão bem comportados compartilhados com interrupções ISA.

Híbrido