# Interrupção

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

Alguns sistemas usam sinalização híbrida de edge-triggered e level-triggered. O hardware não só procura por uma borda mas também verifica que se o sinal de interrupção está ativo por um certo período de tempo.
O uso comum da interrupção híbrida é para o NMI (non-maskable interrupt). Pois geralmente os sinais importantes NMIs – ou até mesmo catastróficos - eventos, uma boa implementação deste sinal tenta assegurar que a interrupção é válida, verificando se ele permanece ativo por um período de tempo. Esta abordagem de dois passos ajuda a eliminar interrupções falsas a partir do sistema afetado.

### Mensagem sinalizada

Uma mensagem sinalizada de interrupção, não usa uma linha de interrupção física. Em vez disso, um sinal do dispositivo é pedido por serviço enviando uma curta mensagem sobre algum meio de comunicação, normalmente barramento do computador. A mensagem pode ser um tipo reservado para interrupções, ou pode ser de algum tipo preexistente, como memória escrita.
Mensagens sinalizadas de interrupção agem muito bem como interrupções edge-triggered, em que a interrupção é momentânea ao invés de um estado permanente. Software de tratamento de interrupção trata de dois em muitos da mesma maneira. Normalmente, múltiplas mensagens sinalizadas interrompem com a mesma mensagem (a mesma linha de interrupção virtual) são permitidas para mesclar, só as interrupções edge-triggered estreitamente espaçadas podem mesclar.
Mensagens sinalizadas de interrupções vetoriais podem ser compartilhadas, a medida que o meio de comunicação pode ser compartilhado. Nenhum esforço adicional é requerido.
A identidade da sinalização é indicada por um padrão de bits de dados, não exigindo um condutor físico separado, muitas mais interrupções distintas podem ser eficazmente tratadas.Isso reduz a necessidade de compartilhamento. Mensagens de interrupção podem também ser passadas através de um barramento serial, não necessitando de quaisquer linha adicional.
PCI Express, barramento computacional serial, usa exclusivamente mensagens de interrupção sinalizadas.

### Campainha

Em uma analogia com o botão de pressão aplicado a sistemas de computador, o termo campainha ou campainha de interrupção, é muitas vezes para descrever um mecanismo pelo qual um sistema de software pode sinalizar ou verificar um dispositivo de hardware que tenha algum trabalho para ser feito. Normalmente, o sistema de software irá colocar os dados em algum lugar conhecido mutuamente concordando acerca do(s) local(ais) da memória, e “tocar a campainha” por escrever para um local de memória diferente. Esse local de memória diferente é muitas vezes chamado de região da campainha, e pode até haver várias campainhas com diferentes finalidades nesta região. Este ato de escrever para a região da memória da campainha da qual “tocar o sino” e notificar o dispositivo de hardware que os dados estão prontos e esperando. Os dispositivos de hardware que agora são conhecidos, os dados são válidos e sem postos em prática. Os dados são normalmente gravados em um disco rígido, enviados através de uma rede, criptografados, etc.
O termo campainha de interrupção é geralmente um equivoco. Ele é similar a interrupção porque ele causa algum trabalho para ser feito pelos dispositivos, entretanto a região da campainha é, às vezes implementado como uma região polled, às vezes a região da campainha escreve através de registros de dispositivos físicos, e às vezes a região da campainha está diretamente conectada aos registros de dispositivos físicos. Quando escritos ou diretamente aos registros de dispositivos físicos, o que pode, mas não necessariamente causar uma real interrupção para ocorrer na CPU. Se houver uma.
A campainha de interrupção pode ser comparada a mensagens sinalizadas de interrupção, elas têm algumas similaridades.

## Dificuldades de compartilhamento com linhas de interrupção

Vários dispositivos de compartilhamento em linha de interrupção (de qualquer estilo de origem) agem como fonte falsa de interrupção em relação uns aos outros. Com muitos dispositivos em uma linha de cada trabalho (workload), as interrupções no serviço crescem em proporção ao quadrado do número de dispositivos. Não é, portanto, preferência para espalhar uniformemente dispositivos disponíveis as linhas de interrupção. Escassez de linhas de interrupção é um problema nos desenhos mais antigos do sistema onde as linhas de interrupção são distintos condutores físicos. Interrupções de mensagens sinalizadas, onde a linha de interrupção é virtual, são favorecidas em um novo sistema de arquitetura (como a PCI Express) e alivia este problema de forma considerável.
Alguns dispositivos com uma interface de programação mal desenhada não fornecem nenhuma maneira de determinar se eles têm os serviços solicitados. Eles podem trancar ou não o mal comportamento quando eles querem. Tais dispositvos não podem tolerar interrupções falsas, e também não podem tolerar o compartilhamento em linha de interrupção. Placas ISA, muitas vezes devido ao projeto de construção barato, são verificados estes problemas. Tais dispositivos são cada vez mais raros, como a lógica de hardware se torna mais barato e novos sistemas de arquiteturas delegam interrupções partilháveis.

## Problemas de desempenho

Interrupções fornecem baixa sobrecarga e boa latência a baixa carga oferecida, mas desagrada significativamente a alta taxa de interrupção salvo cuidado que é tomado para evitar várias patologias. Trata-se de várias formas de livelocks, quando o sistema gasta todo o seu tempo processando interrupções, com a exclusão de outras tarefas necessárias. Em condições extremas, um grande número de interrupções (como o tráfego de rede muito alta) podem parar completamente o sistema. Para evitar tais problemas, o sistema operacional deve programar a manipulação de interrupção de rede com o mesmo cuidado como cronogramas de execução de processos.

## Usos típicos

Usos típicos de interrupções incluem os seguintes: system timer (temporizador do sistema), disks I/O (discos E/S), Power-off signal (liga-desliga o sinal), e traps (armadilhas). Outras interrupções para transferir dados usando UARTs ou Ethernet; sentido de teclas pressionadas; controle de motores; ou qualquer outra coisa que o equipamento deve fazer.
Um timer de sistema clássico gera interrupções periódicas de um contador ou o power-line. O manipulador de interrupção conta as interrupções para manter o tempo. A interrupção do timer também pode ser usado por um agendador de tarefas do sistema operacional para reagendar as prioridades de processos em execução. Contadores são populares, mas alguns computadores mais antigos utilizam a freqüência da linha de energia, já que as empresas de energia na maioria dos países ocidentais controlam a freqüência da corrente elétrica com um relógio atômico muito preciso.
Um disco de sinais de interrupção é realizado a partir de uma transferência de dados ou para o disco periférico. Um processo de espera para ler ou escrever um arquivo é iniciado novamente.
Uma interrupção power-off prevê ou requer uma perda de poder. Ele permite que o equipamento do computador execute uma ordem de parar de funcionar.
Interrupções também são usadas em typeahead Features para o buffer de eventos como as teclas digitadas.