Pergunta

Já vi várias perguntas aqui sobre exceções , e alguns deles sugerir interrupções como exceções , mas nenhum fazer a conexão clara.

  • O que é uma interrupção?

  • O que é uma exceção? (Por favor, explicar o que exceções são para cada idioma você sabe, uma vez que existem algumas diferenças)

  • Quando é uma excepção uma interrupção e vice-versa?

Foi útil?

Solução

Um interupt é um sinal de CPU gerada pelo hardware, ou instruções da CPU específicas. Estes causa interupt manipuladores para ser executado. As coisas tais como sinais de I / O de I / O hardware gerar Interupts.

Uma exceção pode ser pensado como um software de versão de um interupt, que afeta apenas o seu processo.

Eu não tenho certeza sobre os detalhes exatos, mas uma exceção pode ser implementado por um interupt.

Outras dicas

Seu processador vai ter uma série de pinos de interrupção externas. Normalmente, estes pinos são conectados ao hardware e são usados ??para indicar quando algum evento externo ocorre. Por exemplo, se você estiver usando uma porta serial UART irá aumentar levantar um pino que está ligado a um dos pinos de interrupção no processador para indicar que um byte foi recebido.

Outros periféricos como temporizadores, controladores USB, etc. também irá gerar interrupções, com base em algum evento externo.

Quando o processador recebe um sinal em um de seus pinos de interrupção externos que vai saltar imediatamente para algum local nomeado na memória e iniciar a execução. O código executado normalmente é chamado um ISR, ou rotina de serviço de interrupção. A menos que você esteja implementando motoristas ou fazendo software incorporado de algum tipo é improvável que você nunca vai se deparar com ISRs.

Infelizmente, a resposta à pergunta sobre exceções é um pouco menos clara -. Houve 3 significados diferentes listados em outras respostas nesta página

A resposta de Ron Savage refere-se à construção de software. Isto é puramente uma exceção nível de aplicação, onde um pedaço de código é capaz de indicar um erro que pode ser detectado por algum outro pedaço de código. Não há envolvimento hardware aqui.

Depois, há a exceção como visto por uma tarefa. Esta é uma construção nível de sistema operacional que é usado para matar uma tarefa quando ele faz algo ilegal -. Como dividir por 0, acessando ilegalmente memória etc

E em terceiro lugar, não é a exceção hardware. Em termos de comportamento é idêntico a uma interrupção em que o processador irá saltar imediatamente para algum local de memória nomeado e iniciar a execução. Sempre que um difere excepção de uma interrupção é uma excepção que é causada por alguma actividade ilegal que o processador tenha detectado. Por exemplo, a MMU no processador irá detectar acessos à memória ilegais e causar uma exceção. Essas exceções de hardware são o gatilho inicial para o sistema operacional para realizá-lo de tarefas de limpeza (como descrito no parágrafo acima).

As interrupções são geradas por dispositivos externos ao CPU (marca de timer, a conclusão da operação de disco, de chegada do pacote de rede, etc.) e são assíncrona com a execução do programa. As exceções são síncrona com a execução do programa (por exemplo, divisão por zero, o acesso a um endereço inválido).

A menos que seu programa está em execução sem um sistema operacional (ou você está desenvolvendo um sistema operacional), ele nunca vai ver uma matéria exceção / interrupção. Eles são capturados pelo sistema operacional e manipulados por ele (interrupções), ou convertido em alguma outra forma antes de ser refletida de volta para o programa do usuário (por exemplo, sinais de UNIX, tratamento de exceção estruturada (SEH) no Windows), onde ele tem uma chance de manipulação -lo.

Interrupções indicar que algo externo ao núcleo do processador requer a sua atenção. Ele interrompe o fluxo normal do programa, executa uma rotina de interrupção de serviço (ISR) e geralmente retorna para onde estava antes da interrupção ocorreu.

Existem muitas variações sobre este tema básico: as interrupções podem ser gerados por software, outra tarefa pode ter a CPU após a ISR, etc .. O ponto chave é que as interrupções podem ocorrer a qualquer momento por uma razão o código / CPU tem nenhum controle sobre .

Uma exceção é a mais complicada bit para definir porque tem potencialmente três níveis de significado:

Exceções Hardware

Alguns processadores (PowerPC por exemplo) definir exceções para indicar que algum tipo de condição incomum ocorreu: Reposição do Sistema, endereço inválido, alguns virtual tradução de endereços de cache perder, etc ...

Essas exceções são também utilizados para implementar pontos de interrupção e as chamadas do sistema. Neste caso, eles agem quase como interrupções.

Exceções OS

Algumas das exceções de hardware será o tratado pelo sistema operacional. Por exemplo, o programa acessa a memória inválido. Isso fará com que uma exceção de hardware. A OS tem uma rotina de tratamento para essa exceção, e as probabilidades são que o sistema operacional irá enviar um sinal para a sua aplicação (SIGSEGV por exemplo) que denota que há um problema.

Se o seu programa tem um manipulador de sinal instalado, o manipulador de sinal será executado e espero que lidar com a situação. Se você não tem um manipulador de sinal, o programa pode ser rescindido ou suspenso.

Eu consideraria manipuladores de exceção estruturada da janela (SEH) para ser este tipo de exceções.

Exceções software

Algumas linguagens como Java, C ++ e C # tem o conceito de exceções de software, onde a língua oferece para o tratamento de condições imprevistas ou incomuns relacionados com o funcionamento do programa . Neste caso, uma exceção é lançada em algum momento no código e algum código mais acima na pilha de execução do programa iria "pegar" a exceção e executar. Isto é o que blocos try / catch fazer.

Eu vou elaborar sobre o que uma interrupção ocorre porque há um tipo fundamental de ninguém interrupção tem lidado com ainda:. O temporizador

Mas, primeiro, deixe-me fazer backup. Quando você receber uma interrupção, o manipulador de interrupção (que vive em kernelspace) runs, que normalmente desativa interrupções, vê a qualquer negócio pendente (manipulação do pacote que acabou de chegar na rede, o processamento do keystroke, etc.) e depois (lembre-se que 're ainda no kernel neste ponto) descobre que processo deve ser executado ao lado (poderia ser o mesmo, poderia ser um diferente, depende do programador) e depois executá-lo.

Apenas um processo é executado no processador em um determinado momento. E quando você estiver usando um sistema operacional multitarefa, a maneira como ele muda entre eles é chamado de troca de contexto - basicamente os registros do get processador despejado para a memória, o fluxo passa para o novo processo, e quando o processo é feito, você troca de contexto para algo outra pessoa.

Então, digamos que eu escrever um programa C simples que conta todos os números, ou a seqüência de Fibonacci, ou qualquer outra coisa sem parar. Ou melhor ainda: não faz nada, mas gira dentro de um (1) loop while. Como outros processos no sistema tem a chance de correr? E se não há nada acontecendo para causar uma interrupção?

A resposta é que você tem um dispositivo temporizador que está constantemente a interromper. E isso é o que mantém um processo de fiação de derrubar todo o sistema. Embora eu notar que os manipuladores de interrupção interrupções desativar, por isso, se você faz algo que bloqueia indefinidamente você pode derrubar todo o sistema.

Exceção

Uma exceção é quando o processador executa um código que não está em seu caminho normal. Esta é uma 'excepção' a ??operação normal, o que é essencialmente um movimento linear por meio de estruturas de código e de controlo. Diferentes línguas têm suporte para vários tipos de exceções, normalmente utilizada para erros punho durante a operação do programa.

Interrupção

Uma interrupção é uma exceção ao nível do hardware (geralmente). A interrupção é um sinal físico no processador que conta a CPU para armazenar seu estado atual e salte para interrupção (ou exceção) código do manipulador. Uma vez que o manipulador é feito o estado original é restaurado e processamento pode continuar.

Uma interrupção é sempre uma exceção, mesmo quando ele é destinado. Interrupções podem indicar:

  • erros, como uma violação de acesso de memória
  • que o sistema operacional precisa realizar uma operação para apoiar um programa em execução, como uma interrupção de software, ou um pedido de paginação de memória
  • um dispositivo de hardware requer atenção, tal como um pacote de rede recebido, ou um tampão de transmissão vazio

Estes sempre forçar o processador para fazer uma pausa sua atividade atual para lidar com a exceção levantada, apenas a retomar uma vez que o manipulador de interrupção está completa.

Armadilhas

Em termos de interrupções, armadilhas comuns são condições de corrida. Por exemplo, você pode ter uma interrupção que incrementa periodicamente um relógio de tempo real global. O relógio pode ser de 64 bits em uma máquina de 32 bits.

Se um programa está a ler o relógio, e recebe a primeira palavra de 32 bits, em seguida, a interrupção ocorre, uma vez que o manipulador de interrupção sai do processo recebe a palavra segunda de 32 bits, e os dados serão incoerente - as duas palavras podem ser fora de sincronia. Se você tentar usar um mutex ou Semaphore para bloquear a variável no processo, em seguida, a interrupção irá travar aguardando o bloqueio e parar o sistema (impasse), a menos que o manipulador e os processos que usam os dados são escritos com muito cuidado. É fácil ficar em apuros quando se escreve para interrupções.

funções reentrante também são outro problema. Se você está executando funcA no código do programa, tome uma interrupção que também executa funcA você pode acabar com consequências indesejadas devido a variáveis ??compartilhadas (estática, ou variáveis ??de pilha, classes, etc). Você tipicamente deseja executar o mínimo de código possível no manipulador de interrupção, e muitas vezes têm que definir um sinalizador para que o processo pode fazer o trabalho real mais tarde, sem se preocupar com os conflitos.

De certa forma isso é semelhante ao desenvolvimento de um multiprocessador, e é uma das razões pelas quais a programação do kernel ainda é considerado magia negra por muitos.

-Adam

são esperados interrupções ocorrem regularmente (embora às vezes eles não são regulares) .. eles interrupção o cpu porque algo importante que aconteceu e ele precisa ser cuidado imediatamente.

As excepções deveriam ser exceções à regra; estes são jogados por software porque algo inesperado aconteceu e esta é a sua chance de tentar fazer alguma coisa sobre isso, ou pelo menos acidente graciosamente.

Quando você está falando de interrupções e exceções que você está geralmente falando perto de código de nível de hardware e interrupções e exceções são muitas vezes implementadas em parte por hardware e parte em software.

Uma interrupção é um evento em hardware (ou manualmente disparado na montagem) que está associado com um vetor de manipuladores que podem ser usados ??para lidar com eventos da interrupção, seja IO Conclusão, IO Error (Disco de memória falha), IO Evento (o movimento do rato, por exemplo). As interrupções podem dar origem a exceções frequentemente quando algum interrupção inesperada ocorre.

Uma exceção é um comportamento inesperado, na maioria das vezes quando se utiliza o hardware estes vêm de uma interrupção e são tratados separadamente no software usando um manipulador de interrupção. Linguagens de programação como nós vê-los quase sempre disfarçar isso como uma estrutura de algum tipo de controle.

Em geral, uma interrupção é uma armadilha de algum tipo de hardware implementado. Você registrar um manipulador para uma interrupção específica (divisão por 0, os dados disponíveis sobre um periférico, o temporizador expirou) e quando o evento acontece, todas as paradas de todo o sistema de processamento, você rapidamente processar a interrupção, e as coisas continuam. Estes são geralmente implented em um driver de dispositivo ou do kernel.

Uma exceção é uma maneira software implementado de tratamento de erros no código. Você configurar um manipulador para específico (ou gerais) exceções. Quando ocorre uma exceção, os idiomas em tempo de execução será iniciado desenrolar a pilha até que ele atinja um manipulador para esse manipulador específico. Nesse ponto, você pode tratar a exceção e continuar ou encerrar o seu programa.

manter as coisas simples ...

Quando você terminar de lidar com uma interrupção, você (normalmente) retorno ao que você estava fazendo antes de você foram interrompidos.

Como manusear uma exceção envolve jogando camadas afastado sucessivas do que você está trabalhando atualmente em até bolha até um ponto onde a exceção pode ser tratado (travado).

Ao manusear uma interrupção, você pode decidir lançar uma exceção, mas isso não significa que você tem que considerar a interrupção-se como uma exceção. Exceções não "interrupção" (uma vez que isso implicaria a possibilidade de retornar ao que você estava fazendo antes de você foram interrompidos); em vez disso, "abortar" (um subconjunto de) sua atividade atual.

E, como foi observado várias vezes já, as interrupções são geralmente desencadeada por entidades externas, como hardware ou usuários (como um clique do mouse ou keystroke como CTRL-C), enquanto exceções são gerados (jogado) sincronicamente por software detectar um "problema "ou "condições excepcionais".

Iterrupts são basicamente hardware impulsionado, como sua impressora indiciating é "sem papel" ou a placa de rede, indicando que tem conexão perdida.

Uma exceção é simplesmente uma condição de erro em seu programa, detectada por um bloco try / catch. Como:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

É uma maneira útil para pegar "qualquer erro", que acontece em um bloco de código para que possa lidar com eles de uma forma similar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top