文章目录
- 前言
- 一、操作系统的基本概述
-
- 1.1、操作系统的概念
- 1.2、操作系统的功能
-
- 1.2.1、操作系统提供的功能及示例
- 1.2.2、操作系统提供的方便易用服务
-
- 1.2.2.1、操作系统刚普通用户使用(GUI用户界面、命令接口)
- 1.2.2.2、给程序员提供的程序接口
- 小总结:提供方便易用服务的小整理
- 1.2.3、操作系统对硬件机器的扩展
- 知识回顾与重要考点
- 1.3、操作系统的四个特征
-
- 特征一:并发
- 特征二:共享
- 特征三:虚拟
- 特征四:异步性
- 并发、共享、虚拟、异步的关系
- 知识回顾与重要考点
- 二、操作系统的发展与分类
-
- 2.1、手工操作阶段
- 2.2、批处理阶段—单道批处理系统
- 2.3、批处理阶段—多道批处理系统
- 2.4、分时操作系统
- 2.5、实时操作系统
- 其他几种操作系统
- 知识点回顾与考点
- 三、操作系统运行环境
-
- 3.1、操作系统的运行机制
-
- 3.1.1、预备知识:程序是如何运行的?
- 3.1.2、区分内核程序与应用程序(认识特权与非特权指令)
- 3.1.3、如何分辨当前是内核程序和应用程序指令?分辨CPU处于什么状态?
- 3.1.4、内核态与用户态的切换
- 知识回顾与重要考点
- 3.2、中断和异常
-
- 3.2.1、认识中断的作用
- 3.2.2、中断的类型(内中断、外中断,包含例子)
- 3.2.3、中断的分类
- 3.2.4、中断机制的基本原理
- 知识回顾与重要考点
- 3.3、系统调用
-
- 3.3.1、什么是系统调用,有何作用?
- 3.3.2、系统调用与库函数的区别
- 3.3.3、小例子:为什么系统调用是必须的?
- 3.3.4、什么功能要用到系统调用?
- 3.3.5、系统调用的过程
- 知识回顾与重要考点
- 四、操作系统体系结构
-
- 4.1、认识大内核与微内核设计
-
- 4.1.1、操作系统内核位置分布
- 4.1.2、介绍大内核与微内核
- 知识回顾与重要考点
- 4.2、分层结构
- 4.3、模块化
- 4.4、外核(exokernel)
- 本章汇总总结
- 五、操作系统引导
-
- 5.1、安装操作系统后磁盘里有哪些数据?
- 5.2、操作系统引导(开机过程)
-
- 5.3、例:Windows操作系统的初始化程序(定位文件位置)
- 六、虚拟机
-
- 6.1、虚拟机的诞生
- 6.2、两类虚拟机管理程序
-
- 6.2.1、第一类VMM(运行在硬件之上)
- 6.2.2、第二类VMM(运行在宿主机之上)
- 6.3、两类虚拟机管理程序(VMM)的对比
前言
目前正在备考24考研,现将24计算机王道的408学习整理的知识点进行汇总整理。
博主博客文章目录索引:博客目录索引(持续更新)
一、操作系统的基本概述
1.1、操作系统的概念
常用的操作系统:
认识操作系统的基本概念:
1、操作系统是系统资源的管理者:资源包含的有硬件、软件。
2、操作系统也为上层的用户以及应用程序提供了方便的接口以及环境。
3、操作系统是软件而不是硬件,是最接近硬件的软件。
操作系统中对于软件以及硬件的管控可以看如下示例图,可以通过任务管理器来明确:
1.2、操作系统的功能
1.2.1、操作系统提供的功能及示例
操作系统提供的功能:处理机功能、存储器功能、文件管理、设备管理。
实际应用到了上述四个功能的实际例子:
对于上述步骤依次来描述相对应的功能:
- step1:打开各个文件过程实际上是属于【文件管理】。
- step2:打印应用的过程实际上会将对应的程序首先加载到主存中,接着来进行运行。属于【存储器管理】。
- step3:正常运行,实际会被处理机CPU进行处理。属于【处理机管理】。
- step4:视频聊天会将摄像头设备分配给QQ来进行使用,属于【设备管理】。
1.2.2、操作系统提供的方便易用服务
对于用户以及应用程序这些上层来说,我们只需要直接调用操作系统的接口即可 ,各个层之间的通俗易懂的关系如下所示:
操作系统采用了封装思路:将难用的硬件功能封装成简单易用的服务,能够令用户很方便的进行使用计算机,作为用户也无需关心底层的原理,只需要对操作系统发出命令就行。
1.2.2.1、操作系统刚普通用户使用(GUI用户界面、命令接口)
①GUI(图形化用户界面):只需要通过一些操作来直接替代很多的代码指令
而对于早期的操作系统则是通过命令接口方式与操作系统交互
②命令接口分为两种:联机命令接口和脱机命令接口
1、联机命令接口(也称交互式命令接口)
特点:用户发送一条指令,操作系统跟着执行一条指令。用户与操作系统不断地进行交互
2、脱机命令接口(批处理命令接口)
特点:将一系列的命令罗列在了一个xx.bat文件,用户提出一堆指令,操作系统跟着做一堆。
1.2.2.2、给程序员提供的程序接口
程序接口:可以在程序中通过使用系统调用的方式来使用程序接口,普通用户不能够直接使用程序接口,只能够通过程序代码间接使用。
实际应用举例:通过编写C语言代码在屏幕上输出”Hello World”,实际在printf函数的底层就使用到了操作系统提供的显式相关的”系统调用”。
- 系统调用:别称广义指令。
对于下图中为什么用户能够与操作系统中有相连的部分,主要原因就是:用户可以通过使用GUI和编写程序接口来和操作系统进行交互,而对于应用程序则是通过系统调用方式来与操作系统之间进行交互。
小总结:提供方便易用服务的小整理
对于操作系统提供的服务主要是面向用户以及面向软件、程序的,对于用户来说可以使用GUI以及命令接口(cmd,xx.bat文件),而对应程序员则是通过程序接口(通过去调用指定的系统函数来与操作系统交互)。
注意:对于程序接口以及命令接口也可以统称为用户接口
。
1.2.3、操作系统对硬件机器的扩展
操作系统作为最接近硬件层次所需要做的事情:可以实现对硬件机器的扩展。
裸机
:若是没有任何软件支持的计算机则为裸机。
- 若是在裸机上安装操作系统后,就可以提供资源管理功能和方便用户的服务功能,将逻辑改造为功能更加强大,使用更加方便的机器。
虚拟机
:覆盖了软件的机器称为扩充机器。
为什么操作系统要实现硬件的扩展?主要目的是为了让硬件的机器资源能够更加合理搭配使用,发挥更强大的功能,具体如下例子:
知识回顾与重要考点
1.3、操作系统的四个特征
特征一:并发
并发基本认识
并发:指两个或多个事件在同一时间间隔内发生,这些事件在宏观上来看是同时发生的,但在微观上是交替发生的。
本质:串行执行任务。
实际例子:
并发与并行的对比:并发是同一时刻进行一个任务;并行则是同一时刻执行多个任务。
操作系统的并发性
操作系统的并发性:指的是在计算机系统中能够在宏观上来看是”同时”运行着多个程序,微观上来看是交替运行的。
操作系统的诞生实现目的:多道程序技术以及程序并发。
重要考点:
- 单核CPU可以同一时刻只执行一个程序,各个程序只能并发的执行。
- 多核CPU同一时刻只能够同时执行多个程序,多个程序可以并发的执行。
举例:若是Intel i3处理器 4核CPU,此时它有四个核心,意味着可以进行并行执行4个任务。
若是此时要运行第五个程序,那么此时就需要采用并发的特性,其中的某个核心则需要进行交替的执行两个任务,也就是并发性。
总结:即使对于4核CPU来说,有4个以上上的任务需要同时运行,那么对于并发性依旧是不可缺少的,并发性是操作系统的一个最基本的特性。
特征二:共享
共享指的是资源共享,对于系统中的资源可供内存中多个并发执行的进程共同使用。
两种资源共享方式:
- 互斥共享方式:系统中某些资源,可以提供给多个进程使用,一个时间段只允许一个进程访问资源。
- 同时共享方式:系统中某些资源,允许在一个时间由多个进程”同时”对它们进行访问。
注意:这里的”同时”一般是宏观上的,对于在微观上,实际上多个进程在对同一个资源进行交替的访问。
实际例子:
①互斥共享例子:QQ和微信视频,在同一时间只能够分配给一个进程使用。
②同时共享例子:使用QQ与微信发送同一个文件,此时我们在宏观上可以感觉到对于两个文件都在访问硬盘资源,从中读取数据,实际在微观中,两个进程是交替访问硬盘的。
- 另一个例子:一遍打游戏与听音乐,对于一个扬声器可能会出现两个声音,也是一个同时共享示例。
并发与共享关系
结论:并发性与共享性是互为存在条件的。
实际例子:
- 若是失去并发性,那么系统中只能有一个程序在运行,此时共享性就失去了存在的意义。
- 若是失去共享性,那么QQ与微信就不能够同时访问硬盘资源,那么即使能够进行并发也失去了意义。
通过上面的例子我们可以看到对于共享与并发这两者缺失了一者,那么另一者就没有意义了。
特征三:虚拟
虚拟:指的是把一个物理上的实体变为若干个逻辑上的对应物,物理实体是实际存在的,而逻辑上对应物则是用户感受到的。
- 例如虚拟机中我们可以构建多个虚拟机然后安装多个操作系统,即可进行使用。
虚拟技术主要分为:空分复用技术(虚拟存储器技术)、时分复用技术(虚拟处理器)。
- 针对时分复用技术而言:若是失去了并发性,那么时间段内系统中只需要一道程序,此时就失去了实现虚拟性的一样了,若是没有并发性就谈不上虚拟性。
下面是(虚拟存储器技术中的空分复用技术)的示例:
下面(虚拟处理器器-时分复用技术):
虚拟处理器器-时分复用技术:微观上处理机在各个微小的时间段内交替着为各个进程服务。
- 简述:将大的时间段分为很小的时间片。
物理实际上就一个核,在用户视角觉得有六个核在为自己服务。
特征四:异步性
异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
- 这里的走走停停指的是实际在并发的过程中,若是有互斥型的资源两个进程都想要使用,那么其中一个没有获得资源的进程就需要阻塞等待,所以说这个异步并不是能够像同步一样不断地向下执行。
实际举例:
上面的例子就是我们上面所说的对于多个进程依赖一个资源的使用,在进程并发执行时并不能够同步的向下执行完成,而是某一段进程需要等待另一个进程释放资源后才能够继续向下执行。
并发、共享、虚拟、异步的关系
并发与共享关系:并发性与共享性是互为存在条件的,若是一方不存在,另一方存在也无意义了。
并发与虚拟关系:若是没有并发,虚拟性也没有意义了。
并发与异步的关系:只有系统拥有并发性,才能够导致我们所说的能够有异步性,若是同步执行某一段程序肯定是不会发生资源使用冲突的情况,此时也就不会产生异步性。
知识回顾与重要考点
二、操作系统的发展与分类
2.1、手工操作阶段
这个阶段并没有出现操作系统。
该阶段执行流程:程序将代码是提前写在了纸带机上,接着将它放入计算机,计算机读取指令执行得到结果后再次输出到纸带机上,最终程序员再通过手工方式取走。
在这个阶段的机器造价极其昂贵,通过这种手动输入输出的方式,浪费了大量计算机的资源利用率,下图是整个过程中占用的时间开销,可以看到计算机处理占到了很小的一块:
缺点:用户独占全机(同一时间只能处理用户传入的一个程序),实际就是之前提到的单核程序执行。
2.2、批处理阶段—单道批处理系统
解决手动操作系统十分低效的问题,出现了单道批处理系统。
单道批处理系统:引入脱机输入/输出技术(外围机+磁带完成),并由监督程序负责控制作业的输入、输出。
该阶段执行流程:首先程序员可以将多道程序放在指定机器上,接着外围机会控制着这些纸带机提前存储到磁带中,此时计算机会去依次的从这些磁带当中依次读取输入的作业执行(一个作业执行完执行下一条作业),之后再由计算机将程序的运行结果输出到磁带中。
效果:可以看到在这一个阶段中,对于输入、输出的时间降低了十分多,缓解了一定的人机速度矛盾。
优点:可以看到输入输出的时间降低了十分多,缓解了一定程序的人机速度矛盾,资源利用率有所提升。
缺点:内存仅有一道程序运行,只有该程序运行结束之后才能够调入下一条程序,CPU依旧是由大量时间是在空闲等待I/O完成,此时资源利用率依旧还是很低。
2.3、批处理阶段—多道批处理系统
多道批处理系统:每次读入多道程序,让这些程序进行并发的执行。
看下实际作业的执行过程:在当前阶段里,可以读入多道程序并且可以进行并发(宏观上并行, 微观上串行)的执行处理任务:
第一个作业实际是由①②④组成,第二个作业是③⑤⑦组成,第三个作业是⑥⑧⑨组成。
首先作业1中①输入执行,接着第二个时间片作业1中执行计算②,在这个时间片中此时输入设备已经空闲此时可以并行的完成作业2的输入①,接着进入到第三个时间片,此时作业1就可以执行输出③,与此同时输入、计算都是空着的,此时作业2中的执行⑤同样也可以进行执行,作业3的输入①同样可以在这个时间片进行,接着依次同理,在同一时间片中只要有一个外设不在工作就可以让其合理的利用起来。
优点:多道程序并发执行,可以共享计算机资源,资源利用率得到了大幅度提高,CPU和其他资源能够保持”忙碌”状态,系统的吞吐量增大。
缺点:用户响应时间长,没有人机交互的功能(用户提交自己的作业就只能够静静等待计算机处理完成,中间不能够去控制作业的执行),并且无法调试程序以及无法在程序运行时输入一些参数。
2.4、分时操作系统
为了解决没有人机交互的问题,发明了分时操作系统。
分时操作系统:计算机以时间片尾单位轮流的给各个用户/作业服务,各个用户可以通过终端与计算机进行交互,如下:
通过分时操作系统能够使用户的一些输入等其他操作能够及时的被CPU响应到,解决了人机交互的问题。
优点:用户请求可以被及时响应,解决了人机交互问题,此时能够允许多个用户可以同时使用一台计算机,并且用户对计算机的操作能够相互独立,感觉不到其他用户也在同时使用。
缺点:不能够优先的处理一些紧急的任务,因为在这个阶段操作系统对于每个用户/作业都是公平的,循环的为每个用户/作业服务一个时间片,不区分任务的紧急性。
2.5、实时操作系统
实时操作系统:在实时操作系统的控制下,计算机系统接收到外部信号及时的进行处理,并且在严格的时限内处理完事件。
分为两类:硬实时操作系统和软实时系统
优点:能够优先相应一些紧急任务,某些紧急任务不需时间片排队。
特点:及时性和可靠性。
其他几种操作系统
知识点回顾与考点
三、操作系统运行环境
3.1、操作系统的运行机制
3.1.1、预备知识:程序是如何运行的?
对于下面黑框中的”指令”实际上就是交互式命令接口,在这里指令应当是上面机器语言的二进制代码:
3.1.2、区分内核程序与应用程序(认识特权与非特权指令)
应用程序:跑在操作系统之上的。
内核程序:微软、苹果的顶级大佬写的操作系统的代码就是内核程序。在内核中包含的只是操作系统中最重要、最核心,最必不可少的这些功能。
-
内核
:许多内核程序组成了操作系统内核,简称”内核”。内核是操作系统中最重要最核心的部分,也是最接近硬件的部分。 - 可以说一个操作系统只要有内核就够了,例如Docker中只要有Linux内核就可以了。
注意:操作系统的功能未必都在内核中,例如图形化用户界面,即使没有图形化用户界面,依旧能够使用类似于CMD命令窗口来使用操作系统。
针对于内核以及应用程序是否可以使用任一指令?
- 针对于一些”特权指令”,例如内存清零指令,这些指令都影响十分大,只允许”管理者”也就是操作系统的内核来使用。【在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令就能够判断出类型】
- 应用程序只能够使用”非特权指令”,例如加法指令、减法指令等等。
3.1.3、如何分辨当前是内核程序和应用程序指令?分辨CPU处于什么状态?
如何分辨当前执行的这条指令是一个应用程序的指令,还是一个内核程序的指令呢?
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
如何分辨CPU是处于哪个状态呢(用户态、内核态)?
- CPU中有一个寄存器叫做程序状态字寄存器(PSW),其中有一个二进制位,这个位是1表示内核态,0表示用户态。
- 别名:内核态=核心态=管态。用户态=目态。
3.1.4、内核态与用户态的切换
CPU如何完成内核态与用户态的切换?
通过一个示例来进行说明这两者之间的切换:
- 首先开机,CPU当前默认为”内核态”,操作系统内核程序先上CPU运行。
- 开机完成之后,用户启动某一个应用程序。
- 此时操作系统内核程序会在合适的时候主动去让出CPU的使用权(当前是内核态),让应用程序上CPU运行。
- 实际让出CPU使用权过程就是内核态—>用户态的过程,操作系统内核在让出CPU之前,会执行一条特权指令将PSW中的标志位设置为”用户态”,此时完成切换。
- 应用程序运行在”用户态”。
- 此时黑客在当前运行的应用程序中植入了一条特权指令,企图去破坏系统运行。
- 当CPU此时执行特权指令时,首先会发现这条指令是特权指令,并且检查自己的状态为”用户态”。
- 由于是用户态此时想要执行特权指令,此时这个非法事件会引发一个中断信号。
- CPU检测到中断信号后,此时就是用户态—>核心态的过程,对应的PSW标志位会设置为”核心态”,并停止运行当前的应用程序,转而运行处理中断信号的内核程序。
- 经过这个”中断”,操作系统会再次夺回CPU的控制权。
- 接着操作系统会对引发中断的事件进行处理,处理完成之后再将CPU使用权交给别的应用程序。
通过这个示例,对用户态与核心态之间的转换进行梳理:
-
内核态—>用户态
:处于内核态的CPU会执行内核程序中的一条特权指令(修改PSW中的标志位为用户态),这个动作意味着操作系统会主动让出CPU的使用权。 -
用户态—>内核态
:处于用户态的CPU执行应用程序时若是其中有特权指令会引发”中断”,硬件自动完成变态过程(转变核心态),触发中断信号意味着操作系统会强行夺回CPU的使用权。【除了非法使用特权指令外,还有很多事件都会触发中断信号,只要是需要操作系统介入的地方,都会触发中断信号】
知识回顾与重要考点
3.2、中断和异常
3.2.1、认识中断的作用
CPU会运行两种程序分别是操作系统内核程序以及应用程序。
- 操作系统内核程序:是整个系统的管理者。
作用:”中断”会使CPU从用户态变为内核态,使操作系统重新夺回对CPU的控制权。
- 若是没有中断技术,无法实现多道程序并发。
对于用户态与内核态的切换在3.1章节中有详细说明,这里直接贴一下王道讲的内容:
3.2.2、中断的类型(内中断、外中断,包含例子)
中断的类型分为两个:内中断与外中断
- 内中断:与当前执行的指令有关,中断信号来源于CPU内部。
- 外中断:与当前执行的指令无关,中断信号来源于CPU外部。
内中断例子:
例1:试图在用户态下执行特权指令
描述:CPU在用户态运行应用程序过程中执行了一条特权指令,此时就会触发中断信号,CPU会从用户态切换到核心态并且来执行处理中断信号的内核程序。
例2:执行除法指令时发现除数为0
例3:若是应用程序确实是想要使用操作系统内核的服务,此时会执行一条特殊的指令—陷入指令,该指令会引发一个内部中断信号。
- 陷入指令并不是特权指令,此时这个应用程序会主动的将CPU使用权还给操作系统内核。
小结:若是当前执行的指令为非法的,那么就会引发一个中断信号。
外中断例子:
例1:时钟中断—由时钟部件发来的中断信号。
描述:此时有两个应用程序需要进行并发的执行,此时程序1运行在用户态,执行了50ms后,时钟部件会向CPU发送一个中断信号,此时CPU会从用户态切换到内核态执行处理时钟中断的内核程序,处理完成之后将CPU的使用权又交给程序2来运行,此时切回了用户态,等待程序2运行了50ms后,时钟部件又一次发送了中断请求,后面的处理机制与上面类似。
- 相对比较公平的分配给不同的应用时间片,对于内核态切换到用户态并且指定程序运行是由内核程序完成!
小结:两个程序在中断机制下如何进行并发运行的。
例2:I/O中断,由输入/输出设备发来的中断信号
描述:例如打印机在完成打印之后就会发送给CPU一个中断信号,用来表示任务已经完成,此时CPU会使用这个中断信号对应的处理I/O中断的内核程序来进行处理。
总结:对于上面两个例子,这些中断信号都是来自于CPU外部,与执行指令没有关系。
3.2.3、中断的分类
- 陷入:当应用程序想要去执行内核程序的服务时,就需要执行这个指令,这也是系统调用的一个原理。
- 故障:由错误条件引起的,并且可能被内核程序修复的问题,内核程序修复故障之后,会把CPU的使用权还给应用程序,让它继续执行下去,例如缺页故障。
- 终止:是由指明的错误引起的,这类错误内核程序无法修复,一般来说发生了这些类型的异常,内核程序不会将CPU使用权还给应用程序,而是会直接让这个程序终止不再运行,例如整除/0、非法使用特权指令。
注意:很多考试中,内中断一般称为异常,外中断称为中断。
3.2.4、中断机制的基本原理
原理:不同的中断信号,需要用不同的中断处理程序来处理,当CPU检测到中断信号后,会根据中断信号的类型去查询”中断向量表”,此时找到相应的中断处理程序在内存中的存放位置。
- 中断处理程序是内核程序,一定是运行在内核态的。
知识回顾与重要考点
重点:内中断与外中断的检查时间,前者是在执行指令的时候检查是否有异常发生,后者则是在指令周期末尾,CPU都会检查是否有外中断信号需要处理。
3.3、系统调用
3.3.1、什么是系统调用,有何作用?
给用户使用的是GUI,程序接口则是一堆系统调用组成。
系统调用:是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
- 系统调用相对于普通的库函数的调用又有些区别。
3.3.2、系统调用与库函数的区别
对于系统调用与调用库函数的区别如下图:
- 应用程序直接调用系统调用:通过编写汇编语言代码方式直接请求。
- 应用程序间接调用系统调用:通过使用高级语言来编程,可以直接使用高级语言的库函数。实际这些高级语言的库函数在底层也是会使用到操作系统提供的系统调用功能请求操作系统的服务。
并不是所有的库函数都涉及到系统调用如何理解:
- 不涉及系统调用的库函数:例如”取绝对值”的函数,如math.h只提供了一些计算。
- 涉及系统调用的库函数:如”创建一个新文件”的函数。
下面分别是整个机器从下层到上层可以提供的服务:
3.3.3、小例子:为什么系统调用是必须的?
实际例子如下:
此时可能会出现的情况:两个进程并发运行,打印机设备交替地收到WPS和Word两个进程发来的打印请求,此时两篇论文的内容混杂在一起。
如何实现对共享资源互斥的访问?
解决方案:由操作系统内核对共享资源进行统一的管理,并向上提供”系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求,内核会对各个请求进行协调处理。
- 保证在并发过程中不会出现奇怪的问题(例如两个打印机打印的内容由于并发打印,造成内容杂糅在一起的情况 )
3.3.4、什么功能要用到系统调用?
应用程序通过系统调用请求操作系统的服务,而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务情况。
好处:能够保证系统的稳定性,防止用户进行非法操作。
3.3.5、系统调用的过程
详细过程如下:
①首先CPU在用户态执行应用程序,此时此时程序想要发出系统调用的时候,需要用传参数的指令向CPU的寄存器传递一些必要的参数(例如参数1指明哪种类型的系统调用如fork系统调用,对应的参数可能有多条)。
②操作系统会个根据应用程序给出的这些参数来判断要的是哪种类型的服务,等待参数都放入到了寄存器中,应用程序就会执行一条特殊的指令-陷入指令。
③对于这个陷入指令执行,会引发一个内中断,当CPU检测到内部中断的时候,会确认这个中断信号是trap陷入指令引起的,此时CPU会暂停运行,切换到内核态运行并转而去执行处理陷入指令的程序,该程序为系统调用入口程序。
④接下来根据系统调用入口会检查寄存器里这些参数,通过第一个参数,会直到此时这个应用程序想要的是这种类型的系统调用服务,此时操作系统去调用真正应用程序想要调用的处理程序(fork程序)此时依旧是内核态,等待执行完内核态之后,CPU又会转回用户态继续执行之前的应用程序。
接着我们就高级语言程序去完成系统调用过程进行简洁图示:
简洁流程:传递系统调用参数—>执行陷入指令(用户态)—>执行相应的内请求核程序处理系统调用(内核态)—>返回应用程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令之后会立即引发一个内中断,使CPU进入核心他。
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行。
别名:陷入指令=trap指令=访管指令。
知识回顾与重要考点
四、操作系统体系结构
操作系统的内核怎么设计?
4.1、认识大内核与微内核设计
4.1.1、操作系统内核位置分布
操作系统的内核:
对于操作系统内部可以进一步划分:内核与非内核
接着我们再对内核进行细分:分成时钟管理、中断处理、原语以及各个功能管理
对于时钟管理、中断处理、原语是与硬件结合最为紧密的,必须要将其放在内核当中。
对于有些操作系统并不将这些功能管理放到内核中,与之前的是两种设计方法,此时构成的结构图如下所示:
注意:若是将所有的这些功能都包含在操作系统内部中的结构则是叫做大内核。若是内核当中只保留与硬件关系最紧密的这些部分,那么这种内核就叫做微内核。
4.1.2、介绍大内核与微内核
此时对于微内核部分的运行在内核态,对于非内核功能运行在用户态,这会对我们系统的性能造成影响。
我们将两种设计结构如下图所示:
- 大内核设计:功能管理以及核心如时钟管理、中断处理、原语都是属于内核。
- 微内核设计:仅仅只有时钟管理、中断处理、原语是属于内核。
此时由于两种设计的不同,那么应用程序去进行系统调用的过程也并不相通,如下所示:
需求描述:应用程序想要请求操作系统的服务,这个服务的处理同时涉及到进程管理、存储管理、设备管理。
①采用大内核:此时应用程序向操作系统提起服务,CPU会用户态切换为核心态,只需要进行两次变态即可。
②采用微内核:同样向操作系统发起命令,此时由于几个功能管理都是属于用户态,这些模块在实际使用的时候依旧需要内核的支持,那么一个功能管理就需要进行两次变态,涉及到三个,那么就是六次变态。
- 对于功能管理与内核之间是通过消息传递来进行的,向微内核中发送一个消息,在消息里边指明了调用谁以及对应的参数,接着将消息传递到指定的管理模块(例如存储管理),此时这个管理模块接收到进程管理这个消息之后,才会处理这个调用的请求,若是要得到调用结果也是通过消息传递的方式,让微内核协助各个模块之间的调用以及返回。
- 显然,相对于大内核直接进行函数调用肯定要比消息传递快得多。
结论:可以看到若是采用微内核会出现频繁的切换CPU的状态是会降低系统性能的。
实际应用:
- 典型的大内核/宏内核/单内核 操作系统:Linux、UNIX
- 典型的微内核 操作系统:Windows NT
知识回顾与重要考点
4.2、分层结构
内核分层特性:其中的每一层只能够去调用相邻的一层,不能够进行跨层调用。
优点:
1(重点关注)、便于调试和验证,自底向上逐层调试验证。
- 说明:首先第一层只会使用到底层的硬件,硬件厂商在出厂各个硬件的时候就已经保证了功能是否正确,只需要去调用第一层的代码进行调试下就可以了。第二层的调试是基于正确的第一层来进行的,之后依照一层一层往外调试,只有一层验证ok才会再去验证下一层,此时就能够将软件测试的这个过程变得十分清晰明朗。
2、易于扩充与维护,各层之间接口清晰固定。
- 说明:这类分层结构在操作系统内核设计的时候就确定的,对于层与层之间调用接口、函数名、调用的参数提供哪些参数含义,每个调用返回值,都是在最初设定好的。由于层间调用接口固定不变,此时就可以在两层之间添加一层新的,只要保证原来的接口不变就可以,十分方便维护。
缺点:
1、仅可调用相邻底层,难以合理定义各层的边界。
- 说明:比如第3层与第4层,只能够第4层去调用第3层,而对于第3层不能够去调用第4层,(可以类比进程以及内存,进程能够使用内存管理功能,而内存管理功能不能够使用进程),所以对于高层只能调用底层的约定很不灵活。
2(重点关注)、效率低,不可跨层调用,系统调用执行时间长。
- 例如图中,作为用户我只想要使用A中的某个功能,若是没有限制可以直接通过D->A即可得到结果,而若是按照规定限制,只能够通过D->C->B->A这么长的链路完成功能,此时就会导致系统调用的时间,执行时间变长,效率低。
4.3、模块化
模块化:将内核划分为多个模块,各模块之间相互协作。
操作系统的内核划分为多块,模块之间相互协作工作,如下图将操作系统分为进程管理、存储器管理、文件管理,对于各个管理又再一次进行细分:
内核=主模块+可加载内核模块
- 主模块:指的是进程、内存…这些重要模块。
- 可加载内核模块:指的是可以动态加载到操作系统的内核模块。例如设备驱动程序,对于这个模块可有可无,即使没有也不会影响到操作系统的运行,只是会影响到操作系统的可扩展性。若是加载了这个驱动程序模块,此时系统可支持新的东西。
模块化操作系统的优点:
1、模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发。
- 说明:易于维护指的是某个模块用来管进程,有的模块用来管内存。确定模块间接口就是明确各个函数功能、参数,返回值,那么就算当前的功能模块没有实现,也可以按照约定在模块之间进行开发。
2(重点关注)、支持动态加载新的内核模块(如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性。
- 说明:加载新的模块不需要重新编译某个内核。
3(重点关注)、任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高。
- 说明:各个模块之间,若是要使用一个功能管理部分的功能,就直接调用函数即可。这种方式可以使得功能的调用效率非常高。在微内核中就需要使用消息出传递的方式来调用其他模块所提供的功能。
缺点:
1、模块间的接口定义未必是合理、使用。
- 说明:对于真正功能调用的过程中,常常会发现在其他模块中好像还需要用一个新的功能,由于各个模块之间相互调用的比较多,对于模块之间的你调我,我调你功能会出现问题。
2、模块间相互依赖,更难调试和验证。
- 说明:由于模块之间能够相互进行调用,肯定A调用B中的代码出现问题,此时B中代码有调用了A,那么此时就会导致调试与验证比较困难。
4.4、外核(exokernel)
下面是包含有外核的一个层级关系设计图:
应用程序可以通过系统提供的库函数来去调用普通内核中的一些功能,也可以通过库函数直接调用外核所提供个功能。
在这种操作系统中,操作系统=内核+外核
:
- 内核:负责进程调度、进程通信等功能和硬件资源无关的工作。
- 外核:负责为用户进程分配未经抽象的硬件资源(例如磁盘的存储空间、内存的存储空间),且由外核负责保护资源使用安全。
对于【未经抽象的硬件资源】的解释:
- 首先理解抽象过的硬件资源:在普通的操作系统中,若是用户进程想要使用一片内存空间,那么给它分配的则是经过抽象的虚拟化的空间,对于用户视角是连续的一块空间,而实际物理空间则是不连续的可能是离散的,对于外存分配空间也是一样的。【用户不能够自己控制这块硬件资源的连续与离散】
- 对于外核给出的这种未经抽象的硬件资源,作为外核是可以直接给用户进程分配的,此时该进程可以去向外核申请一整片连续的磁盘块,作为外核可以直接分配这一块实实在在的物理空间,而不是虚拟的,经过抽象的地址空间。【用户能够去控制硬件资源的连续,可以向外核申请】
针对于上述,对于得到的离散的一块磁盘空间在实际访问的时候磁头会来回横跳,影响效率,所以对于有外核的相对来说能够由更加高的灵活度。
对于【外核负责保护资源使用安全】的解释:例如进程A向外核分配一块E区间,此时若是其他进程访问这块E区间,此时这种行为会被外核发现并制止,同时进程A若是访问不是它自己申请的一块空间同样也会被发现和制止,所以作为外核它分配了这些硬件资源之后,还需要保证这些硬件资源的使用安全。
优点:
1(重点关注)、外核可直接给用户进程分配”不许你、不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源。
2(重点关注)、减少了虚拟硬件资源的”映射层”,提升效率。
- 说明:①普通的操作系统个以用户分配的都是虚拟的硬件资源,例如虚拟内存,那么对于一个用户在访问自己的地址空间的是否,给出的则是虚拟地址,操作系统需要去查页表,甚至查二级、三级页表,通过多次访存后才能够把虚拟地址转换为实际的物理地址,对于这个映射的时间则是需要时间开销的。
- ②若是使用了外核分配的未抽象的硬件资源,则无需经过映射转换确定物理地址,直接拿的就是物理地址,此时就能够提升效率。
缺点:
1、降低了系统的一致性。
- 说明:对于使用了外核的操作系统,那么有些使用应用程序请求得到是虚拟地址空间确定物理地址需要进行映射,有些时候是自己指定的未抽象物理地址空间直接访问就可以,那么对于分配内存、外存管理是不是要考虑是否已经分配的情况,所以降低了系统的一致性。
2、使系统变得更复杂。
本章汇总总结
红色为大纲新增加的,黄色则是之前大纲的。
五、操作系统引导
5.1、安装操作系统后磁盘里有哪些数据?
在最初一开始的时候仅仅只有一块磁盘:
安装完操作系统后,我们磁盘分布如下:
-
主引导记录(MBR):包含了磁盘引导程序和分区表。
-
分区表:实际就是一个数据结构,说明了在磁盘中每一个盘每一个分区分别占多大的空间以及每个分区的地址范围。
由于C盘中安装了操作系统,此时C盘可以称为磁盘的活动分区。
此时再将C盘进行细分:包含引导记录PBR、根目录、其他
- 引导记录PBR:主要目的是用来找到启动管理器。
- 根目录:就是双击C盘打开看到的内容。
5.2、操作系统引导(开机过程)
操作系统引导一定是从CPU开始的,下面是对应的CPU与主存:
主存由ROM和RAM组成。
- RAM:断电数据就丢失了。
- ROM(BIOS,Basic Input/Output System):基本输入输出系统,其中包含了ROM引导程序(自举程序),断电数据不会丢失。
注意:这里主存中包含BIOS应该是启动之后读取了主板上的ROM硬件的BIOS程序后的。
下面是结合5.1磁盘内容和主存进行向
下面是对于上面操作系统引导的各个阶段补充:
- CPU一通电,此时就会去主存当中固定的位置找到这个ROM引导程序并且执行其中程序一条一条往后执行。
- 通常在这个阶段ROM引导程序会去检查硬件是否有问题,完成硬件自检。
- 在ROM引导程序中,会指示着CPU去把磁盘的主引导记录及分区表将它给读入到内存,此时这个阶段ROM引导程序以及磁盘的主引导程序都会读入到主存中。
- 此时CPU就会执行这个主存里边的磁盘引导程序,对于磁盘引导程序则会根据分区表去判断C盘所处的位置接下来是否可以读入C盘的第一部分数据,也就是读取C盘中的引导记录PBR(该引导程序本质依旧是一个程序)。
- 此时执行C盘中的引导记录程序PBR,其主要作用是找到启动管理器,接着从根目录里找到启动管理程序,此时CPU再执行管理程序完成操作系统初始化的开机的一系列工作。
- 启动管理器:通常存放在C盘中的对应的根目录里某个位置。
5.3、例:Windows操作系统的初始化程序(定位文件位置)
六、虚拟机
6.1、虚拟机的诞生
传统的计算机在一个物理机器上只能够运行一个操作系统。对于一个操作系统商运行两个进程,它们之间可能会相互影响,也会相互争夺操作系统管理的资源。实际在商业环境中,两个应用让他们同时在一个操作系统商运行就会造成一些隐患。
****
一种解决方案:将启动的一个应用服务迁移到另一台物理机上。
缺点:这种方案对于真正的商业级物理机来说又是比较浪费,因为本身商业级的硬件性能十分强大,本身硬件性能是可以支持两个进程的,但是又为了安全起见不得将另一个应用迁移到另一台机器上运行。所以传统的这种结构一个机器上只能安装一个操作系统,就会带来很多应用上的限制。
此时虚拟机诞生!
6.2、两类虚拟机管理程序
虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(Virtual Machine,VM),每个虚拟机器都可以独立运行一个操作系统。
- 同义术语:
虚拟机管理程序
、虚拟机监控程序
(Virtual Machine Monitor/Hypervisor)。之后统一先试用虚拟机管理程序来表示虚拟机。
虚拟机管理程序分为两类:第一类VMM(运行在硬件之上);第二类VMM(运行在宿主机之上)。
6.2.1、第一类VMM(运行在硬件之上)
第一类VMM:直接运行在硬件之上。
由虚拟机管理程序将一台物理机虚拟化为多个部分,在每一台虚拟机上都可以安装各自的操作系统,例如第1台Windows、第2台Linux、第3台Windows,在每一个操作系统商都可以运行各自的用户程序。
如何将一个机器上的硬件资源分配给各个虚拟机器?
- 实际原本的一个CPU也可以被虚拟成多台虚拟机,实际本质无非就是根据虚拟机的数量来进行合理分配。例如多台虚拟机中使用的CPU实际还是一个,无非就是将每个虚拟机器分配若干个时间片,此时在上层的操作系统看来,给自己分配的就是一个独立的CPU,对于内存、磁盘也是同样的思路,根据虚拟机数量进行空间的划分再分配给多个虚拟机。
采用上面的方式,每个虚拟机就可以拥有了各自独立的硬件资源了,这类似于原本计算机对硬件进行划分,如时间片、内存、磁盘空间划分给多个应用进程。对于这个虚拟机管理程序类似我们学习的操作系统,它可以直接管理并分配这些硬件资源。
疑问:对于上层的操作系统它并不知道自己运行在用户态,它会以为自己运行在内核态,那么对于这些操作系统应该是属于用户态,那它们可以使用特权指令吗?
- 当上层的操作系统想要使用特权指令的时候,他的这个行为会被虚拟机管理程序给截获,此时这个虚拟机管理程序会把上层操作系统的特权指令来做一些等价转换,同样是模拟出指令成功的感觉。
注意:只有虚拟机管理程序是运行在内核态的,只有它才可以运行特权指令。
6.2.2、第二类VMM(运行在宿主机之上)
第二类VMM:运行在宿主机操作系统上
常见的虚拟机软件如下:
这一类虚拟机管理程序是运行在一个宿主机OS上,我们在宿主机OS上可以下载这个虚拟机管理程序软件:
接着通过虚拟机管理程序中我们可以创建多个虚拟机,并且每个虚拟机可以去指定的分配资源,在宿主机上可以同时的启动多个虚拟机也就是客户端操作系统,并且还能够运行我们宿主机上的应用程序。
重点:第二类的虚拟机管理程序并不是运行在硬件之上,而是运行在宿主机操作系统上,在第二类中若是想要给虚拟机器分配硬件资源,那么只能够请求操作系统给它分配(管理者),对于这一类宿主机操作系统是在核心态运行的,第二类虚拟机管理程序则是在用户态运行(部分是在内核态)。
6.3、两类虚拟机管理程序(VMM)的对比
两类虚拟机管理程序(VMM)的对比如下所示:
下面则是对于上面两类虚拟机管理程序VMM对比的更多补充:
资源分配方式
:
- 对于外存的分配:
- 第一类则是管理者角色可以直接对资源进行划分(与之前外核分配资源方式类似);
- 第二类若是虚拟机管理程序想要分配资源这部分资源则是抽象的,它会向操作系统申请创建10GB的大文件(举例,对于具体存放位置由宿主机决定,只是虚拟磁盘未必是连续的),分配得到过后它再分配给指定的虚拟机。
- 对于内存的分配也类似:虚拟机管理程序向操作系统申请获得的是4G虚拟内存,获取到虚拟内存之后,再将虚拟内存进行拆分分给两个虚拟机器,各自2GB。
性能
:从上述来看很明显对于第一类虚拟机管理程序性能更好,第二类虚拟机管理程序性能更差。
- 因为对于第二类每进行一次的硬件虚拟化,就意味着上层操作系统在使用硬件资源的时候,会将这个地址映射为虚拟机管理程序获得的虚拟机地址空间,接着宿主操作系统又需要把对应4GB的虚拟机地址空间映射到实际的物理地址空间,中间经历了多层的虚拟映射才可以对应到最终的物理地址,导致性能更差。
可支持的虚拟机数量
:第一类更多。
- 第一类更多原因:第一类的虚拟机管理程序拥有所有的硬件资源,第二类的虚拟机管理程序对于所需资源需要向操作系统申请,并且其本身需要一些硬件资源,同时宿主操作系统上进程依旧需要一些硬件资源。
- 所以在硬件资源相同的情况下,第一类能够支持更多的虚拟机。
虚拟机迁移程序
: 第一类更差,第二类更好。
- 第一类迁移十分的麻烦。
- 第二类由于是使用的虚拟机管理程序软件,例如使用virtualbox,那么只需要将对应的操作系统导出为iso文件,其他人若是使用同一个操作系统(包含上面软件)只需要创建虚拟机导入即可,使用十分灵活。
运行模式
:第一类VMM运行在Ring 0(0环,最高级别),上层系统运行在次高优先级;第二类VMM部分运行在用户态,部分运行在内核态,对于虚拟机中发出的系统调用会被VMM截获再转化为VMM对Host OS(宿主机)的系统调用,对于虚拟机管理程序则一直会被当成一个工具人使用。
上面所说的Ring 0的含义:最近几年的CPU特权级别会被更多层次的划分,最高级则是零级,之后越往上权限越低。
为什么采用这种划分更多的特权级别有好处?
- 若是不划分的很细,那么就只有非特权指令和特权指令,这里拿第二类虚拟机管理程序举例,那么对于虚拟机中的操作系统若是想要发起系统调用,此时虚拟机管理程序则需要将其截获并且去判断该特权指令是否合法,若是合法还需要由其来进行模拟,再发给宿主机最终模拟出特权指令执行的效果。
- 若是采用这种特权级很细,那么我只需要根据分类划分就行,这里拿第一类举例,虚拟机管理程序运行在最高权限0,客户操作系统内核运行在一环,此时上层客户操作系统使用一环二环指令,作为虚拟机管理程序就无需进行管理,直接执行即可,只对零环的调用系统指令才会检查。
- 好处:虚拟机不用检查每一条特权指令的执行,只需要检查某一些敏感指令的执行即可。
整理者:长路 时间:2023.7.3-7.4
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net