Wie erfolgt der Prozesswechsel in der VM?

1252
Shehbaz Jaffer

Bei einem normalen Standalone-Host wechseln verschiedene Prozesse den Kontext mithilfe des Schedulers. Angenommen, es gibt Prozess 1 und Prozess 2, dann geht die Steuerung von Prozess 1 zum Scheduler und dann vom Scheduler zum Prozess 2, der dann ausgeführt wird, bis er dem Scheduler die Kontrolle zum Planen eines anderen Prozesses zurückgibt.

Ich möchte wissen, wie dieser Wechsel von Prozess 1 zu Prozess 2 in einer VM erfolgt? Ruft die VM VM_EXIT()jedes Mal auf, wenn ein Prozess zwischen zwei Prozessen innerhalb einer VM wechselt? oder hat der Host-Scheduler etwas mit dem Prozesswechsel zu tun?

AFAIK, das Host-Betriebssystem betrachtet die VM als einen einzigen Prozess. Könnte jemand bitte einige Hinweise nennen, wo ich diese Zweifel klären könnte?

3

2 Antworten auf die Frage

2
gronostaj

Virtuelle Maschinen verstehen nicht, was in ihnen vorgeht, sie simulieren lediglich Hardware.

Es gibt drei grundlegende Methoden der VM-Simulation. Das offensichtlichste ist die Hardware-Emulation, die Bochs macht. Es simuliert lediglich einen x86-kompatiblen PC programmgesteuert, ohne dass ein tieferer Zauber dahintersteckt. PC ist eine Maschine zur Verarbeitung von Daten. Daher verwendet Bochs nur Host-OS, um Eingabedaten zu sammeln und an emulierte virtuelle Geräte weiterzuleiten, dann die Ausgabedaten von diesen Geräten zu lesen und Host zu verwenden, um sie zu präsentieren. Genau das machen Konsolenemulatoren und ähnliche Programme. Bochs weiß nicht, was in der VM passiert, es arbeitet mit reiner emulierter Hardware. Das Konzept der Prozesse ist zu abstrakt, es muss sich nicht um solche Dinge kümmern - nur um die Hardware-Emulation.

Die zweite Art von VM ist vor der Einführung der hardwarebeschleunigten Virtualisierung gebräuchlich. Die Bochumer Emulation ist langsam, weil sie Maschinencode Byte für Byte interpretiert. Das Ausführen von bloßem Bytecode ist in einem laufenden Betriebssystem aufgrund der Funktionsweise von CPUs nicht möglich (und dies funktioniert aus gutem Grund), aber eine Anwendung kann einen Teil des Bytecodes verwenden und bearbeiten, um sie für die Ausführung in einem Hostbetriebssystem sicherer zu machen. dann führen Sie es als eigenen Code aus. Die Bearbeitungsphase dient zwei Zwecken: Sie reinigt Code, um die Ausführung zu ermöglichen, und verbindet simulierte E / A-Geräte mit entsprechenden Datenquellen / Zielen des Hosts. Für eine VM gibt es immer noch keine Prozesse, es ist nur Pseudo-Emulation von Code auf einer physischen CPU, der vorgibt, es sei der Code des Programms.

Die dritte Art von VMs sind schließlich hardwarebeschleunigte, virtualisierte VMs. Es erfordert Unterstützung in Hardware, aber alle modernen CPUs haben es. Es geht nur darum, das zu tun, was ich zuvor gesagt habe, ist unmöglich: parallelen Betrieb von Low-Level-Code zum Host-Betriebssystem. Die Sache ist, wenn Sie es in die CPU eingebaut haben, können Sie es den Code richtig behandeln lassen. Es wird eine Sandbox-Umgebung für diesen Code erstellt, die dem Host die Kontrolle über diese Sandbox gibt. Auf diese Weise wird der VM-Code noch näher an der Hardware ausgeführt und arbeitet somit schneller. Es ist auch näher an der Verwendung des Hardware-Ringsystems, führt jedoch noch nicht das genaue Konzept der Prozesse ein. Diese werden immer von Gastbetriebssystemen gehandhabt. In den hardwarebeschleunigten VMs können Sie jedoch ein ähnliches Kontextwechseln wie auf einem Host sehen. Andere Arten von VMs werden immer als Programme auf Benutzerebene ausgeführt.

Wenn für QEMU / KVM (dritte Art von VM) zwei Prozesse ausgeführt werden: Firefox und VLC, die in Guest ausgeführt werden und ein Kontextwechsel von VLC zu Firefox erfolgt, wie wechselt dieser und der Wechsel zwischen dem VM-Prozess und anderen Hosts Prozesse auf Host Machine-Ebene miteinander in Beziehung setzen? Ist es richtig zu sagen, dass der VLC-Firefox-Switch unabhängig vom VM-other_host_process-Switch ist? Da der VLC-Firefox-Switch in einer Sandbox-CPU-Umgebung stattfindet? Shehbaz Jaffer vor 10 Jahren 0
Sie haben recht, diese sind völlig unabhängig. Das Wechseln von Prozessen in einer VM sollte sich nicht auf den Host und umgekehrt auswirken (abgesehen von der Leistung natürlich - höhere CPU-Last im Host wirkt sich auf die Leistung des Gasts aus). gronostaj vor 10 Jahren 0
0
David Schwartz

Die Prozessumschaltung innerhalb einer VM erfolgt auf dieselbe Weise wie auf einer normalen Maschine. Das Betriebssystem ändert einfach, an welchem ​​Prozess es gerade arbeitet. Der Host weiß oder kümmert sich nicht darum, was in der VM abläuft. Welchen Unterschied macht das?

Nun, es macht keinen Unterschied, ob der virtuelle Prozess 1 eine Systemfunktion aufruft. vor allem, wenn es eine blockierende ist, wie "Pause" oder "Lesen". Was aber, wenn Prozess 1 nur die CPU-Zeit hochläuft und viele Berechnungen ohne I / O oder andere externe Interaktionen durchführt? Wie erhält der Gastbetriebssystem-Scheduler (Kernel) die Kontrolle zurück? Verwendet es eine Host-Systemfunktion wie "Alarm", um die Kontrolle periodisch wiederzuerlangen? Oder ermöglicht die hardwarebeschleunigte Virtualisierung, dass Taktgeberinterrupts, die während der Ausführung der VM auftreten, vom Gastkernel und nicht vom Hostkernel verarbeitet werden? Scott vor 10 Jahren 0
@Scott Auf dieselbe Weise wie auf einem normalen Rechner aus Sicht des Gastes. Es fordert Uhr-Interrupts an und holt sie, soweit dies erkennbar ist. Der Host simuliert diese Uhr-Interrupts auf dieselbe Weise wie alles andere, was der Gast benötigt. David Schwartz vor 10 Jahren 0