2010-01-15 5 views
0

J'essaie de compter le nombre total de ticks de l'horloge pour chaque processus (seulement quand il est en cours d'exécution). J'ai inséré le code suivant dans schedule() (fichier sched.h):Comptage des ticks de l'horloge sous Linux 2.4.14

... 
switch_tasks: 
    prefetch(next); 
    clear_tsk_need_resched(prev); 
    if (likely(prev != next)) { 
     rq->nr_switches++; 
     rq->curr = next; 

     /* My code start here*/ 
     if (next->start_count==1) 
      next->start_run=jiffies; 
     if (prev->start_count==1) 
     { 
      prev->total_running += (jiffies-prev->start_run); 
      printk("total running = %lu, jif-start = %lu\n", \ 
      prev->total_running, jiffies-prev->start_run); 
     } 
... 

J'ai ajouté le printk parce que j'ai obtenu des résultats étranges. Voici la sortie:

fonctionnement total = 1522, JIF-start = 1
fonctionnement total = 1522, JIF-start = 0
fonctionnement total = 1523, JIF-start = 1
totale en cours d'exécution = 1, jif-start = 1
fonctionnement total = 0, jif-start = 0
fonctionnement total = 0, jif-start = 0
fonctionnement total = 0, jif-start = 0
fonctionnement total = 0, jif-start = 0

Cela n'a aucun sens pour moi. Quelque chose ne va pas avec mon code?

+0

Je n'ai pas la source 2.4.14 à portée de main, mais ne relance-t-on pas tous les processus de la file d'attente d'exécution? –

+0

non, seulement certains d'entre eux (environ 10) – ThP

Répondre

1

La sortie de trace affiche l'état par tâche, il est donc plus logique si vous avez également imprimé prev->pid pour identifier la tâche dont vous parlez.

EDIT: OK, si vous voulez obtenir "jif-start = 0": notez que jiffies ne s'incrémente que sur chaque interruption de minuterie, ce qui est presque certainement toutes les 10ms pour un noyau 2.4.14. Il est tout à fait possible (ou même probable) que vos processus liés aux E/S puissent se réveiller, puis bloquer les E/S très rapidement, entraînant une nouvelle replanification avant que le compteur Jiffy n'augmente.

Il est possible que vous pouvez être en mesure d'obtenir des intervalles de temps plus haute résolution de do_gettimeofday() (déclarée dans <linux/time.h>), mais la résolution réelle que vous sortirez de qui dépend de la plate-forme.