2012-07-19 7 views
5

Cuando leo, los jiffies se incrementan en cada tic del temporizador por el temporizador ISR. Pero en SMP, todas las CPU tendrán su propia interrupción de temporizador y, por lo tanto, sus propios ISR de temporizador. Entonces mi pregunta es:¿Qué CPU incrementa los jiffies en SMP?

¿Hay jiffies globales en todas las CPU? Si es así, ¿cómo y qué CPU lo incrementa en su temporizador ISR?

Según mi entender, los jiffies no pueden ser por computadora, de lo contrario el mismo proceso cuando se programa en una CPU diferente verá un valor diferente de jiffy.

Gracias

Respuesta

5

Hay dos interrupciones del temporizador:
la interrupción de temporizador local (LOC en /proc/interrupts) dispara una vez por jiffy en cada CPU.
El temporizador global interrumpe (interrupción 0) dispara una vez por jiffy, uno cualquier CPU. Incrementa jiffies.

Tenga en cuenta que la opción de configuración "Tickless Kernel" (presentada en Linux 2.6.21, CONFIG_NO_HZ) elimina estas interrupciones. Con un kernel sin tick, ya no hay interrupción periódica. En cambio, cuando un proceso inicia su quantum, Linux establece un "despertador" en el hardware para activar una interrupción cuando el quantum termina.

+0

CPU0 CPU1 CPU2 CPU3 0: 41 19 0 8 IO-APIC-borde del temporizador @ugoren: Arriba está la salida de cat/proc/interrumpe de interrupción 0 en mi escritorio de Ubuntu. Todavía me pregunto qué CPU está calculando jiffies en qué interrupción del temporizador. A continuación está mi cat/proc/versión Linux versión 3.2.0-26-generic-pae (buildd @ lamiak) (gcc versión 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) – Inder

+0

Parece que se trata la interrupción global del temporizador por una CPU diferente cada vez. No veo ningún problema con eso. – ugoren

+0

Sí, el temporizador global (interrupción 0) está siendo manejado por una CPU diferente cada vez. Pero si este temporizador incrementa los jiffies, entonces la suma del conteo en todas las CPU debe ser un valor de jiffies. Pero la suma es 68 (41 + 19 + 0 + 8) que no pueden ser jiffies. – Inder

0

Ver este mensaje link.

Básicamente, tick_do_timer_cpu variable tiene CPU ID que se supone que ejecuta el código que gestiona los jiffies. La ejecución de la función de administración de jiffies puede saltar de un núcleo a otro, pero la actualización no se puede hacer en diferentes núcleos al mismo tiempo, obviamente.

Ver también kernel/time/tick-common.c

Cuestiones relacionadas