2012-07-19 12 views
5

Mentre leggo, i jiffie vengono incrementati su ogni tick del timer tramite il timer ISR. Ma in SMP, tutte le CPU avranno il proprio interrupt del timer e quindi il proprio ISR del timer. Quindi la mia domanda è:Quale CPU incrementa i jiffie in SMP?

I jiffies sono globali su tutte le CPU? Se sì, come e quale CPU lo incrementa nel suo ISR del timer?

Secondo la mia comprensione i jiffies non possono essere per cpu altrimenti lo stesso processo quando programmato su CPU differente vedrà un valore diverso da jiffy.

Grazie

risposta

5

Ci sono due interrupt timer:
Il timer locale (LOC in /proc/interrupts) spara una volta per ogni recipiente sul CPU.
Il timer globale interrompe (interrupt 0) si attiva una volta per jiffy, una qualsiasi CPU. Aumenta jiffies.

Si noti che l'opzione di configurazione "Tickless Kernel" (introdotta in Linux 2.6.21, CONFIG_NO_HZ), rimuove questi interrupt. Con un kernel senza tick, non ci sono più interruzioni periodiche. Invece, quando un processo inizia il suo quantum, Linux imposta una "sveglia" nell'hardware per attivare un interrupt quando il quantum è finito.

+0

CPU0 CPU1 CPU2 CPU3 0: 41 19 0 8 IO-APIC-edge timer @ugoren: Sopra è l'uscita di cat/proc/interrupts per l'allarme da 0 sul mio desktop Ubuntu. Mi chiedo ancora quale CPU stia calcolando i jiffies su quale timer interrompe. Di seguito è riportato il mio cat/proc/versione Linux versione 3.2.0-26-generic-pae (buildd @ lamiak) (gcc versione 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) – Inder

+0

Sembra che l'interruzione globale del timer sia gestita da una diversa CPU ogni volta. Non vedo alcun problema con esso. – ugoren

+0

Sì, il timer globale (interrupt 0) viene gestito da una CPU diversa ogni volta. Ma se questo timer incrementa i jiffies allora la somma del conteggio su tutte le CPU dovrebbe essere valori jiffies. Ma la somma è 68 (41 + 19 + 0 + 8) che non può essere jiffies. – Inder

0

Vedere questo post link.

Fondamentalmente, la variabile tick_do_timer_cpu contiene CPU ID che dovrebbe eseguire il codice che gestisce i jiffies. L'esecuzione della funzione di gestione dei jiffies può passare da un core all'altro, ma ovviamente l'aggiornamento non può essere eseguito su core diversi nello stesso tempo.

Vedi anche kernel/time/tick-common.c

Problemi correlati