容器与虚拟机本质区别及虚拟化技术分级

1.虚拟化技术层级分类

1.1硬件级虚拟化

在这一级别中,常见的就是虚拟内存,和虚拟机VMM(Hypervisor)。

虚拟内存:在操作系统的请求分页机制,和硬件MMU基础之上构建出虚拟内存,为每一个进程虚拟出相同大小的虚拟内存空间,让每一个进程都误以为自己拥有整片RAM内存空间。

虚拟机:用软件虚拟出CPU,RAM,I/O设备等,并在这之上安装操作系统。

Q:为什么需要Hypervisor?
A:本质上是因为虚拟机中的操作系统(GuestOS)并不具备使用ISA中特权指令的能力,但是安装在GuestOS上的应用在陷入到内核态(GuestOS的内核态)时,需要调用到HostOS才能使用的特权指令去完成诸如读写I/O设备,切换进程等。因此一旦发生这种情况时,需要Hypervisor来截断这条指令,并由Hypervisor陷入内核态请求HostOS提供服务,服务完成后,再告知GuestOS执行结果。

Q:虚拟机内存如何虚拟化?
A:因为给GuestOS虚拟出来了一个虚假的RAM,和虚假的MMU,但实际存储内容的地方只有宿主机上真实的物理内存。运行在GuestOS上的进程,使用GuestOS的虚拟访存地址去访问虚拟RAM,在这个过程中,GuestOS的VA(visual address)会被虚拟MMU转换为物理机的VA,然后再由物理MMU转换为实际物理地址(PA)最后访存。

当运行在GuestOS上的进程请求一片连续的内存地址时,因为这是一个特权指令,因此将会被Hypervisor截获,然后由Hypervisor代替GuestOS去申请实际的物理地址。申请到的实际物理地址,首先会被HostOS映射成虚拟地址返回给Hypervisor,然后Hypervisor再将该虚拟地址交付给GuestOS。由于在GuestOS眼中,这段虚拟地址被认为物理地址,因此GuestOS还要将该地址再次映射为GuestOS中的虚拟地址,最后交付给GuestOS中的进程。

1.2操作系统级虚拟化

在这一级别中,常见的就是容器。通过系统内核向上提供多个相互隔离的用户态,使得每一个容器都认为自己独占整个操作系统,因为各个共享之间共享操作系统所提供的服务,没有安装GuestOS因此效率远高于虚拟机。

Q:如何实现多用户态?
A:don’t know

Q:容器中的进程如何使用特权指令?
A:当HostOS被多个容器共享时,(推测)containerD(容器的supervisor)应采用某种策略,依次让容器享用HostOS所提供的服务。

Q:容器中进程如何访存?
A:因容器只是多用户态,并没有像虚拟机一样虚拟出MMU。因此容器中的进程访存同单用户态下的情况一样。Cpu送出VA至物理MMU,后物理MMU翻译成PA访问物理内存。

1.3库函数层上虚拟化

具体原理就是适配器模式,例如使用linuk模拟出windos的库函数接口,这就使得win程序可以不加修改的就能够运行在Linux系统上。

1.4编程语言上虚拟化

JVM虚拟机是OS中的一个进程,这个进程的输入数据是java指令,这个进程的作用是将java指令翻译成为当前cpu的指令,并送至cpu运行。

2.docker与容器

容器最初由LXC(Linux Container)提供,docker最初的实现是借助LXC所实现,后docker公司自主研发Libcontanier代替LXC。docker类似于虚拟机中的Hypervisor,它集中管理容器的创建,执行,销毁等生命周期,并控制容器与容器之间如何合理的共享OS提供的内核服务。docker可以被认作为一个框架,这个框架自底向上,提供了一系列方便快捷管理和操作容器的方法。

你可能感兴趣的:(容器与虚拟机本质区别及虚拟化技术分级)