As I understand it, the root difference is the level of abstraction. From that, a difference in the degree of resource pooling follows. A hypervisor offers very low-level abstractions: one or more virtual CPUs, a fixed amount of RAM, one or more virtual block devices, and one or more virtual network interfaces. An operating system, by contrast, typically offers much higher-level abstractions: one or more processes (each of which may have multiple threads), a pool of memory from which the processes can dynamically allocate what they need, a filesystem, and a network protocol stack. These higher-level abstractions are quite mature, so one argument against unikernels is that it is grossly inefficient for each application to bring its own impoverished versions of them. Instead, if applications can run in secure containers on bare metal, as in FreeBSD jails or Illumos zones, then they can efficiently share resources, particularly RAM and storage, under a single OS kernel.