[Reimpreso] ¿Por qué la interrupción no puede dormir?

  1. Durante el procesamiento de la interrupción, el cambio de proceso no debe ocurrir, porque en el contexto de interrupción, lo único que puede interrumpir el controlador de interrupción actual es la interrupción de mayor prioridad, que no será interrumpida por el proceso (esto es lo mismo para softirq, tasklet, Por lo tanto, esta mitad inferior no puede dormir.) Si duerme en el contexto de interrupción, no hay forma de despertarlo, porque todo wake_up_xxx es para un determinado proceso, y en el contexto de interrupción, no hay un concepto de proceso, no hay tarea_estructura (Esto es lo mismo para softirq y tasklet), por lo que realmente duerme, como llamar a una rutina que causará un bloqueo, el núcleo seguramente morirá.

2. Schedule () guarda el contexto del proceso actual (valor de registro de la CPU, estado del proceso y contenido de la pila) al cambiar los procesos, de modo que este proceso pueda reanudarse más tarde. Después de que ocurra una interrupción, el núcleo primero guardará el contexto del proceso actualmente interrumpido (recuperado después de llamar al manejador de interrupciones); pero en el manejador de interrupciones, el valor del registro de la CPU debe haber cambiado (el PC contador de programa más importante, stack SP Etc.) Si se llama a schedule () en este momento debido a operaciones de suspensión o bloqueo, el contexto de proceso guardado no es el contexto de proceso actual, por lo tanto, no es posible llamar a schedule () en un controlador de interrupciones.

3. El controlador de interrupciones usará la pila de kernel de proceso interrumpido, pero no tendrá ningún impacto en él, porque después de que se use el controlador, borrará completamente la parte de la pila que usa y restaurará la apariencia original antes de ser interrumpido.

4. Cuando se interrumpe el contexto, el núcleo no es preferente, por lo que si duerme, el núcleo debe bloquearse.

Si la interrupción puede dormir, causará muchos problemas. Por ejemplo, si duerme en una interrupción de reloj, el reloj del sistema operativo será caótico y el programador perderá su base; por ejemplo, se le interrumpirá en un IPI (interprocesador ), Las otras CPU están esperando su respuesta en un bucle sin fin, usted duerme, luego los otros procesadores no funcionan; por ejemplo, duerme en una interrupción DMA, el proceso anterior todavía está esperando sincrónicamente E / S Cuando se completa, el rendimiento se reduce considerablemente ... Hay muchos ejemplos. Por lo tanto, la interrupción es un asunto urgente que debe ser manejado por el sistema operativo inmediatamente, no porque no pueda dormir, sino porque no tiene razón para hacerlo.

Transferencia desde: ¿Por qué la interrupción no puede dormir?

91 artículos originales publicados · 17 elogiados · 50,000+ vistas

Supongo que te gusta

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