如何开启cpu虚拟化?操作系统如何实现 CPU 的虚拟化

假设一个计算机只有一个 CPU(现代计算机有更多),但是同时有多个进程,虚拟化要做的就是将这个 CPU 虚拟成多个 CPU 并分给每一个进程使用,这样在每一个进程看来,他们都是在独自占用 CPU,事实上只有一个 CPU 。
首先我们说一下时分共享(time )CPU 技术,通过允许资源由一个实体使用一小段时间,然后由另一个实体使用一小段时间,如此下去 。在这里,资源可以是 CPU,网络链接等 。有时间当然就有空间,所以也就有空分共享,相信大家这时也可以理解这个概念了,例如磁盘,一旦将块分配给文件,在文件删除之前,不可能将它再分配给别人 。
对于实现时分共享有很多的挑战,第一个就是性能(性能这个问题在任何时候都是非常重要的):如何在不增加系统开销的情况下实现虚拟化 。另外一个问题就是控制权:在运行程序时,要保留对 CUP 的使用权 。操作系统需要掌控对 CPU 的控制,及时在运行程序时,不能让程序肆无忌惮的使用 CPU,或者随意的访问没有权限的文件 。综上两点,在保持控制权的同时获得高性能,这是最大的挑战 。
接下来我们主要说一下“受限直接执行”这个机制 。说白了,就是虽然程序直接运行在 CPU 上,但是是受限制的 。这里我们不得不提一种处理器模式:“用户模式”与“内核模式”,在用户模式下运行的代码会受到限制,例如不能在用户模式下发出 I/O 请求 。内核模式相当于非常大的权限,运行的代码可以做他想做的任何事,操作系统(或内核)就是在次模式下运行 。所以我们的程序都是在用户模式下运行,当程序有 I/O 请求时,是如何解决的呢?
为了实现这一点,现在的硬件都提供了用户程序执行系统调用的能力 。允许内核小心的向用户程序暴露某些关键功能,例如访问文件、创建进程等 。当执行系统调用时,程序必须执行特殊的陷阱(trap)指令 。执行这个指令同时进入内核模式,再执行特权操作 。完成后,操作系统调用一个特殊的从陷阱返回的指令,再返回到用户模式 。
接下来我们再看一个问题,就是操作系统如何进行进程切换的 。这个问题看起来非常的简单,就是操作系统在不同的进程直接切换,但是实际上要非常棘手 。最重要的就是进程的调度算法,这篇文章中不讲进程调度算法,我们会在下一篇文章中主要讲 。
这里我们先看几个个图,简单说明如何进行进程调度的:

如何开启cpu虚拟化?操作系统如何实现 CPU 的虚拟化

文章插图
参考书籍:操作系统导论
这个图说的是操作系统启动时,操作系统与硬件是如何处理中断时钟的 。下面我们看一个进程切换的图:
如何开启cpu虚拟化?操作系统如何实现 CPU 的虚拟化

文章插图
正如图那样,在两个进程间的切换就是如此简单:进程 A 正在运行,然后被中断时钟打断 。硬件保存寄存器并进入内核 。在时钟中断处理程序中,操作系统决定从在运行的 A 进程切换到 B 进程 。同时恢复寄存器进程 B,?然后切换上下文 。具体来说就是通过改变栈指针来使用 B 的内核栈? 。最后操作系统从陷阱返回,恢复 B 的寄存器并?运行 。
【如何开启cpu虚拟化?操作系统如何实现 CPU 的虚拟化】郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢 。