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