In this paper, I discuss only the full virtualization, where application and OS of a VM (also known as the guest and the OS as the guest OS) remain unmodified. For example, a VM with Windows as the guest OS can execute a host running Linux OS, QEMU and KVM. The other types of virtualization are para-virtualization and container-based virtualization (though the term virtualization or VM may not be used in the latter case, rather just the container). In the case pf para-virtualization, the guest OS is modified to interface with the underlying host OS/hypervisor, whereas in the case of containers, an application (or a set) is isolated from others via light-weight Linux isolation mechanisms, such as cgroup, namespace, etc. Certain Para-virtualized interfaces or devices can be used in the case of full virtualization, such as the virtio. In this paper, I cover only full virtualization, including full virtualization with hardware-assisted virtualization.
A high-level depiction of full virtualization with Linux/QEMU/KVM and with multi-core/NUMA host is shown below.