OS第一章 操作系统概述
1.1.1 操作系统的概念和功能
OS的概念
- 一台电脑的诞生过程:
- 厂家组装一台裸机(纯硬件),包含CPU、内存、硬盘、主板等
- 出售前安装OS
- 用户安装应用程序(QQ、微信)
- 用户使用应用程序
由图可知,用户和应用程序操作系统都有一些相连的部分。- 操作系统的定义:
操作系统(OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。
由定义可知:
- OS是系统资源的管理者
- OS向上层提供方便易用的服务
- OS是最接近硬件的软件
- 直观的例子:
打开Windows OS的“任务管理器”
任务管理器左侧列表是OS对软件的管理,右侧CPU、内存等信息是OS对软件的监控。
OS的功能和目标
作为系统资源的管理者
- 举个例子:
用QQ和朋友视频聊天的过程:
- 在各个文件夹中找到QQ安装的位置
注:逐层打开文件夹,找到QQ.exe这个程序(可执行文件)的存放位置,这属于OS的文件管理功能。 - 双击打开QQ.exe
注:执行一个程序前需要将该程序放到内存中,才能被CPU处理。双击打开QQ.exe的过程中,OS会把QQ.exe的程序放到主存里。这个是OS的存储器管理功能。 - QQ程序正常运行
注:QQ程序的正常运行需要对应的进程被处理机(CPU)处理,什么时候给进程分配CPU资源属于OS的工作范畴。这个是OS的处理机管理功能。 - 开始和朋友视频聊天
注:视频聊天的过程需要用到摄像头、麦克风等资源,这些设备需要OS分配给对应进程,这属于OS的设备管理功能。
向上层提供方便易用的服务
- 硬件只能听得懂二进制指令,对外暴露了“丑陋”的,不友好的交互接口。
在硬件之上安装OS,对外暴露了“美丽”、友好的交互接口。
这属于封装思想:OS把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对OS发出命令即可。 - OS对上层提供的服务:
在这些服务中,GUI和命令接口是用户可以直接调用的接口,程序接口是用户不能直接调用的接口。所以OS根用户和程序都有交互。
在有些教材中会把命令接口和程序接口统称为用户接口。- GUI:图形化用户接口(Grapgical User Interface)。用户可以使用形象的图形界面。
- 命令接口:早期OS没有图形化操作界面,需要用命令接口来控制计算机。命令接口分为两类:联机命令接口和脱机命令接口。
- 联机命令接口:联机命令接口 = 交互式命令接口,即用户说一句,系统跟着做一句。
- 脱机命令接口:脱机命令接口 = 批处理命令接口,通过文件的形式一次可以提出一堆命令,OS跟着做一堆的请求。
- 程序接口:可以在程序中进行系统调用来使用的程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。这一部分参考MIPS中的syscall。系统调用类似于函数调用,是应用进程请求OS服务的唯一方式。
作为最接近硬件的层次
需要实现对硬件机器的扩展
没有任何软件支持的计算机称为裸机。在裸机上安装的OS可以提供资源管理功能和方便用户的服务功能,将裸机改造乘功能更强、使用更方便的机器。
通常把覆盖了软件的机器称为扩充机器,又称为虚拟机。
1.1.2 OS的特征
并发
- 定义:并发指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
常考易混概念:并行:指两个或多个事件在同一时刻同时发生。 - OS的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行的,而微观上看是交替运行的。
OS就是伴随着“多道程序技术”而出现的。因此,OS和程序并发是一起诞生的。 - 重点:
单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行。
多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行,例如4核CPU,可以并行执行4个程序,但超过4个的程序需要“同时”进行,则并发性依然必不可少。
因此,并发性是OS的一个最基本的特征。
共享
- 共享:即资源共享,是指系统中的资源可供内存中多个并发执行的程序共同使用。
- 资源共享有两种方式:
- 互斥共享方式: 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
示例:QQ和微信视频,同一时间内摄像头只能分配给其中一个进程。 - 同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。
所谓“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
示例:使用QQ发送文件A,同时使用微信发送文件B。宏观上看,两边都在同时读取并发送文件,说明两个进程都在访问硬盘资源,从中读取数据。微观上看,两个进程是交替着访问硬盘的。
同时共享也有可能微观上是同时共享,如打游戏时听音乐,扬声器同时播放音乐和游戏音效,此时微观上两个进程也在同时使用扬声器。
- 互斥共享方式: 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
- 并发和共享的关系:
并发性指计算机系统中同时存在着多个运行着的程序。
共享性指系统中的资源可供内存中多个并发执行的进程共同使用。
并发性和共享性互为存在条件。
例:通过QQ发送文件A, 同时使用微信发送文件B。
- 两个进程正在并发执行(并发性)
如果失去并发性,则系统中只有一个程序正在运行,则共享性失去存在意义。 - 需要共享地访问硬盘资源(共享性)
如果失去共享性,则QQ和微信不能同时访问硬盘资源,就无法实现同时发送文件,也就无法并发。
虚拟
- 虚拟是指把一个物理上的实体变成若干个逻辑上的对应物。物理实体是实际存在的,而逻辑上的对应物是用户感受到的。
- 例:(背景知识:一个程序需要放入内存并给它分配CPU才能执行。)
一个游戏需要4GB的内存,此时计算机的内存只有4GB,但是计算机却可以同时运行这个游戏、微信、迅雷等多个程序。这就是虚拟存储器技术,实际只有4GB内存,但用户看起来内存似乎远大于4GB。这使用了虚拟技术中的“空分复用技术” - 例:一个单核CPU同时打开6个程序,用户视角这6个程序是同时进行的,这是时分复用技术。
- 虚拟技术分为两类:时分复用(虚拟处理器)和空分复用(虚拟存储器技术)
- 如果失去了并发性,一个时间段内系统中只需运行一道程序,那么就是去了实现虚拟性的意义了。因此,没有并发性就谈不上虚拟性。
异步
- 异步:指在多道程序环境下,允许多个程序并发执行。但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
- 如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
1.2 OS的发展和分类
手工操作阶段
- 程序员在纸带上用打孔的方式写程序,之后传给计算机计算,计算结束后把结果输出到纸带上由程序员翻译出来。
- 主要缺点:用户独占全机、人机速度矛盾导致资源利用率极低。
批处理阶段
单道批处理系统
- 引入脱机输入/输出技术(用外围机+磁带完成,并由监督程序负责控制作业的输入、输出。)
- 程序员把自己的纸带放到外围机里,外围机把程序提前存到磁带里,计算机可以直接从磁带里读取程序,磁带的读写速度比纸带机快很多。
- 此时的计算机中运行一个叫监督程序的程序(OS的雏形),负责控制作业的输入输出。
- 主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
- 主要缺点:内存中仅能有一道程序运行,只有该程序运行结束后才能调入下一道程序。CPU有大量的时间是在空闲等待IO完成。资源利用率依然很低。
多道批处理系统
- 每次往内存中读入多道程序,OS正式诞生,用于支持多道程序并发运行。
作业的各阶段运行时间如图所示:
- 主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源能保持“忙碌”状态,系统吞吐率增大。
- 主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行,无法调试程序,无法在程序运行过程中输入一些参数)
分时OS
- 计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
- 主要优点:用户请求可以被及时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
- 主要缺点:不能优先处理一些紧急任务。OS对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性。
实时OS
- 主要优点:能够优先响应一些紧急任务,某些紧急任务不需要时间片排队。
- 在实时OS的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时OS的主要特点是及时性和可靠性。
- 实时OS分为硬实时系统和软实时系统。硬实时OS必须在绝对严格的规定时间内完成处理(如导弹控制系统、自动驾驶系统);软实时OS能接受偶尔违反时间规定(如12306火车订票系统)
1.3 OS的运行机制
- 预备知识:
普通程序员写的程序就是“应用程序”
微软、苹果负责实现OS的程序员写的是“内核程序”,由很多内核程序组成了“OS内核”,或简称内核(Kernel)。甚至可以说OS最核心的部分,也就是最接近硬件的部分。甚至可以说,一个OS只要有内核就够了(OS的功能未必都在内核中,如GUI不在,但是大部分功能都在)。
特权指令和非特权指令
- OS内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许“管理者”——即OS内核来使用。应用程序只能使用“非特权指令”, 如加法指令、减法指令等。
在CPU设计和生产时就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出其指令类型。
内核态和用户态
- CPU能判断出指令类型,但是它怎样区分此时正在运行的是内核程序还是应用程序呢?
CPU有两种状态,“内核态”和“用户态”。
CPU处于内核态时,运行的是内核程序,此时可以执行特权指令。
CPU处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。 - 拓展:CPU中有一个寄存器叫程序状态字寄存器PSW,其中有个二进制位,1表示“内核态”,0表示“用户态”。
别名:内核态 = 核心态 = 管态
用户态 = 目态 - 内核态和用户态的切换:
- 刚开机时,CPU为“内核态”,OS内核程序上CPU运行。
- 开机完成后,用户可以启动某个程序
- OS内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行。OS内核在让出CPU之前,会用一条特权指令把PSW的标志位设置为“用户态”
- 应用程序运行在用户态
- 若此时,有黑客在应用程序中植入了一条特权指令,企图破坏系统。
- CPU发现接下来要执行的指令是特权指令,但是自己处于用户态。
- 这个非法事件会引发一个中断信号。CPU检测到中断信号后,会立即变为核心态,并停止运行当前的应用程序,转而运行出来中断信号的内核程序。
- “中断”使OS再次夺回CPU的控制权。
- OS会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序。
中断和异常
中断的作用
- CPU上会运行两种程序,一种是OS内核程序,一种是应用程序。
在合适的情况下,OS内核会把CPU的使用权主动让给应用程序
“中断”是让OS内核夺回CPU使用权的唯一途径。
如果没有中断,CPU一旦开始运行一个应用程序之后就会一直运行,也就不会有OS的并发性。
中断的类型
中断分为内中断和外中断
内中断
- 定义:与当前执行的指令有关,中断信号来源于CPU内部
- 内中断也称异常、例外,包括陷阱、陷入(由陷入指令引发,是应用程序故意引发的)、故障(由错误引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让他继续执行下去。如缺页故障)、终止(由致命错误引起的,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如整数除以0,非法使用特权指令等)等。
- 例子1:正在执行的应用程序被黑客植入了一条特权指令,用户态的CPU执行到这条特权指令时会产生一个内中断,OS内核拒绝执行这条指令并夺回CPU控制权。
- 例子2:当一个应用程序执行过程中有一个数除以0的操作也会产生内中断。
- 例子3:有时候应用程序想请求OS内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内中断信号。系统调用就是通过陷入指令完成的。
外中断
- 定义:与当前执行的指令无关,中断信号来源于CPU外部。
- 外中断也称中断。包括时钟中断、IO中断请求等。
- 例1:时钟中断——由时钟部件发来的中断信号(时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号)。
例如应用程序1执行了50ms后时钟部件发出了一个中断指令,CPU转为内核态,并执行处理时钟中断的内核程序。这个程序的作用是OS内核决定让另一个应用程序上CPU运行。这段内核程序运行之后应用程序2上CPU运行。 - 例2:IO中断——由输入输出设备发来的中断信号。
中断机制的基本原理
CPU先检查中断信号(内中断信号:CPU在执行指令时会检查是否有异常发生;外中断信号:每个指令周期末位,CPU都会检查是否有外中断信号需要处理),之后找到相应的中断处理程序。
不同的中断信号,需要不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断信号表”,以此来找到相应的中断处理程序在内存中的存放位置。
系统调用
- 什么是系统调用?有何作用?
“系统调用”是OS提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。 - 系统调用和库函数的区别:
其中OS给库函数的接口是系统调用,编程语言给应用程序的接口是各种库函数。但并不是所有库函数都有系统调用。- 普通应用程序: 可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及
- 编程语言:向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员编程更加方便。
- OS:向上提供系统调用,使得上层程序能请求内核的服务。
- 裸机
- 为什么系统调用是必须的?
假设去打印论文,用WPS打印的过程中另一个同学用WORD开始打印。如果两个进程可以随意地、并发地共享打印机资源,就会出现两篇论文交替打印的情况。
解决方法:由OS内核对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用向OS内核发出请求。内核会对各个请求进行协调处理。 - 什么功能要用系统调用?
凡是与共享资源有关的操作(如存储分配、IO操作、文件管理等),都必须通过系统调用的方式向OS内核提出服务请求,由OS内核代为完成。这样可保证系统的稳定性和安全性,防止用户进行非法操作。 - 系统调用按功能分类:
功能 | 注释 |
---|---|
设备管理 | 完成设备的请求/释放/启动等功能 |
文件管理 | 完成文件的读/写/创建/删除等功能 |
进程控制 | 完成进程的创建/撤销/阻塞/唤醒等功能 |
进程通信 | 完成进程之间的消息传递/信号传递等功能 |
内存管理 | 完成内存的分配/回收等功能 |
- 系统调用的过程:
应用程序在用户态时需要进行系统调用,调用过程如下:
- 给特定寄存器传参数:指明系统调用的类型和系统调用需要的参数:
- 执行陷入指令:该指令会产生内中断信号,OS发现该中断由陷入指令引发,CPU进入核心态。因此转入相应的中断处理程序——即系统调用的入口程序。
注:陷入指令是在用户态下执行的,不属于特权指令。
发出系统调用请求是在用户态,而对系统调用的相应处理是在核心态。
陷入指令也叫trap指令或访管指令。 - 系统调用入口程序会根据寄存器中断参数判断用户需要哪种系统调用服务。
- 执行对应的系统调用程序,CPU转为用户态,接着执行原来的应用程序。
1.4 OS的体系结构
OS内部功能可以划分为内核和非内核。OS最核心的功能需要放到内核中,主要包括时钟管理(利用时钟中断实现计时的功能)、中断处理、原语(设备驱动、CPU切换等,原因是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被中断)、进程管理、存储器管理、设备管理等功能。非内核功能例如GUI。
内核是OS最基本、最核心的部分。
实现OS内核功能的那些程序称为内核程序。
注:
OS内核需要运行在内核态
OS的非内核功能运行在用户态
计算机系统结构如下:
不同的OS结构的特性、思想和优缺点如下表,其中标星号部分更有可能在选择题里考察。
大内核(常考)
- 把时钟管理(利用时钟中断实现计时的功能)、中断处理、原语(设备驱动、CPU切换等,原因是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被中断)、进程管理、存储器管理、设备管理等功能都包含在内核中的结构叫大内核。
- 进程管理、存储管理、设备管理和时钟管理、中断处理、原语都运行在内核态。
- 一个例子:现在一个应用程序想要请求OS的服务,这个服务的处理同时涉及到进程管理、存储管理、设备管理。
采用大内核结构只需要两次用户态和核心态之间的转换。如下图所示:
- 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护;大内核中某个功能块出错,就可能导致整个系统崩溃。
微内核(常考)
- 如果内核中只保留时钟管理(利用时钟中断实现计时的功能)、中断处理、原语(设备驱动、CPU切换等,原因是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被中断)这些与硬件联系最紧密的部分,就成为微内核。
- 进程管理、存储管理、设备管理运行在用户态
时钟管理、中断处理和原语运行在内核态。 - 和大内核里相同的例子需要进行六次核心态和用户态之间的转变:
注:变态过程是有时间成本的,要消耗不少时间,频繁地变态会降低系统性能。 - 优点:内核功能少,结构清晰,方便维护
- 缺点:需要频繁地在核心态和用户态之间切换,性能低。
分层结构
- 分层结构OS的示意图如下:
- 最底层是硬件,最高层是用户接口
每层可调用更低的一层(只能调用相邻更低的层)。 - 优点:
- 便于调试和验证,自底向上逐层调试和验证。
- 易扩充和易维护,各层之间调用接口清晰固定。
- 缺点:
- 仅可调用相邻低层,难以合理定义各层的边界
- 效率低,不可跨界调用,系统调用执行时间长。
模块化
- 将OS按功能划分为若干个具有一定独立性的模块。每个模块具有某方面的管理功能,并规定好各模块间的接口,使各模块之间能通过接口进行通信。还可以进一步将各模块细分为若干个具有一定功能的子模块,同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法。
模块化结构的OS如图所示:
内核 = 主模块 + 可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理
可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核。 - 优点:
- 模块之间逻辑清晰,易于维护,确定模块间接口后即可多模块同时开发。
- 支持动态加载新的内核模块(如安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
- 任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高。
- 缺点:
- 模块间的接口定义未必合理、实用
- 模块间相互依赖,更难调试和验证
外核
- 外核的结构示意图:
- 内核负责进程调度,进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全。
未经抽象:其他内核结构的OS给进程提供服务时,进程看到的地址空间是经过抽象之后的,即进程看到的是一片连续的地址空间,但实际给进程分配的不一定是连续地址空间。而未经抽象的硬件资源就是未经虚拟,可能是离散的空间。
用户进程可以申请外存分配一整片物理地址连续的空间,这是某些情况下访问硬件资源速度提升。 - 优点:
- 外核可直接给用户进程分配“不虚拟、不抽象”的硬件资源,使用户进程可以灵活的使用硬件资源。
- 减少了虚拟硬件资源的“映射层”,提升效率
- 缺点:
- 降低了系统的一致性
- 使系统变得更复杂
1.5 OS引导
- 什么是OS引导?
OS引导(boot)——开机时,怎么让OS运行起来。
磁盘里边有哪些相关数据
- 一个新买来的磁盘内部应该是空的,把新磁盘安装到电脑主板上,再安装了OS之后,磁盘中就应该有主引导记录(MBR,包含磁盘引导程序和分区表(一种数据结构,说明每个磁盘多大、地址范围是多少))、C盘(OS安装在这里)、D、E、F盘。
C盘是磁盘的活动分区,安装了OS。
将C盘进一步细分可分成:引导记录(PBR,负责找到“启动管理器”),根目录(包含一些文件)和其他。
磁盘结构的图示如下:
OS引导的过程
- 主存包含RAM和ROM两部分,其中ROM(BIOS, basic Input/ Output System基本输入输出系统)包含ROM引导程序,即自举程序。
- ROM里的内容断电后也会保留,在计算机开机后CPU会首先执行ROM里的ROM引导程序。它会指示CPU把磁盘的主引导程序读入内存。主引导程序里有磁盘引导程序和分区表。CPU可以通过引导程序,根据分区表判断C盘的位置,从而把OS里的引导记录PBR读入内存。CPU执行PBR找到启动管理器(通常存放在根目录下的某个位置),执行启动管理程序即可完成OS初始化等一系列开机操作。
- 总结,OS引导(开机过程)可大致分为以下4步:
- CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
- 将磁盘的第一块——主引导记录读入内存,执行磁盘引导程序,扫描分区表
- 从活动分区(又称主分区,即安装了OS的分区)读入分区引导记录,执行其中的程序。
- 从根目录下找到完整的OS初始化程序(即启动管理器)并执行,完成“开机”的一系列动作。
1.6 虚拟机
- 传统计算机一套物理硬件上只能运行一个OS,OS上可以运行若干进程。但是两个应用同时运行在一个OS上可能会出现一些隐患,这个问题的解决方法可以是将另一个应用进程迁移到另一台物理机器上,这台物理机器有自己的一套独立的OS,但这样会导致物理资源的极大浪费。
- 虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多态虚拟机器(Virtual Machine, VM),每个虚拟机器都可以独立运行一个OS。
同义术语:虚拟机管理程序/虚拟机监控程序/Virtual Machine Monitor/Hypervisor/VMM - 虚拟机管理程序:
- 第一类VMM:
直接运行在硬件上。VMM会把一台物理机器虚拟化成多台虚拟机器。把总的硬件资源划分成多个部分给各个虚拟机使用。各个虚拟机上可以安装各自的OS。每个OS上可以运行各自的用户进程。
只有VMM是运行在内核态的,上层的OS和用户进程都是运行在用户态的。所以当上层的OS想要运行一些特权指令时,下层的VMM就会把这个特权指令截住,然后对相应特权指令做出一定等价转换。
- 第二类VMM:
运行在宿主OS上。在宿主OS上安装第二类虚拟机管理程序。在第二类虚拟机管理程序之上可以安装客户OS(VM VirtualBox就是这个类型的)。只要硬件资源足够,就可以在宿主OS上启动多个客户OS。硬件资源的管理者是宿主OS。
- 第一类VMM:
- 虚拟机管理程序的对比: