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.
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:
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;
:
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
)
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 .
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%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
vorhandenkernel / 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.
Tags und Links linux linux-kernel operating-system context-switch