Как происходит переключение процессов в ВМ?

1131
Shehbaz Jaffer

Для обычного автономного хоста разные процессы выполняют переключение контекста с помощью планировщика. Например, скажем, есть Процесс 1 и Процесс 2, затем управление переходит от Процесса 1 к Планировщику, а затем от Планировщика к Процессу 2, который затем выполняется, пока не вернет управление Планировщику для планирования другого процесса.

Я хочу знать, как этот переход с процесса 1 на процесс 2 происходит в виртуальной машине? Вызывает ли ВМ VM_EXIT()каждый раз, когда происходит процесс переключения между двумя процессами внутри ВМ? или планировщик хоста как-то связан с переключением процессов?

AFAIK, хост-ОС рассматривает виртуальную машину как единый процесс. Может ли кто-нибудь указать на некоторые подсказки, где я мог бы устранить эти сомнения?

3

2 ответа на вопрос

2
gronostaj

Virtual machines don't understand what's going on inside, they are just simulating hardware.

There are 3 basic methods of VM simulation. The most obvious one is hardware emulation, which is what Bochs does. It's just simulating x86-compatible PC programmatically, without any deeper magic behind it. PC is a machine for processing data, so Bochs just uses host OS to collect input data and feeds it to emulated virtual devices, then reads output data from those devices and uses host to present it. This is exactly what console emulators and similar programs do. Bochs doesn't know what happens inside the VM, it works on bare emulated hardware. The concept of processes is too abstract for it, it doesn't have to care for such things - just hardware emulation.

Second kind of VM is what was common before hardware-accelerated virtualization was introduced. Bochs-style emulation is slow, because it's interpreting machine code byte by byte. Running bare bytecode is impossible in a running OS due to the way CPUs work (and they work like that for a good reason), but an application can take a chunk of bytecode and edit it to make it safe for executing in a host OS, then execute it as its own code. The editing stage serves two purposes: it sanitizes code to make running it possible and connects simulated I/O devices to appropriate data sources/targets of the host. Still, nothing like processes exists for a VM, it's just pseudo-emulating code on a physical CPU, pretending it's the program's code.

Finally, the third kind of VMs is hardware-accelerated virtualized VMs. It requires support in hardware, but all modern CPUs have it. It's just about doing what I said is impossible before: running low-level code in parallel to the host OS. The thing is, if you have it built into the CPU, you can let it handle the code properly. It will create a sandbox environment for that code, giving the host control over that sandbox. This way the VM code is executed even closer to the hardware, thus it works faster. It's also closer to using the hardware ring system, but still doesn't introduce the exact concept of processes. These are always handled by guest OSes. But in the hardware-accelerated VMs you can really see something similar to context switching like on host. Other kinds of VMs always run as user-level programs.

Для QEMU / KVM (третий вид ВМ), если у меня есть два процесса - Firefox и VLC, запущенные в гостевой системе, и происходит переключение контекста с VLC на firefox, как это переключается и переключается между процессом ВМ и другим хостом? процессы на уровне хост-машины взаимосвязаны? Правильно ли говорить, что переключатель VLC-Firefox не зависит от переключателя VM-other_host_process? Так как переключение VLC-Firefox происходит в среде процессора песочницы? Shehbaz Jaffer 10 лет назад 0
Вы правы, они абсолютно независимы. Процессы переключения в виртуальной машине не должны влиять на хост и наоборот (за исключением производительности, конечно - более высокая загрузка процессора в хосте повлияет на производительность гостя) gronostaj 10 лет назад 0
0
David Schwartz

Process switching inside a VM takes place the same way it takes place on a normal machine. The OS simply changes which process it's working on. The host doesn't know or care what's going on inside the VM -- what difference does it make?

Ну, это не имеет значения, если виртуальный процесс 1 вызывает системную функцию; особенно если он блокирующий, например, «пауза» или «чтение». Но что, если процесс 1 просто загружает процессорное время, выполняет много вычислений без ввода-вывода или какого-либо другого внешнего взаимодействия? Как планировщик гостевой ОС (ядро) получает контроль обратно? Использует ли он функцию хост-системы, такую ​​как «тревога», для периодического восстановления контроля? Или виртуализация с аппаратным ускорением позволяет прерываниям синхронизации, возникающим во время работы виртуальной машины, обрабатываться гостевым ядром, а не ядром хоста? Scott 10 лет назад 0
@ Scott Точно так же, как и на обычной машине, с точки зрения гостя. Он запрашивает прерывания часов и, насколько он может судить, он их получает. Хост имитирует эти прерывания часов так же, как он симулирует все остальное, что нужно гостю. David Schwartz 10 лет назад 0

Похожие вопросы