0x01 什么是操作系统?
操作系统是一个软件,一个可以让应用程序运行变得更容易,允许程序共享内存,让程序能够与硬件设备交互,以及其他类似的工作。这种软件被称为操作系统(Operating System, OS)
为了实现上述的功能,操作系统主要利用一种通用的技术:虚拟化(virtualization),将物理资源,如处理器、内存、磁盘转换为更通用、更强大且更易用与使用的虚拟形式。因此,操作系统也被称为虚拟机(virtual machine)。
0x02 什么是虚拟化?
先举个例子:现在有一所房子,两个人(A、B),这两个人都想拥有一所房子
- 你对A说:这个房子属于你,你需要进去的时候,就来找我拿钥匙,用完把钥匙还给我
- 你对B说:这个房子属于你,你需要进去的时候,就来找我拿钥匙,用完把钥匙还给我
- 你负责保管钥匙,并且要让A和B知道这个房子只属于自己,A、B互相不知道对方
- 当A找你拿钥匙时,如果房子空闲,你就把钥匙给他;如果B在房子中,那你就拒绝A,让他等着
- 同样B找你拿钥匙时,也是同理......
在上述例子中,房子只有一所,但是你让A和B都觉得自己拥有了房子,这个过程就类似于虚拟化CPU,而你在中间扮演的角色就是操作系统的角色。
上面的例子是一个时分共享(time sharing)机制的应用,操作系统通过这个机制实现了虚拟化CPU。相对应的还存在空分共享机制,操作系统在虚拟化磁盘和内存的时候使用了此机制。
- 时分共享:允许资源由一个实体使用一小段时间,然后由另一个实体使用一小段时间,如此下去......
- 空分共享:资源在空间上被划分给希望使用它的人,例如,一旦将一块磁盘空间分配给用户,在用户删除文件之前,不可能将它分配给其他文件
0x03 虚拟化CPU
从上述例子中,可以看到,即使只有一个处理器,4个程序似乎是可以同时运行的。操作系统通过时分共享机制,实现了系统拥有非常多CPU的假象。将单个CPU(或其中的一小部分)转化为看似无限数量的CPU,从而让许多程序看似在同时运行,这就是虚拟化CPU。
0x04 虚拟化内存
从这个例子中,可以看到,这两个进程都在相同的地址(00200000)处分配了内存,但每个进程似乎都独立更新了 00200000 处的值,就好像每个正在运行的程序都有自己的私有内存,而不是与其他正在运行的程序共享相同的物理内存。
这是因为操作系统虚拟化内存,每个进程访问自己的私有虚拟地址空间(virtual address space),操作系统以某种方式映射到机器的物理内存上。一个正在运行的程序中的内存引用不会影响其他进程(或操作系统本身)的地址空间。对于正在运行的程序,它看起来完全拥有自己的物理内存。实际上,物理内存是由操作系统管理的共享资源,这就是虚拟化内存。
0x05 持久性
操作系统管理磁盘的软件通常被称为文件系统(file system),它负责以可靠和高效的方式,将用户创建的任何文件存储在系统的磁盘上。不像操作系统为CPU和内存提供的抽象,操作系统不会为每个应用程序创建专用的虚拟磁盘。相反,它假设用户经常需要共享文件中的信息。比如我们编写代码时,需要使用编辑器创建和编辑文件;编写完后需要使用编译器来编译代码,生成可执行文件,最后运行可执行文件。因此文件是可以在不同的进程之间共享的。
而文件的持久化过程中,文件系统会确定新数据将驻留在磁盘上的哪个位置,然后在文件系统所维护的各种结构中对其进行记录,这需要向底层存储设备发出 I/O 请求,以读取现有结构或更新(写入)它们。这个过程,操作系统相当于提供了一些API,屏蔽了让硬件设备执行操作的一些低级别设备接口。所以,OS 有时被视为标准库。