操作系统第一章:概述
操作系统的概念和功能
操作系统(Operating System,OS)是指
- 控制和管理整个计算机系统的硬件和软件资源
- 并合理地组织调度计算机的工作和资源的分配
- 以提供给用户和其他软件方便的接口和环境
- 是计算机系统中最基本的系统软件。
类似于计算机网络,操作系统必须向上层提供方便易用且透明的服务,而上层用户无须理解底层硬件的原理。比如GUI图形界面。
在早期或现代特化操作系统中,只有交互式命令接口,用户通过输入命令与计算机交互,你可以使用Windows的cmd命令行模式体验。这种说一句做一句的模式叫做联机命令接口。

脱机命令接口,就是将所有需要执行的命令写在一个bat文件内,运行该文件会逐行执行内部的命令。用户输入一堆,计算机处理一堆。
程序接口:可以在程序中进行系统调用来使用程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。
比如我们写一个HelloWorld,那就是通过程序代码(C语言)去调用了程序接口使在显示器上显示。
操作系统需要实现对硬件机器的扩展。没有任何软件的计算机叫裸机,安装操作系统后用户能够更方便地使用软件,计算机的功能也就更强大。
操作系统的特征
- 并发
- 共享
- 虚拟
- 异步
并发
并发:指两个或多个事件在同一时间间隔内发生。
这些事件宏观上是同时发生的,但微观上是交替发生的。单核CPU在不同任务中快速切换。
并行:两个或者多个事件在同一时刻**同时发生。多核CPU同时处理多个任务。
操作系统的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
CPU的核心数很难超过实际中的进程数量,所以为了保证宏观上的同时发生,并发是很重要的
共享
- 互斥共享方式
系统中的某些资源,称为临界资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。比如摄像头在同一时间内只能分配给一个进程。
- 同时共享方式
系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。比如两个通信进程传输两个不同的文件,宏观上看好像他们都在使用硬盘,微观上看,两个进程是交替访问硬盘的。
共享性和并发性是唇亡齿寒的关系,是互为存在条件。缺失任何一方,另一方也没有意义。
虚拟
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。
物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
能够使得实际上很小的内存在宏观上看起来很大。
分为虚拟存储器技术和空分复用技术。
在第三章会统一讲解。
如果没有并发性,那虚拟性没有意义。
异步
异步是指在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
只有并发性,才有可能导致异步性。
所以并发和共享是操作系统最基本的两个特征。
操作系统的运行机制
高级语言编译成机器指令,CPU识别并执行机器指令。
注意:这里的指令是0-1机器码,不是操作系统的交互式命令。
普通程序员写的是应用程序,是运行在操作系统之上的。
但是操作系统程序员写的是内核程序,运行在操作系统内核,又名**内核(Kernel)**。
内核是操作系统中最核心的部分,在大部分情况下,一个操作系统中只要有内核就够了。
内核程序具有更高的运行权限,能够执行可能干扰正常运行的特权指令,腾讯ACE反作弊系统就是内核级别程序,能够有效监管应用层的作弊软件。
CPU不具有识别指令类型的功能,所以CPU有两种状态,一个是内核态(管态)和用户态(目态),由内部的一个寄存器来标识状态。
在启动相关程序之前,CPU会转变为对应类型,如果程序出现跨权限执行特权指令,CPU会发现“用户态”和指令的不一致并引发中断信号,CPU切换为内核态关闭当前应用程序。
中断和异常
中断:CPU停止执行下一条指令,去执行其他操作。
中断是实现并发的关键,没有中断就没有并发。
中断能够实现用户态和内核态的过渡。
中断分为
- 内中断(异常,例外)
- 与当前执行指令有关,中断信号来自CPU内部
- 外中断(又名中断)
- 与当前执行指令无关,中断信号来自CPU外部
内中断就是上面举过的例子,越权执行指令,除数为零等操作。
有时候应用程序请求操作系统内核服务,就会执行陷入指令,陷入指令在用户态执行,它的出现意味着应用程序将控制权交给内核,这同样会导致中断,但不是特权指令。
而外中断就是来自于外部的CLK时钟信号等。如果CPU接到来自外部的时钟中断信号,就会自行中断,去执行处理时钟中断的内核程序。

外中断还可以来自打印机打印完毕,U盘接口松动等IO中断请求。
系统调用
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。

| 普通应用程序 | 可直接进行系统调用,也可使用库函数。 有的库函数涉及系统调用,有的不涉及 |
|---|---|
| 编程语言 | 向上提供库函数。有时会将系统调用封装 成库函数,以隐藏系统调用的一些细节, 使程序员编程更加方便。 |
| 操作系统 | 向上提供系统调用,使得上层程序能请求 内核的服务 |
| 裸机 | 提供硬件支持 |
不涉及系统调用的库函数:如的“取绝对值”的函数
涉及系统调用的库函数:如“创建一个新文件”的函数
系统调用是必须的,用户只能通过系统调用来使用共享资源,由操作系统来统一调度和分配,保证系统的稳定性和安全性。
应用程序一般会执行数个传参指令,用于确认系统调用的类型,随后执行陷入指令,CPU开始执行对应的系统调用入口程序,开始判断程序需要哪些内核服务,随后执行所需的内核服务


操作系统体系结构

操作系统内部能够细分,分为内核功能和非内核功能,内核功能最重要,而乌班图等操作系统开发者往往实现非内核功能。
原语是原子程序,执行必须一步到位,不能被中断。

内核同样可以再分,分为大内核和微内核。
微内核只保留与硬件关系最紧密的部分,这会对性能造成影响。

所以大内核有更高的性能。
但是微内核将大部分操作隔绝在用户态,更安全,且体积小,维护轻松。
Linux, Unix, Windows内核都是大内核。
操作系统也具有分层结构,每一层能够调用更低一层提供的接口,而本层必须向更高一层提供接口和服务。

这样的分层结构便于验证和扩展,但是每层只能调用相邻层的接口,不能跨层调用这意味着0和2层不能直接通信,所以效率偏低。
操作系统有模块化的特点,内核由主模块和可加载内核模块组成,主模块是管理进程和内存的核心,可加载内核模块是锦上添花的部分。
模块化便于维护,且模块之间能够直接调用,效率高,但是因为模块之间的相互依赖,调试上可能出现困难。大内核采用了模块化设计,上图中的进程管理和存储管理就是不同的模块,之间能够相互调用。
操作系统还有一个组件叫做外核。内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全。内核为了统一管理和简化使用会采取抽象的方式,将硬盘上的离散空间抽象成连续空间。但外核则强调减少抽象,赋予程序更大的控制权和灵活性。
举个例子,虚拟硬件资源是映射的结果,提供给应用程序的“连续”的地址可能不是在物理意义上连续的,如果某个应用程序知道自己的某一部分数据将在未来被高频访问,那么就能够向外核申请一片连续的硬盘空间存放数据以显著提升缓存命中率。
外核降低了系统的一致性,且会使得系统变得更复杂。
操作系统的引导
Boot,英文语义为靴子,鞋带,鞋带是便于穿靴子的工具。
所以Boot是计算机操作系统的引导程序,也就是运行操作系统的工具。
我们每个人都应该有能力将一个裸机安装操作系统。

操作系统引导:
- CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
- 将磁盘的第一块——主引导记录 读入内存,执行磁盘引导程序,扫描分区表
- 从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
- 从根目录下找到完整的操作系统初始化程序(即 启动管理器)并执行,完成“开机”的一系列动作
操作系统的虚拟机
传统计算机中,一个物理机器上只能运行一个操作系统,操作系统中有很多进程。但是因为只能运行一个操作系统,存在利用效率低下的问题和争抢资源的问题。
在这个问题上,虚拟机应运而生。
虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(Virtual Machine,VM),每个虚拟机器都可以独立运行一个操作系统。
同义术语:虚拟机管理程序/虚拟机监控程序Virtual Machine Monitor/Hypervisor
虚拟机的实现原理有两类,分别是直接运行在硬件上和运行在宿主操作系统上。

第一类
第一类直接运行在硬件上,由运行在内核层的第一类虚拟机管理程序管理和分配。虚拟机管理程序会将总的硬件资源通过虚拟化划分为多个部分,这可以通过将CPU划分为不同的时间片再分配给虚拟机来做到。
这就有一个问题,运行在操作系统中的应用程序(全程处于用户态)会执行特权指令,这时第一类虚拟机管理程序会将提交的特权指令请求做等价交换来执行。
注意,双系统不属于第一类,第一类虚拟机管理程序是一个极简的操作系统。
第二类
第二类运行在一个宿主操作系统Host OS上,并通过VMware,VirtualBox等虚拟机管理软件在宿主上安装并运行客户操作系统(Guest OS)。在软件中你能够自主分配给机器的运存和硬盘空间。
| 虚拟机种类 | ||
|---|---|---|
| 第一类VMM | 第二类VMM | |
| 对物理资源的控制权 | 直接运行在硬件之上,能直接控制和分配物理资 源 | 运行在Host OS之上,依赖于Host OS为其分配物 理资源 |
| 资源分配方式 | 在安装Guest OS时,VMM要在原本的硬盘上自 行分配存储空间,类似于”外核”的分配方式,分 配未经抽象的物理硬件 | GuestOS 拥有自己的虚拟磁盘,该盘实际上是 Host OS 文件系统中的一个大文件。GuestOS分 配到的内存是虚拟内存 |
| 性能 | 性能更好 | 性能更差,需要HostOS作为”中介” |
| 可支持的虚拟机数量 | 更多,不需要和 Host OS 竞争资源,相同的硬件 资源可以支持更多的虚拟机 | 更少,Host OS 本身需要使用物理资源,Host OS上运行的其他进程也需要物理资源 |
| 虚拟机的可迁移性 | 更差 | 更好,只需导出虚拟机镜像文件即可迁移到另一 台HostOS 上,商业化应用更广泛 |
| 运行模式 | 第一类VMM运行在最高特权级(Ring 0),可以 执行最高特权的指令。 | 第二类VMM部分运行在用户态、部分运行在内核 态。GuestOS 发出的系统调用会被 VMM 截获, 并转化为VMM 对HostOS 的系统调用 |
后来的CPU将特权指令划分为更细致的特权级别,绝大多数现代 CPU(尤其是 x86 架构)采用的是 4 个特权级:Ring 0、Ring 1、Ring 2 和 Ring 3,这么做能够提升系统运行效率。