2013-02-25 13 views
5

Sono novizio su Linux Kernel. Attualmente, ho esaminato i codici inattivi e ho avuto una domanda. Quando il processore non ha taks nel proprio runqueue, allora è possibile che entri in modalità inattiva, specifico WFI (in attesa di interrupt). (Tutto ciò che ho menzionato riguarda l'architettura ARM non X86. Quindi qualcosa è sbagliato per X86.) Dopo essere rimasto nello stato WFI, forse un altro processore (non inattivo) desidera distribuire lo attività a questo processore inattivo (dal bilanciamento del carico) . A quel tempo un processore occupato, , rende l'attività migrata. Dal mio punto di vista, quando l'attività è stata migrata, il processore inattivo dovrebbe svegliarsi immidiatley per elaborare l'attività. destra? Tuttavia, non sono riuscito a trovare codici che attivano il processore inattivo, ma hanno trovato solo codici sulla registrazione dell'attività per l'esecuzione inattiva del processore.In che modo il kernel di Linux attiva il processore inattivo quando viene creata una nuova attività?

Mi piacerebbe sapere quale meccanismo è dietro al risveglio del processore quando viene assegnato un nuovo compito. Oppure spostare l'attività da una coda ad un'altra piuttosto che lasciarla fino a quando non viene risvegliato dall'IR2 imprevedibile di ?

Vi prego di mostrare la verità :)

risposta

6

WFI è una speciale istruzione di co-processore per l'ARM. Ad esempio,

ENTRY(cpu_arm946_do_idle) 
     mcr  p15, 0, r0, c7, c0, 4   @ Wait for interrupt 
     mov  pc, lr 

Non ha nulla a che fare con Linux (direttamente).

Esiste un'attività speciale idle che esegue l'istruzione WFI sull'ARM, se non c'è lavoro da fare. L'attività idle è l'attività Linux con priorità più bassa, pianificata se non c'è nient'altro. Se WFI viene eseguito da idle, alcuni driver interromperanno (forse un timer) quando non c'è lavoro da fare. Nel caso SMP, non andrà a idle se ci sono altri processi che possono essere migrati; lo schedulatore lo controlla. Se un carico diventa alto, il processore occupato ha bisogno di wake gli altri; Nel caso di un ARM con un interrupt. Di solito questa gestione è in arch/arch /kernel/process.c. Ad esempio il x86 ha default_idle(). Non conosco le specifiche di come funziona il x86, ma puoi guardare la fonte.

Per la tua domanda In che modo il kernel di Linux attiva il processore inattivo quando viene creata una nuova attività?, la risposta è che non è così. Solo fork() (e alcune funzioni simili) possono creare una nuova attività; originariamente dall'attività init e quindi uno dei suoi figli. Se si dispone di un lavoro cron, verrà programmato un timer prima che passi a sleep/idle. Questo timer riattiverà il sistema, riprogrammando cron e quindi cron chiamerà fork(), per creare la nuova attività.

Altri meccanismi correlati sono cpufreq, cpuidle, kernel/power ecc

Il verità è sempre obiettivo/soggettivo e certamente non è globale.Mostrami il metric per la verità e posso mostrarti la verità .

0

basta impostare il flag della CPU come il codice seguente dopo aver creato il thread.

= > thread's task_struct->flags |= PF_WAKE_UP_IDLE; 
+0

Questo è per il thread wakeup, non per il wakeup della CPU. Il flag PF_WAKE_UP_IDLE è assente nel kernel Linux 3.18 e successivi. – Zhifei

0

sguardo select_task_rq_fair(), che è il metodo CFS :: select_task_rq(). Questo è il caso più rappresentativo in cui lo schedulatore attiva l'attività inattiva per il riequilibrio delle code di esecuzione.

0

smp_send_reschedule() invierà IPI_RESCHEDULE al processore che è inattivo. Questo lo sveglierà da wfi. Viene chiamato da un paio di posti, un esempio è wake_up_process -> try_to_wake_up -> try_to_wake_up -> ttwu_queue -> ttwu_queue_remote (nomi di funzioni dal kernel 3.4).

Problemi correlati