[Reimpresso] Por que a interrupção não consegue dormir

  1. Durante o processamento da interrupção, a alternância do processo não deve ocorrer, porque, no contexto da interrupção, a única coisa que pode interromper o manipulador de interrupções atual é a interrupção de maior prioridade, que não será interrompida pelo processo (também é o mesmo para softirq, tasklet, Portanto, essa metade inferior não pode dormir.) Se você dorme no contexto de interrupção, não há como ativá-lo, porque todo o wake_up_xxx é para um determinado processo e, no contexto da interrupção, não há conceito de processo, nem estrutura de tarefas (É o mesmo para softirq e tasklet), então ele realmente dorme, como chamar uma rotina que causará um bloqueio, o kernel quase certamente morrerá.

2. Schedule () salva o contexto atual do processo (valor do registro da CPU, status do processo e conteúdo da pilha) ao alternar processos, para que esse processo possa ser retomado mais tarde. Após uma interrupção, o kernel primeiro salva o contexto do processo atualmente interrompido (recuperado após chamar o manipulador de interrupções); mas, no manipulador de interrupções, o valor do registro da CPU deve ter sido alterado (o PC mais importante do contador de programas, pilha SP Etc.) Se schedule () for chamado neste momento devido a operações de suspensão ou bloqueio, o contexto do processo salvo não é o contexto atual do processo, portanto, não é possível chamar o schedule () em um manipulador de interrupções.

3. O manipulador de interrupção usará a pilha do kernel do processo interrompido, mas não terá nenhum impacto, porque depois que o manipulador for usado, ele limpará completamente a parte da pilha usada e restaurará a aparência original antes de ser interrompido.

4. Quando o contexto é interrompido, o kernel não é preemptivo; portanto, se ele dorme, o kernel deve travar.

Se a interrupção puder dormir, isso causará muitos problemas.Por exemplo, se você dormir em uma interrupção de relógio, o relógio do sistema operacional será caótico e o planejador perderá sua base; por exemplo, você será interrompido em um IPI (interprocessador) ), As outras CPUs aguardam sua resposta em um loop sem fim, você dorme e os outros processadores não estão funcionando; por exemplo, você dorme em uma interrupção de DMA, o processo acima ainda está esperando sincronicamente a E / S Quando concluído, o desempenho é bastante reduzido ... Existem muitos exemplos. Portanto, a interrupção é um assunto urgente que precisa ser tratado pelo sistema operacional imediatamente, não porque ele não pode dormir, mas porque não tem motivos para dormir.

Transferência de: Por que a interrupção não consegue dormir

Publicado 91 artigos originais · elogiou 17 · mais de 50.000 visualizações

Acho que você gosta

Origin blog.csdn.net/qq_23327993/article/details/105387782
Recomendado
Clasificación