Kontextwechsel eines Prozesses

8

Ich muss einen Systemaufruf machen, um die freiwillige & amp; unfreiwillige Kontextwechsel eines Prozesses. Ich kenne bereits die Schritte, um einen neuen Systemaufruf zu einem Linux-Kernel hinzuzufügen, aber ich habe keine Ahnung, wo ich für die Kontextwechselfunktion starten soll. Irgendeine Idee?

Danke.

    
Nausikaa 14.02.2012, 23:55
quelle

4 Antworten

8

Wenn Ihr Syscall nur Statistiken ausgibt, können Sie den Zählcode des Kontextschalters verwenden, der sich bereits im Kernel befindet.

wait3 syscall oder getrusage syscall meldet bereits die Anzahl der Context-Switches in struct rusage fields:

%Vor%

Sie können es versuchen, indem Sie Folgendes ausführen:

%Vor%

wobei " /bin/ls -R " ein beliebiges Programm ist.

Wenn Sie in Kernel-Quellen nach einem "struct rusage" suchen, finden Sie diese accumulate_thread_rusage in kernel / sys.c, das die Russe-Struktur aktualisiert. Es liest von struct task_struct *t ; die Felder t->nvcsw; und t->nivcsw; :

%Vor%

Dann sollten Sie nvcsw und nivcsw im Kernelordner suchen, um zu sehen, wie sie vom Kernel aktualisiert werden.

asmlinkage void __sched-Zeitplan (void) :

%Vor%

Zeiger switch_count stammt aus Zeile 4091 oder Zeile 4111 der gleichen Datei.

PS: Link von perreal ist großartig: Ссылка (suche context_swtch )

    
osgx 16.02.2012, 19:38
quelle
5

Dies ist bereits vorhanden: Die virtuelle Datei /proc/NNNN/status (wobei NNNN die dezimale Prozess-ID des Prozesses ist, den Sie kennenlernen möchten) enthält unter anderem die Anzahl der freiwilligen und unfreiwilligen Kontextwechsel. Im Gegensatz zu getrusage können Sie so die Anzahl der Kontextwechsel für beliebige Prozesse lernen, nicht nur für untergeordnete Elemente. Weitere Details finden Sie auf der proc(5) Hilfeseite .

    
zwol 16.02.2012 19:46
quelle
0

Ein Prozess wird einen Kontextwechsel im Falle von Blockierung, Zeitquantität oder für Interrupts usw. machen. Schließlich wird die Funktion schedule () aufgerufen. Da Sie es für jeden Prozess separat zählen möchten, müssen Sie eine neue Variable für jeden Prozess zum Zählen der Anzahl der Kontextwechsel beibehalten. Und Sie können diese Variable jedes Mal im Planspaß für den aktuellen Prozess aktualisieren. Mit Ihrem Systemaufruf können Sie diesen Wert lesen. Hier ist ein Ausschnitt der Zeitplanfunktion von pintos,

%Vor%     
Deepak 16.02.2012 18:14
quelle
0

Gesamtzahl der Kontextwechsel

cat /proc/PID/sched|grep nr_switches

Freiwilliger Kontextwechsel

cat /proc/PID/sched | grep nr_voluntary_switches

Unerwünschte Kontextwechsel

cat /proc/PID/sched|grep nr_involuntary_switches

wobei PID die Prozess-ID des Prozesses ist, den Sie überwachen möchten.

Wenn Sie diese Statistiken jedoch durch das Patchen (Erstellen eines Hooks) der Linux-Quelle erhalten möchten, ist der mit der Planung zusammenhängende Code in

vorhanden

kernel / sched /

Ordner des Quellbaums. Insbesondere

kernel / sched / core.c enthält die Funktion schedule (), die der Code des Linux-Schedulers ist. Der Code von CFS (Complete Fair Scheduler), welcher einer der verschiedenen Scheduler in Linux ist und am häufigsten verwendet wird, ist in

vorhanden

/kernel/sched/fair.c

scheduler () wird ausgeführt, wenn das Flag TIF_NEED_RESCHED gesetzt ist, also finden Sie heraus, von wo alle Stellen dieses Flag gesetzt sind (benutzen Sie cscope auf linux source), was Ihnen einen Einblick in die Arten von Kontextwechsel für a gibt Prozess.

    
Sahil Singh 30.03.2015 05:44
quelle