为什么需要操作系统?
说抽象之前得先知道CPU以及键盘、鼠标是之间是工作的。CPU最终状态只能进行加减,当我们输入一个简单的字符“A”的时候键盘与CPU都是把字母“A”转化为能够识别的二进制01才能识别。而这一些对于使用者来说都是透明的,让使用者认为当输入一个字母“A”时就是对字母“A”的一个“投影”显示。但实现这个的一切转化都已经由操作系统帮助我们完成,如果没有操作系统,对于一个字母A的输入,可能就是输入01000001这样的二进制代码。操作系统把设备(CPU,键盘,鼠标等)抽象后以方便我们的操作。
操作系统究竟把设备抽象成什么?
那么操作系统究竟把这些设备抽象成什么,是如何开发者方便开发者的调用?在操作系统中Everything is File,CPU,鼠标等这些都被操作系统抽象(虚拟化?)成为了文件,这样开发者可以通过对这些文件操作来操作设备。下面两幅图前者是Linux(Ubuntu)对于CPU和鼠标抽象之后的结果,后者是Windows7对于硬盘的抽象(虚拟化?)后的截图:
(Linux)
Windows7
开发者在使用这些设备的时候内部发生了什么?
前面提到的OS把一切抽象成为了文件的形式以供开发者(包括用户)来使用,那么在写一个C语言简单的scanf的时候,内部究竟干了什么?如下图:
上图一个程序与设备通信的工程,可以想象我们正在执行一个包含scanf的程序,我们需要通过程序输入一个值得是在内部是程序通过系统调用接口(syscall.h 或man 2 syscall)去操作设备驱动,然后设备驱动选择使用那个设备节点,最后节点与实际的设备相关联。
对于上图的进一步分析:
对于在Linux操作系统中执行ls命令查看当前文件夹内容的抽象:
抽象=虚拟化?
虚拟化和抽象我认为不能混为一谈,抽象是把物理设备编程实实在在的文件形式,但是虚拟化对于一个虚拟化系统是一个并不存在的东西,虽然虚拟化系统会认为自己本身是运行在物理设备之上但这一切都是运行在一个虚拟设备监视器(VMM)的容器之内。如图:
因为每个进程都拥有自己的内存空间,进程间通过pipe进行通信,而虚拟机监视器可以让虚拟机共享一个物理内存空间。换句话说就是:虚拟机监视器对于虚拟机是多对多的关系而对于物理设别的抽象内存是一对一的关系。如果是省略中间的”监视器”,实际上就是虚拟机共享物理内存的一个进程的内存空间(实际是不可能省略中间的监视器,这里只是类比)。监视器模拟虚拟CPU,虚拟CPU的计算通过监视器传递给真实的CPU计算。(下图为VMM模拟)