Unter Linux wird der Kontext auch als CPU-Kontext bezeichnet. Dies ist die Umgebung, auf die sich die CPU verlassen muss, bevor sie eine Aufgabe ausführt, einschließlich CPU-Registern und Programmzählern , CPU-Register und Programmzähler), laden Sie dann den Kontext der neuen Aufgabe in diese Register und den Programmzähler und springen Sie schließlich zu der neuen Position, auf die der Programmzähler zeigt, um die neue Aufgabe auszuführen.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
Linux ist ein Multitasking-Betriebssystem. Es unterstützt Aufgaben, die viel größer sind als die Anzahl der gleichzeitig auszuführenden CPUs. Natürlich werden diese Aufgaben nicht gleichzeitig ausgeführt, sondern das System Die CPU wird ihnen der Reihe nach zugewiesen, was dem Benutzer die Illusion vermittelt, dass viele Aufgaben gleichzeitig ausgeführt werden.
Bevor jede Aufgabe ausgeführt wird, muss die CPU wissen, wo die Aufgabe geladen wird und wo sie mit der Ausführung beginnt. Mit anderen Worten, das System muss das CPU-Register und den Programmzähler (Programmzähler, PC) im Voraus einrichten. Es handelt sich um einen in die CPU integrierten Speicher mit geringer Kapazität, der jedoch extrem schnell ist Speichern Sie den Ort der Anweisung, die von der CPU ausgeführt wird, oder den Ort des nächsten auszuführenden Befehls
Zusammenfassend haben wir die Antwort
besteht darin, zuerst den CPU-Kontext zu ändern Die vorherige Aufgabe (d. h. die CPU-Register und der Programmzähler) lädt dann den Kontext der neuen Aufgabe in diese Register und den Programmzähler und springt schließlich zu der neuen Position, auf die der Programmzähler zeigt, um die neue Aufgabe auszuführen. 2. Detaillierte Einführung in den Kontextwechsel code> , Kontextwechsel unterbrechen
Lassen Sie uns zunächst die folgenden zwei Wissenspunkte verstehen, die mit dem Kontextwechsel verbunden sind: Systemaufruf, Prozesslaufstatus.
Linux unterteilt den laufenden Bereich des Prozesses entsprechend der Berechtigungsstufe in
Kernel-Bereich
und Benutzerbereich
. Die in diesen beiden Bereichen ausgeführten Prozesszustände werden als kernel state
bzw. user state
bezeichnet.
Kernelraum (Ring 0): Hat die höchsten Berechtigungen und kann direkt auf alle Ressourcen zugreifen (Dateien lesen), 进程上下文切换
、线程上下文切换
、中断上下文切换
我们先了解下面2个上下文切换涉及的知识点系统调用、进程运行态
进程的运行态:
Linux 按照特权等级,把进程的运行空间分为内核空间
和用户空间
。在这两种空间中运行的进程状态分别称为内核态
和用户态
。
内核空间(Ring 0):具有最高权限,可以直接访问所有资源(读取文件,)
分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
用户空间(Ring 3):只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中,才能访问这些特权资源
典型的用户态空间程序有:Shells、数据库、web服务器、PHP程序、Java程序……
在linux系统使用top命令查看cpu时,能看到user和system两项,对应的就是用户态和内核态占用的cpu资源
如上,我们的web服务是运行在用户态
Speicher zuweisen, E/A-Vorgänge durchführen, untergeordnete Prozesse erstellen ... all Es handelt sich um eine Kerneloperation. Dies zeigt auch, dass die Systemparameter bei häufigen E/A-Vorgängen sehr hoch sind.
🎜Benutzerbereich (Ring 3): Kann nur auf eingeschränkte Ressourcen zugreifen, kann nicht direkt auf Hardwaregeräte wie Speicher zugreifen und muss über Systemaufrufe in den Kernel gelangen, um auf diese privilegierten Ressourcen zuzugreifen. 🎜🎜🎜🎜🎜🎜 Typisch Zu den User-Space-Programmen gehören: Shells, Datenbanken, Webserver, PHP-Programme, Java-Programme ... 🎜🎜🎜🎜🎜🎜🎜🎜Wenn Sie den oberen Befehl verwenden, um die CPU im Linux-System anzuzeigen, können Sie den Benutzer und das System sehen Elemente, die entsprechen: Es handelt sich um die vom Benutzermodus und Kernelmodus belegten CPU-Ressourcen Wenn die Datei gelesen werden muss, ist ein 🎜Systemaufruf🎜🎜🎜🎜🎜🎜🎜🎜Systemaufruf erforderlich: 🎜🎜
Der Übergang vom Benutzermodus zum Kernelmodus muss durch Systemaufrufe abgeschlossen werden. Wenn Sie beispielsweise eine Datei anzeigen, müssen mehrere Systemaufrufe ausgeführt werden: Öffnen, Lesen, Schreiben, Schließen usw. Der Prozess des Systemaufrufs ist wie folgt:
Speichern Sie den ursprünglichen Benutzermodus-Anweisungsort im CPU-Register.
Um den Kernel-Code auszuführen, muss das CPU-Register aktualisiert werden zum neuen Speicherort der Kernel-Modus-Anweisung und schließlich zum Kernel-Modus wechseln, um Kernel-Aufgaben auszuführen.
Nachdem der Systemaufruf beendet ist, müssen die CPU-Register in den ursprünglich gespeicherten Benutzermodus zurückgesetzt werden Wechseln Sie dann in den Benutzerbereich, um den Prozess fortzusetzen.
Sobald das System aufgerufen wird, sind tatsächlich zwei CPU-Kontextwechsel erforderlich.
Wenn die Prozessausführung beendet wird, wird die zuvor verwendete CPU freigegeben und der nächste Prozess, der auf die Zeitscheibe wartet, wird aus der Bereitschaftswarteschlange entfernt;
Wenn ein Prozess Wenn die Zeitspanne erschöpft ist, wird sie vom System angehalten und wechselt zu anderen Prozessen, die auf die Ausführung durch die CPU warten
Ein bestimmter Prozess wird angehalten, weil er relativ große Systemressourcen benötigt (z. B. nicht genügend Speicher). ) Anhalten, das System plant die Ausführung anderer Prozesse.
Wenn ein Prozess mit höherer Priorität (Systembetriebsprozess) eine Zeitscheibe benötigt, um sicherzustellen, dass der Prozess mit höherer Priorität ausgeführt werden kann , der aktuelle Prozess wird angehalten ;
Wenn im aktuellen Prozess eine Schlaffunktion vorhanden ist, wird diese ebenfalls angehalten;
Für das Betriebssystem sind Threads die kleinste Ausführungseinheit und Prozesse die kleinsten Ressourcenverwaltungseinheiten. Um es ganz klar auszudrücken: Der sogenannte Task-Aufruf im Kernel wird tatsächlich vom Thread geplant und der Prozess stellt dem Thread nur Ressourcen wie virtuellen Speicher und globale Variablen zur Verfügung. Daher können wir es für die Szene und den Prozess so verstehen:
Wenn der Prozess nur einen Thread hat, kann der Prozess als gleich dem Thread betrachtet werden.
Wenn ein Prozess mehrere Threads hat, teilen sich diese Threads die Ressourcen des übergeordneten Prozesses (d. h. sie teilen sich dieselben Ressourcen wie virtuellen Speicher und globale Variablen). Diese Ressourcen müssen während des Kontextwechsels nicht geändert werden.
Darüber hinaus verfügen Threads auch über eigene private Daten wie Stapel und Register, die beim Kontextwechsel ebenfalls gespeichert werden müssen.
Zusammenfassend gibt es zwei Situationen beim Thread-Kontextwechsel:
Die beiden Threads davor und danach gehören zu unterschiedlichen Prozessen, da die Ressourcen nicht gemeinsam genutzt werden Kontextwechsel;
Die beiden Threads davor und danach gehören zum selben Prozess, da der virtuelle Speicher gemeinsam genutzt wird, sodass beim Umschalten die virtuellen Speicherressourcen unverändert bleiben und nur die privaten Daten, Register und andere nicht des Threads -gemeinsame Daten müssen umgestellt werden.
Die Unterbrechungsbehandlung unterbricht die normale Planung und Ausführung des Prozesses. Wenn andere Prozesse unterbrochen werden, muss der aktuelle Status des Prozesses gespeichert werden. Nach Beendigung der Unterbrechung kann der Prozess weiterhin in seinem ursprünglichen Status ausgeführt werden.
Interrupt-Kontextwechsel betrifft nicht den Benutzermodus des Prozesses. Selbst wenn der Interrupt-Prozess einen Prozess im Benutzermodus unterbricht, besteht daher keine Notwendigkeit, Benutzermodusressourcen wie virtuellen Speicher und globale Variablen dieses Prozesses zu speichern und wiederherzustellen. Der Interrupt-Kontext umfasst tatsächlich nur den Status, der für die Ausführung des Kernel-Modus-Interrupt-Dienstprogramms erforderlich ist, einschließlich CPU-Registern, Kernel-Stack, Hardware-Interrupt-Parametern usw.
Zusammenfassung
Laut Tsunas Testbericht benötigt jeder Kontextwechsel mehrere zehn Nanosekunden bis mehrere Mikrosekunden CPU-Zeit, was ziemlich beträchtlich ist.
Egal welches Szenario den Kontextwechsel verursacht, Sie sollten wissen:
Der CPU-Kontextwechsel ist eine der Kernfunktionen, um den normalen Betrieb des Linux-Systems sicherzustellen. Im Allgemeinen müssen wir keine besonderen Kosten zahlen Aufmerksamkeit darauf.
Allerdings verbraucht ein übermäßiger Kontextwechsel CPU-Zeit beim Speichern und Wiederherstellen von Daten wie Registern, Kernel-Stacks und virtuellem Speicher, wodurch sich die tatsächliche Laufzeit des Prozesses verkürzt und die Gesamtleistung erheblich abnimmt das System.
Verwandte Empfehlungen: „Linux-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist Kontext unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!