#pic_center
R 1 R_1 R1
R 2 R^2 R2
目录
- 知识框架
- No.1 操作系统的概念功能和定义
- 一、操作系统的概念和定义
- 二、操作系统的功能和目标
- 1、资源的管理者
- 2、向用户提供服务
- 2.1图形化用户接口
- 2.2联机命令接口
- 2.3脱机命令接口
- 2.4程序接口
- 3、对硬件机器的拓展
- 三、总结
- No.2 操作系统的特征
- 一、并发
- 二、共享
- 三、虚拟
- 四、异步
- 五、总结
- No.3 操作系统的发展与分类
- 一、手工操作阶段
- 二、单道批处理系统
- 三、多道批处理系统
- 四、分时操作系统
- 五、实时操作系统
- 六、其它操作系统
- 七、总结
- No.4 操作系统的运行机制
- 一、两种程序
- 二、两种指令
- 三、两种处理器状态
- 四、状态切换过程
- 五、总结
- No.5 中断和异常
- 一、中断的作用
- 二、中断的类型
- 1、内中断
- 2、外中断
- 三、中断的分类
- 四、中断机制的基本原理
- 五、总结
- No.6 系统调用
- 一、什么是系统调用
- 二、系统调用和库函数的区别
- 三、为什么系统调用是必须的
- 四、什么功能要用到系统调用?
- 五、系统调用的过程
- 六、系统调用的过程
- 七、总结
- No.7 操作系统的体系结构
- 一、操作系统的内核
- 二、操作系统的两种体系结构
- 三、总结
- No.8 操作系统的引导
- 一、操作系统的引导
- 二、开机过程
- 三、例子
- No.9虚拟机
- 一、传统计算机
- 二、虚拟机
- 三、两类虚拟机对比
知识框架
No.1 操作系统的概念功能和定义
内容首先来看一下,大家都熟悉的操作系统都有哪些。
对于一些手头比较宽裕的同学来说,可能会比较喜欢啊苹果的这些设备,比如说苹果的电脑使用的是Mac OS,然后苹果的手机使用的是iOS系统。但是对于我自己来说,比起苹果的这种啊浮夸,我还是比较喜欢这个安卓和Windows操作系统的这种质朴的优雅。
那对于普通老百姓来说,可能99%的人都在使用啊这几种操作系统。但是对于技术专业的同学来说,Linux操作系统也是我们必须学习使用的一个呃操作系统。
另外呢,现在可能还会有一些野人还在使用啊诺基亚的塞班系统。所以可以看到,我们其实在学习这门课之前,我们自己已经积累了很多关于操作系统的这种体验感性的经验。
因此,我们在学习这门课的时候,我们可以啊用自己平时使用这些操作系统的一些啊经验,来结合我们学习到的一些知识点进行思考。这样可以帮助大家更好地理解啊课程的内容,并且把操作系统知识和我们的啊现实生活给连接起来,做到学以致用。
一、操作系统的概念和定义
当然,下面是对你提供的文本进行标点符号补全的版本:
我们只介绍操作系统的一些最基础的概念和定义,并且会结合一些例子来加深大家的理解。
那,操作系统的概念和定义要回答的就是,什么是操作系统这样一个问题。他的功能和目标要回答的是,操作系统它需要做什么这样的一个问题。
那,首先来看第一个部分内容:操作系统的概念和定义
首先,我们来结合生活经验,看一下操作系统在整个计算机体系当中所处的一个位置和角色。那,我们看一下我们现在所使用的电脑是怎么样一步一步变成我们现在看到的这个样子的。
第一步,厂家会把CPU、主板等等这一系列的硬件给组装成一台裸机。所谓的裸机就是只有硬件的机器,它不包含操作系统。但是在这个机器出售之前,一般这个厂家还会在这个裸机的基础之上为我们安装一个操作系统,比如说最常用的就是Windows的操作系统。那,当我们买到这个电脑之后,就可以在这个操作系统之上来安装一些我们想要使用的应用程序,比如说像QQ。之后,我们作为用户就可以来使用这些应用程序了。
所以,我们根据一台电脑的诞生过程,就可以看出这个计算机系统的一个层次结构。最底层的当然是纯硬件,又称之为裸机。在裸机上面会安装一层操作系统,而基于操作系统,我们又可以安装一系列的应用软件。我们用户是处于最上面一层这个地方。细心的同学可能会发现,用户和操作系统的这个边界是有一些相连的部分,用程序和操作系统也会有一些相连的部分。那,为什么是这样呢?这个问题,我们一会会进行进一步的解释。
那,在了解了操作系统在整个计算机系统当中所处的一个位置之后,我们来给出操作系统的定义。
那,这是王道书上给出的一个定义:
操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机的工作和资源的分配。那,其实这句话他想表达的无非就是,操作系统他是系统资源的一个管理者,他是一个这样的角色。那,这个系统资源呢,当然就包含了硬件和软件资源。我们来看一个直观的例子,如果大家使用的是Windows操作系统的话,可以用这种方式来打开任务管理器。然后在任务管理器这个界面,我们就可以看到现在系统当中正在运行的进程有哪些。那,所谓的进程其实就是正在运行的软件,正在运行的程序,比如说大家熟悉的QQ、Chrome等等。所以,从这个地方可以看到,操作系统肯定是在对这些软件资源进行管理的。那,再看右边这个界面,可以看到操作系统对CPU、内存等等这一系列硬件资源的使用情况,其实也是在监控的。比如说,现在QQ这个进程,它使用了138.9兆字节的内存空间。所以,从右半部分的这个界面来看,操作系统它肯定是在对硬件进行管理的。因此,操作系统作为软件和硬件中间的一个层次,它是系统资源的管理者,既管理了软件资源也管理了硬件资源。
再来看第二句话,操作系统他要提供给用户和其他软件方便的接口和环境。其实,这句话想表达的就是,操作系统他要向上层提供方便易用的服务,那上层包括用户和普通的应用程序。
再来看第三句话,操作系统它是计算机系统当中最基本的系统软件。也就是说,操作系统它其实是一种软件,而不是硬件。但是,从这个图当中我们也可以看到,操作系统它是最接近硬件的一层软件。
接下来,我们会对操作系统的这三个功能进行更进一步的细分和分析,让大家更形象的来体会操作系统的一个作用。
二、操作系统的功能和目标
1、资源的管理者
首先要看的是操作系统,它作为软件和硬件中间的层次,它是系统资源的一个管理者。我们用大家使用QQ和朋友视频聊天的例子,帮助大家来理解它作为系统资源的管理者要做一些什么事情。
首先,我们肯定是需要在文件夹当中找到QQ的安装位置。比如说,像我的电脑当中,我的QQ就是安装在了地盘的一系列路径下面。所以,当我找到QQ的这个启动程序之后,我就可以双击打开QQ.exe。那,当我双击之后,QQ程序就可以正常的运行,然后我就可以用QQ和我的朋友进行视频聊天了。
在这个过程当中,我们可以看到,第一步我们是通过了这些一层一层的文件夹目录来找到了我们的QQ启动程序。那,除了这个文件之外,系统当中还有各式各样的其他的文件,但是这些文件的组织和管理,其实是操作系统在帮我们完成的。所以,这就涉及到了操作系统作为系统资源的管理者所要提供的一个功能,叫做文件管理的功能。
然后,第二步,当我们双击QQ.exe的时候,这个程序就可以开始正常的运行。那,在这个地方我们需要补充的一个知识点,跨考的同学可能不知道的是,我们的一个程序在执行之前,其实是需要把这个程序的数据放到内存里的。所以,在我们双击打开QQ.exe的时候,其实在背后,操作系统帮我们做了一个很重要的事情,就是把这个程序的数据从我们的磁盘放入了内存当中。并且,这些数据要放到内存中的适当位置,这些其实都是操作系统在帮我们完成的。所以,这一步就涉及到了操作系统它所要提供的第二个功能,叫做存储器管理或者叫存储管理、内存管理。
在当QQ程序运行的过程当中,其实是需要被处理机,也就是CPU进行处理的。而什么时候给QQ程序分配处理机资源,这个事情是操作系统在背后替我们完成的。因此,这就涉及到了第三个功能,叫做处理机管理。
第四步,我们开始使用QQ程序和朋友视频聊天。在视频聊天的过程当中,肯定需要把摄像头这个设备分配给QQ程序使用。因此,像摄像头这一类设备资源也是要由操作系统替我们管理,由操作系统来决定应该要把这些设备分配给哪个程序使用。所以,这就涉及到了操作系统要提供的第四个功能,叫做设备管理。
我们王道书的第二章讲的其实就是处理机管理,而第三章讲的是存储器管理,第四章讲的是文件管理,第五章讲的是设备管理。所以,其实操作系统这门课,在后期我们要重点学习的就是,它作为系统资源的管理者,要如何设计和实现这些功能。对于各个部分的理解,大家会随着之后的学习不断深入,这就暂且不展开。在这个地方,大家只需要建立这样一个全局观,就可以好的。
那么,这是第一部分:操作系统,它作为系统资源的管理者,所需要实现的一些事情。
2、向用户提供服务
第二部分,我们来看一下操作系统,他要向上层提供方便易用的服务,这是什么意思呢?
通过刚才分析,我们知道计算机的最底层其实是裸机,也就是纯硬件。那,最底层的这些硬件,其实他只能听得懂二进制指令,也就是机器语言。也就是说,如果我们要直接和这些硬件打交道的话,那我们只能通过这种二进制的语言和这些硬件进行交互。所以,我们说最底层的这些硬件,他对外暴露的其实是一些丑陋的、不友好的交互接口。正常的人类很难和这些纯硬件直接来打交道。
但是,在硬件之上安装的操作系统,其实会向它的上层提供一种更美丽、更友好的交互接口。在安装了操作系统之后,我们的用户和应用程序不需要直接和硬件打交道。我们只需要告诉操作系统我们想要得到的服务,就可以。而操作系统会把用户的这些命令需求翻译成二进制,来告诉硬件,然后由硬件来执行我们想要的这些操作。那,这其实是一个很典型的封装的思想。操作系统把一些丑陋的硬件功能,把它封装成了一些简单易用的服务,使用户能够更方便的使用计算机。
上层的用户不需要再关心底层的硬件细节,而只需要用这种更简单的方式,对操作系统发出命令就可以。剩下的,操作系统会替我们来完成。其实,这种封装思想,在我们日常生活中也经常被使用。比如说,我们的汽车如果把它拆解了的话,会发现它里面有很多很多很复杂的一些构件。但是,我们的汽车设计师们会把这些底层复杂的这些构件,把它呃隐藏起来,把它封装成一个我们简单易用的接口,对用户暴露出的就只有方向盘、刹车、油门这些。用户能够理解的简单易用的接口。但是,用户不需要再关心它底层到底是怎么实现转向、加速、减速这些功能的。
所以,其实操作系统做的事情,本质上和这种封装没有任何的区别。
2.1图形化用户接口
那,接下来我们来看一下操作系统屏蔽了底层硬件细节之后,它对上层提供了哪些方便应用的服务呢?
首先,来看一个我们最熟悉的操作系统提供的服务,叫做GUI,又叫图形化用户接口。我们用户可以使用这些形象的图形界面来对我们的整个系统进行操作。比如说,在Windows操作系统当中,如果我们要删除一个文件的话,只需要把文件拖拽到那个回收站即可。这种操作方式对于我们用户来说是很形象、很容易理解的。但是,在我们这样一个简单的拖拽动作之后,操作系统其实在背后为我们做了很多很多的事情。
现代的操作系统一般都会对我们的上层用户提供这种图形化的用户接口。不过,一些早期的操作系统其实是并没有这种图形化的界面的。
2.2联机命令接口
那,早期的操作系统都是让用户通过命令接口的方式和操作系统进行交互,也就是用命令行的方式和操作系统进行交互。那,命令接口又分为两种:一种是联机命令接口,一种是脱机命令接口。
我们先来看第一种联机命令接口,它又叫交互式的命令接口。我们来看一个直观的例子。如果使用的是Windows操作系统的话,我们可以用这样的方式来打开命令解释器,也就是我们平时经常会看到的这个小黑框。然后,我们可以在这个命令解释器当中输入一个命令,叫做time。那,输入了time这个命令之后,操作系统会告诉我们当前的时间是几点几分。接下来,操作系统又会让用户输入一个新的时间,也就是说,你想把系统时间调到几点几分几秒。那,像这个time命令就是一个很典型的交互式的命令,也就是我们用户说一句,然后系统会跟着做一句,接下来用户需要再说一句,然后系统才会跟着再做一句。整个过程中,我们用户和操作系统是在不断的交互的。
除了time命令之外,还有很多别的用于和操作系统交互的这种命令。由这些命令组成了所谓的交互式的命令接口,或者叫联机命令接口。
2.3脱机命令接口
那,第二种命令接口叫做脱机命令接口,又叫批处理命令接口。还是以Windows操作系统为例,我们可以在C盘当中搜索一个以.BAT作为后缀的一个文件,然后随便打开其中的一个文件,可以看到里面有密密麻麻的一系列的命令。但是,别看它复杂,其实它本质上和我们刚才所看到的time命令没有任何区别。我们只不过是把这一系列的命令,把它罗列在了这样的一个清单里。然后,当我们执行这个.BAT文件的时候,操作系统其实就是根据这个文件当中的这些命令,一条一条地往后执行。也就说,我们使用这种批处理命令接口,或者叫脱机命令接口,和操作系统进行交互的话,那么我们其实是一次提出一堆的请求,然后操作系统会根据我们的指示,一条一条地执行这一堆的请求。所以,这也是为什么这种命令接口称作为批处理命令接口的原因。
那,这就是操作系统对上层提供的两种命令接口。
2.4程序接口
刚才我们提到的3种接口,GUI、联机命令接口和脱机命令接口,都是可以让普通用户直接使用的。那么,操作系统还有一种对外提供的接口叫做程序接口,这种接口是给程序员使用的。我们可以在我们编写的程序中,通过系统调用的方式来使用程序接口。注意,普通用户是不能直接使用程序接口的,我们只能通过编写程序代码的方式,来间接地使用这个程序接口。
让我们用一个例子来帮助大家加深理解,什么叫系统调用,什么叫程序接口。在我们写C语言的"Hello, World!"程序的时候,我们会使用到
printf
这个函数。然后,在执行这个程序的时候,会在我们的电脑屏幕上打印出"Hello, World!"这两个单词。虽然我们只是简单的调用了printf
函数,但是其实这个函数在底层实现的时候,肯定是使用到了操作系统提供的和显示相关的那些系统调用的功能。也就是说,我们普通程序员其实使用了C语言提供的库函数,也就是printf
这个函数。而这个库函数在底层实现的时候,其实是使用了操作系统提供的系统调用的功能。操作系统在收到这个系统调用相关的请求之后,才会替我们去操作这个硬件,也就是显示器,并且在这个显示器上面显示出"Hello, World!"这两个单词。所以,其实这个系统调用很类似于我们很熟悉的这种函数调用。很多操作系统当中都提供了上百种的系统调用,由这些系统调用组成了所谓的程序接口。我们的应用程序请求操作系统服务的唯一方式,就是通过系统调用的方式。那这个地方有一个小细节,有的教材当中系统调用又会被称为广义指令。所以,这个术语大家也稍微注意一下。好了,这个部分我们讲了。
操作系统向上层提供了很多方便易用的服务。有的接口是直接给用户使用的,比如说GUI和命令接口。而有的接口是给软件或者说给程序员使用的,比如说程序接口。讲到这里,我们就可以理解为什么用户和操作系统中间有一段相接的部分了。因为用户通过这些方式可以直接地和操作系统进行交互,而应用程序则需要通过系统调用的方式,也就是通过程序接口,来和操作系统进行交互。
连接命令接口和脱机命令接口的区别,大家也需要注意。有可能在选择题当中进行考察。连接命令接口或者叫交互式命令接口是使用户说一句,系统做一句的交互方式。而拖机命令接口或者叫p处理命令接口是用户说一对,然后系统跟着做一对的交互方式。
另外,在有些教材当中,会把命令接口和程序接口啊统称为用户接口。也就是说,狭义的用户接口其实不包含GUI。这点大家稍微注意一下。接下来我们来看这个小节的内容。
3、对硬件机器的拓展
当然可以!以下是你提供的文本的标点符号补全:
最后一个内容,操作系统,它作为最接近硬件的这个层次,所需要做的事情就是要实现对硬件机器的拓展。如果一个计算机当中没有任何的软件支持,那这种计算机就称之为裸机。而如果我们在裸机上安装了操作系统的话,就可以把裸机改造成功能更强、使用更方便的机器。我们会把覆盖的软件的这种机器称为拓充机器或者称为虚拟机。当然,这些只是一些无关紧要的概念,对于我们来说更重要的事情是要理解为什么说操作系统可以实现对硬件机器的拓展。
为了理解这个特点,我们还是用刚才汽车的例子来进行类比。比如说,我们汽车当中原本只有一些啊零碎的一些硬件,比如发动机,其实它只有一个功能就是会转,然后轮胎它也只有一个功能就是会滚。但是,如果我们在这种原始的硬件机器上再覆盖上一层传动系统的话,我们就可以让发动机来带动着轮子来转。这样的话,我们的汽车就可以开始往前行走了。所以增加了这样的一个系统之后,我们以前的这些呃简单的硬件机器就得到了一种功能上的拓展。而我们的操作系统对硬件机器的拓展也是类似的。操作系统把CPU、内存等等这一系列的硬件合理的组织起来,并且让这些硬件能够相互协调,配合着工作。这样的话,这些简单的硬件就可以呃组合起来实现更多更复杂的功能。所以说操作系统它实现了对这些硬件机器功能的一个拓展,使这些单纯的硬件功能更强,使用更方便。
三、总结
当中,我们用了很多例子帮助大家感性地认识了什么是操作系统。操作系统需要实现一些什么样的功能?那操作系统这门课最关注的是,他作为系统资源的管理者,所需要实现的这些功能。这些功能应该怎么实现,怎么设计?这是我们之后的课程当中会重点、会详细讲解的。
而这个小节当中,有可能会作为选择题进行考察的是:操作系统他对上层提供了哪些服务?大家要理解什么是 GUI,什么是命令接口?连接命令接口和脱机命令接口的区别是什么?另外,由一系列的系统调用组成了程序接口。系统调用这个概念会在后面专门用一个小节再进行更进一步的分析和讲解。
好的,那么以上就是这个小节的全部内容。
No.2 操作系统的特征
各位同学,大家好。
在这个小节当中,我们会学习操作系统的四个特征:并发、共享、虚拟和异步这四个基本的特征。其中,并发和共享是两个最基本的特征,二者互为存在条件。我们会按照这样的顺序为大家依次讲解,并且会解释为什么这两个,呃,这两个是最基本的特征,并且二者互为存在条件。
一、并发
首先,我们来看…看一下并发这个特征。
并发是指两个或者多个事件在同一时间间隔内发生,这些事件宏观上看是同时发生的,微观上其实是交替发生的。与这个并发概念比较容易混淆的是并行的概念。并行是指两个或者多个事件在同一时刻同时发生。这个对于跨考的同学来说,可能呃会不太容易理解。
那么我们用一个例子来进行说明。假设有这样两个人,一个是小渣,一个是老渣,他们都有两个女朋友,然后有两个任务,都是分别是和1号约和2号约。那么对于小扎来说,他采用了一种翠绿翠绿的约会方式,就是和1号2号一起约会,而老渣采用了一种更绿的呃,约会方式,就是在各个时间段内,他交替的和两个女朋友进行约会。
那么对于小渣的这种方式来说,他其实采用的就是并行约会的策略。并行的意思是指两个或者多个事件在同一时刻同时发生,也就是说对于小扎来说,他在同一时刻,他其实是同时在进行着两个约会任务。而对于老扎来说,他采用的是并发约会的这种方式,在宏观上看,这一整天,老扎进行了两个约会任务,但是在微观上看,任何一个时刻,老扎其实只在执行其中的某一个约会任务。
所以,这就是所谓的微观上交替发生,而宏观上同时发生的并发的这种特征。那么经过这个例子,相信大家对并发和并行已经有了直观的理解。
那在了解了并发和并行的区别之后,我们再来看一下什么是操作系统的并发性。
操作系统的并发性指的是,在计算机当中同时运行着多个程序。这些程序宏观上看,它们是同时运行着的,但是微观上看其实是交替运行的。接下来我们再来看一下,为什么并发性对于操作系统来说是一个很重要的基本特性。
其实我们的操作系统,它就是伴随着多道程序技术出现的,这个我们会在下个小节操作系统的发展历史当中会有进一步的介绍。总之,操作系统的出现就是为了支持多道程序并发运行同时运行而诞生的。
那我们需要注意一个很重要的考点,对于一个单核CPU来说,同一时刻呃只能执行一个程序,因此一个单核CPU的系统当中各个程序肯定是只能并发的执行。但是对于多核CPU来说,同一时刻可以同时执行多个程序,也就是说多个程序可以并行的执行。
举个例子,我们的英特尔第八代I3处理器,它就是一种四核的CPU。这个大家可以上网去搜一下。四核CPU就意味着它可以并行的执行四个程序。比如说在这个CPU上,我们可以同时并行的运行啊,微信、QQ、Word还有Chrome这四个程序。但是如果此时有第五个程序也想同时运行,比如说我们想同时在听歌的话,那么我们就必须剥夺其中的某一个程序,他对呃CPU的使用权。比如说我们把Word这个程序给换下CPU,然后让QQ这个程序上CPU运行,然后Word和QQ这两个程序,嗯,交替着来使用CPU。总之对于4核CPU来说,同一时刻只能同时执行4个程序,而如果要有超过4个以上的程序同时运行的话,那么并发性依然是必不可少的。
所以不管是早期的操作系统还是现代的操作系统,并发性都是操作系统一个很重要的最基本的特性。
二、共享
那么,再来看第二个共享特性
共享也就是资源共享,是指系统当中的资源可以供内存当中的多个并发执行的进程共同使用。资源共享可以分为两种共享方式,一个是互斥共享,一个是同时共享。对于互斥来说,是指在一个时间段内,这个资源只允许一个进程来使用。而同时共享是指在一个时间段内,他允许多个进程同时对这个资源进行访问。这个地方所谓的"同时"为什么要打双引号呢?因为它往往是在宏观上同时,而在微观上可能是交替的对这个资源进行访问的。这个在这个地方宏观和微观,刚才理解了并发和并行之后,这大家应该就已经可以理解了。那么,直接来看一个例子。对于互斥共享方式来说,我们比如说我们使用QQ和微信视频聊天,但是在同一时间段呢,我们只会允许摄像头给其中的一个进程使用。比如你用QQ和你的家人正在进行聊天,那么这个时候你还想用电脑的微信和你的小伙伴进行视频聊天的话,你就会发现这个视频是发不出去的,因为它会提示你说这个摄像头正在已经被分配给其他的进程。所以这就是所谓的互斥共享方式,在一个时间段内,摄像头这个资源他只能被分配给其中的一个进程使用。
再来看第二个例子,同时共享方式。我们可能会遇到这样的情况,我们用QQ给某人发送文件A,然后用微信发送文件B。在宏观上看来,微信和QQ的这个文件发送的进度条都是一直在推进的,往前推进的。所以在用户宏观上看来,看起来两边都是在同时读取发送文件。这些文件它是被放在硬盘里的,那么在用户看来,就看起来就像是QQ和微信这两个进程都在同时访问硬盘这个资源,从中读取各自的文件数据。但事实上,微观上来看,这两个进程他们是交替的访问硬盘的,QQ先读出了文件A的某一个部分,然后微信又读出文件B的某一部分,接下来又交替着让QQ读文件A的下一部分,然后以此交替的访问这个硬盘。所以这就是所谓的微观上交替的访问这个硬盘资源的意思。所以这就是两个很典型的互斥共享和同时共享的例子。有的时候这个同时共享也有可能是微观上也确实在同时的共享这个资源,比如说你在玩游戏的时候一边听歌,那么你会发现你的扬声器这个声音输出设备一边在播放游戏的音效,同时还在播放音乐。所以在这种情况下,扬声器这个声音输出设备是真的在微观上也是同时正在被你的音乐播放器和游戏这两个进程同时使用的。所以这个地方稍微注意一下。
那么我们再来…
看一下并发和共享的关系。继续通过上面的例子来分析,用QQ发送文件A,微信发送文件B,那么就说明QQ和微信两个进程实际上是在并发的执行的,也就是有并发性。那么这两个进程需要同时完成这个发送文件的事情,所以他们需要共享地访问硬盘资源,这又体现了共享特性。如果我们的系统失去了并发性,就意味着在系统当中同一时间段只能有一个程序正在运行,那么也就意味着这两个进程就不需要同时共享来访问这个硬盘资源,这个共享性也就失去了存在的意义。
而另一个角度来看,如果系统失去了共享性,那么QQ和微信这两个进程就没办法同时访问这个硬盘资源,所以他们也没办法完成同时发送文件这件事。既然如此,QQ和微信也就没办法并发地执行。所以我们可以看到,如果失去了并发性,那么共享性就失去了存在的意义。而如果失去了共享性,那么并发性就不可能被实现。所以并发和共享,我们才说他们是互为存在条件的。这就是开篇提到的一个知识点。
三、虚拟
好的,下面再看第3个特征:虚拟…,把物理上的实体对应为若干个逻辑上的对应物。这个可能对于跨考的同学来说,也不太容易理解。我们直接来看一个实际的例子吧。呃,我们知道在一个程序需要执行的时候,需要把它放入到内存,并且给它分批分配 CPU 才能执行啊。这是一个我特别喜欢的游戏 GTA,然后这个游戏官方的数据是说它需要 4G 的运行内存。然后除了这个游戏之外,其实我的电脑当中还有各种各样的别的一些应用软件、程序。那么,我的电脑其实只有 4GB 的内存,但是实际上在我的电脑上,我可以同时打开 GTA、QQ,还可以用微信、迅雷、雷迅雷,同时还在用网易云音乐在听音乐。所以看起来这么多的应用软件,它们总共需要的内存量实际上是远大于 4GB 的。但为什么它们又可以在我的电脑上同时运行呢?其实这就是采用了虚拟存储器技术。实际上,这台电脑只有 4GB 的内存,也就是物理上的实体是 4GB 的内存。但是在用户看来,在我看来,它变成了逻辑上的对应物,它看起来是远远大于 4GB 的。所以这就是虚拟的特性,虚拟技术的一个例子。这个虚拟存储器技术,它其实就是虚拟技术当中的空分复用技术啊。这个地方,大家只需要对虚拟存储器和空分复用技术能有一个印象就可以了。这两个知识点是第三章会重点讲解的。那么再看另外一个例子,在一个单核计算机下面,用户可以打开 QQ,可以打开迅雷,呃,不说了。那么既然这个电脑只有一个单核的 CPU,既然如此,这个计算机当中为什么还可以同时执行这么多的程序呢?其实这就是用到了虚拟处理器的技术。实际上只有一个单核的 CPU,这是物理上的实体。但是在用户看来,在我看来,这个计算机似乎变成了 6 个 CPU 在同时为自己服务。这就是所谓的逻辑上的实体。那么虚拟处理器技术就是典型的虚拟技术。在微观上看,一个整个大的时间段被分割为了一个一个微小的时间片,然后在各个时间段内,处理机是交替的为各个进程服务的。所以这就是虚拟技术的意思,他把一个大的时间段分为了各个很小的时间片,所以这是虚拟技术的一个典型的应用。再来回顾一下。
我们刚才讲了实现虚拟性的啊,这个虚拟技术分为空分复用技术和十分复用技术。然后很显然,我们如果说这个系统当中是这个操作系统失去了并发性,那么就意味着一个时间段呢只需要有一道程序在执行。那么从刚才我们分析的过程中可以看到,如果没有了并发性,那么这个十分复用技术和空分复用技术其实也没有存在的意义。那么我们也就是说,我们这个虚拟性也就没必要实现了。所以可以说没有并发性就谈不上虚拟性,虚拟性就没有存在的意义。最后,再来看第四个特性。
四、异步
一步行一步是指多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停的,以不可预知的速度向前推进。用一个例子来帮助大家理解什么是一步。假设老渣现在要和两个女孩并发的约会,然后1号女孩会让老渣干这样的两件事,首先是陪她吃饭,第二个是把心给她。2号女孩会让老渣先把心给她,然后再让老渣陪她吃饭。所以老渣在执行1号的这两条指令的过程实际上就相当于是在执行第一道程序,而执行2号女孩这两条指令的过程实际上就相当于在执行第二道程序。这两道程序需要并发的执行。
另外,老渣只有一颗真心,所以老渣的心相当于这里提到的有限的系统资源。由于这两道程序在系统中是并发运行的,因此这两道程序有可能会争抢着使用这个资源。因此,老渣在执行这两道程序的时候,有可能是这样的情况:刚开始他是和1号约,也就是执行了1号的第一条指令,陪她吃饭。接下来的这个时间段也是和1号约,执行了他的第二个指令。根据1号的这个要求,老渣会把心给1号,也就是说这个系统资源分配给了1号。然后接下来的这个时间段是要和2号约。根据2号的指令,她要求老渣把心给她。但是由于此时老渣的心这个有限的系统资源是被1号所占有的,并且1号没有把这个系统资源归还给老渣,所以2号要求老渣把心给她的请求就不能够被满足。因此,2号程序运行到这个地方的时候肯定需要被阻塞,需要先停一段时间,等她获得了她想要的这个资源之后,2号程序才可以接着往下执行。
另一种情况是,老渣还有可能是这样的情况:他刚开始有可能是和1号约,然后陪1号吃饭。接下来的这个时间段是和2号约,根据2号的指令,他把心给了2号。然后再接下来他又和1号约,也就是说此时他要执行1号的第二条指令,1号让老渣把心给她。但是由于此时这个有限的系统资源是被2号所占有的,并且2号没有归还给系统,因此1号的这个把心给她的请求不能够被满足。所以这个第一道程序的执行在这个位置就会被阻塞,然后等待这个系统资源的分配。
所以从这个例子当中,我们很直观地可以看到,在两道程序并发运行的过程当中,这些并发运行的程序都会争抢着使用系统当中的这些资源,所以这些程序的运行并不是一贯到底,而是走走停停,以不可预知的速度向前推进的。有的时候,有可能是2号需要停下来等待,有的时候,有可能是1号需要停下来等待。在实际的操作系统当中,各个并发运行的程序之间也会出现这种争抢着使用有限的系统资源的情况,比如说两个程序争抢着使用摄像头资源或者争抢着使用打印机资源等等。所以这是多道程序环境下
多个程序并发执行所带来的一个特性,也就是所谓的异步型。很显然,如果失去了并发性的话,就意味着系统只能依次执行各个程序,也就是说第一道程序执行完了,然后1号把老渣的心归还给老渣之后,系统才会接着执行第二道程序。在这种情况下,各个程序的执行肯定是会一贯到底的,不会走走停停。所以说只有系统拥有并发性,才有可能会导致我们之前所说的这个异步性。
好的,以上就是关于一步行一步特性的讲解。如果你有任何疑问,欢迎继续问我。
五、总结
非常好,你已经对操作系统的四个基本特性进行了很好的总结。你理解了并发、共享、虚拟和异步这四个特性之间的相互关系,以及它们在操作系统中的重要性。
在考试中,确实重点关注并发和共享的概念,因为它们是操作系统最基本的特性之一,同时也是其他特性的基础。你也明确指出了如果失去了并发和共享,虚拟和异步这两个特性就没有存在的意义,这表明你对这些概念有很好的理解。
如果你在后续学习中有任何问题,都可以随时向我提问。加油!
No.3 操作系统的发展与分类
在这个小节中我们会学习操作系统的发展历史和分类,那我们会按照各种类型的操作系统出现的时间顺序啊,来依次进行讲解。那在这个小节当中,重点会考察的是绿框部分的这些内容。所以,我们会重点讲解绿框部分。在学习的过程当中,大家需要重点关注和理解的是各类型的操作系统,他们主要想解决的是什么问题。然后要稍微关注一下他们各自的优缺点。这个有可能在选择题当中进行考察。
一、手工操作阶段
当然可以,下面是你提供的文本内容的标点符号补全版本:
照各种类型的操作系统出现的时间顺序啊,来依次进行讲解。那在这个小节当中,重点会考察的是绿框部分的这些内容。所以,我们会重点讲解绿框部分。在学习的过程当中,大家需要重点关注和理解的是各类型的操作系统,他们主要想解决的是什么问题。然后要稍微关注一下他们各自的优缺点。这个有可能在选择题当中进行考察。
接下来是关于第一个阶段的手工操作阶段的讲解。在这个阶段其实啊,操作系统还并没有诞生。程序员写程序是要写在这样的纸袋上的。可以看到这个纸袋上有一些小孔,那么有孔的地方代表的是二进制的一,没孔的地方代表的是二进制的0。所以,程序员通过在纸袋上打孔这样的方式,啊,写好了自己的程序。然后把自己的这个程序放到纸袋机上。然后,计算机从纸袋机当中读取啊,我们要运行的程序。等程序运行结束了之后,又把程序运行的结果再给输出到纸袋机上,之后再由程序员从纸袋机取走自己程序运行的结果。
但是用手工操作的这种方式存在一个呃很明显的问题,就是程序员用手工的方式把纸袋装到纸袋机,或者从纸袋机取走自己的呃,这个程序运行结果的过程,其实是超级慢的。所以假设一个程序员此时要提交一个自己的作业,提交一个自己的程序让他运行的话,那么首先,程序员需要花很长的时间把自己的程序放到纸袋机上。之后,计算机需要把纸袋机上的这个程序数据给读到计算机里。而这个读取的过程也是一个很慢速的过程,也需要消耗不短的时间。但是计算机的计算速度,处理程序的速度是非常快的,所以其实计算机在计算的时候只需要花很短的时间就可以把这个程序运行结束了。
那当程序运行完了之后,他又同样需要花比较长的时间把程序运行的结果输出到纸袋机上,之后程序员再把纸袋机上的结果再给用手工的方式取走。等第一个程序员把自己的呃,运行结果取走之后,才能由第二个程序员来接着使用计算机。那同样的,他首先需要把自己的程序放到纸袋机上,需要花很长的过程。接下来又从纸袋机读到计算机内,这也需要花不少的时间。但是同样的,计算机处理这个程序其实只需要花很短的时间。
所以可以看到在手工操作阶段存在的主要的缺点就是用户独占拳击。在第一个程序员在自己的程序啊没有完全运行结束之前,是不允许第二个程序员和他同时使用计算机的。所以当他使用计算机的时候就是独占着使用。第二个很明显的缺点是,由于手工操作是一个很慢的过程,但是计算机计算又是很快的一个过程,因此这样的人机速度矛盾会导致啊资源的利用率极低。特别是计算机CPU的利用率极低。我们可以看到在这么长的一段时间内,其实CPU或者说计算机真正在忙碌在工作的时间只有这样一小段和这样一小段有很大的比例。这个计算机是处于空闲的状态的。但是在这个阶段,其实计算机的造价十分昂贵。所以让计算机这种昂贵的资源有大量时间处于空闲状态,那显然是一种很不经济很低效的一种方式。
因此,为了解决这个问题…
二、单道批处理系统
当然,下面是你提供的文本内容的标点符号补全版本:
人们发明了单道劈除处理系统。嗯,在这个阶段,人们引入了磁带输入输出技术。各个程序员可以把自己的程序都依次放到纸袋机上,然后会有一个叫做外围机,或者叫外围控制机的一个呃,专门的机器控制着,把这些纸袋机里的程序数据先把它放到呃磁带上。之后,计算机可以直接从这个磁带里读取这些程序的数据,而磁带的读写速度要比纸带机快很多。此时的计算机当中会运行着一个叫做监督程序的程序。由这个监督程序控制着,自动的从这些磁带当中输入输出作业的数据,而从磁带中输入输出作业其实是速度是要更快的。所以,引入了这种磁带输入输出技术之后,我们读取一个作业所需要花的时间比例就小了很多了。
这个监督程序会控制着计算机自动的从磁带当中读入啊,第一个作业。这个读入的过程要比从纸袋机读入要快很多。接下来会进行程序的运算,再接下来进行输出输出到这个磁带上。等第一个作业完成之后,就可以开始紧接着读入第二个作业,然后计算再输出。那以此类推,可以看到,在引入了磁带输入输出技术之后,这个作业的输入输出过程所需要占的时间比例其实是降低了很多的。
这样的话,就可以让CPU有更高比例的时间处于计算处于忙碌的状态,这就使CPU的资源利用率有一定的提升,缓解了一定程度上的人机速度矛盾。但是这种方式很显然,他的资源利用率依然是不够高的,内存中同一时刻只能有一道程序运行。只有这个程序运行结束,并且输出完成之后,才可以继续读入第二个程序,也就说各个程序之间,他们是串行着执行的。
所以虽然比起上一个阶段,CPU利用率有所提升,但是这种方式依然会使CPU有大量的时间是在空闲等待的状态,资源利用率依然是很低的。因此,为了解决这个问题,人们就发明了多道处理系统。
三、多道批处理系统
当一个用户把自己的作业提交了之后,接下来用户就只能干等着计算机把自己的作业处理完成。也就说,在多道批处理系统当中,用户是无法调试自己的程序的,也不可能在程序运行的过程中输入一些参数,这些事情都是无法实现的。所以,为了实现人机交互的功能,人们逐渐开始思考如何改进操作系统,使用户能够更灵活地使用计算机资源,同时也能够方便地与计算机进行交互。
这就引出了下一个阶段,即交互式操作系统。交互式操作系统允许用户通过终端设备(如键盘和显示器)与计算机进行实时的交互。用户可以直接在终端上输入指令,操作系统会立即响应并执行相应的操作。这种方式使得用户能够更加灵活地使用计算机资源,能够方便地查看程序运行的中间结果,进行调试和修改。同时,交互式操作系统也提供了更好的用户体验,用户不再需要等待作业完成后才能获得结果,而是可以实时地与计算机进行交互,更好地掌握程序的运行状态。
在交互式操作系统中,操作系统会负责管理多个用户的请求,并且根据优先级和调度算法来分配计算机资源。这种操作系统的引入进一步提高了资源的利用率,使计算机更加高效地工作。而且,用户也能够更好地体验到计算机的实时响应和交互性。
总之,在操作系统的发展历程中,从最早的手工操作阶段,到引入了批处理系统和多道程序技术,再到交互式操作系统的出现,每个阶段都在不断地改进和创新,以适应不同的需求和挑战。不同阶段的操作系统都有其独特的特点和优缺点,这些改进也为我们现代计算机系统的高效运行提供了基础。
四、分时操作系统
当然,下面是你提供的文本经过标点符号补全后的版本:
用发明了分时操作系统。在分时操作系统当中,嗯,计算机会以时间片为单位,轮流的为各个呃用户,或者说各个作业服务。而用户可以通过呃,像键盘啊,鼠标啊,等等这一类的终端,和计算机进行交互。比如说,这个计算机先给这个用户服务50毫秒,再给这个用户50毫秒,这个用户50毫秒。总之,在分时操作系统当中,各个用户可以轮流的得到服务。所以,分时操作系统的主要优点就是,用户的请求可以被及时的响应。有没有发现,我们之前举的老扎约会的例子,其实它就是一个分时操作系统。老扎以时间片为单位,轮流的为各个用户来服务。这样的话,各个用户的请求就可以被及时的响应。因为对于他们俩来说,至少每隔一个小时,肯定能够被老扎服务一次。所以他们的请求最多在一个小时之内,肯定可以被老扎响应。所以这种分时操作系统,使人机交互的问题得到了解决。并且允许多个用户同时使用一台计算机。他们对这个计算机的操作都是相互独立的。他们还感受不到别人的存在。在用户看来,似乎就像是自己独占拳击一样。那分时操作系统也存在一个明显的缺点,那就是他不能优先处理一些紧急的任务。这种操作系统对各个用户都是完全公平的。所以,为了能够让计算机优先的处理一些紧急任务,人们又提出了啊实施操作系统。
五、实时操作系统
实时操作系统能够根据任务的优先级来优先的响应一些紧急任务。这种操作系统要求计算机在接收到一些紧急的信号之后,需要进行及时的处理,并且要在严格的时间限制内完成处理,保证处理结果的正确性。因此,这种操作系统的主要特点是即时性和可靠性。
而实时操作系统又分为硬实时和软实时操作系统。比如像导弹控制系统、自动驾驶系统等,这类系统必须严格在规定的时间内完成相应的处理,否则会导致严重的问题,比如导弹偏航或自动驾驶汽车直接开进马路下面等等。
另一种软实时操作系统则像我们熟悉的12306火车订票系统。这个系统要求网站上需要实时地显示剩余的票数,但即使偶尔更新不及时,也不会产生严重后果。
所以,这种是软实时系统。除了刚才介绍的操作系统,还有一些其他类型的操作系统。
六、其它操作系统
网络操作系统、分布式操作系统和个人计算机操作系统等,大家只需要有一个简单的了解,自己阅读一下就可以。在我们的考试当中,一般会考察的是之前提到的那几种操作系统,所以这些就不再展开。好的,那么这个就是关于操作系统发展历史和分类的内容了。如果你还有其他问题,欢迎继续提问!
七、总结
非常好!你对操作系统的发展历史和分类进行了很详细的介绍,强调了各种操作系统类型的特点、优点和缺点,以及它们解决的问题和采用的方式。记得在复习时,重点理解各种操作系统的核心概念和特点,以及它们在解决不同问题方面的应用。
No.4 操作系统的运行机制
各位同学,大家好。
在这个小节中,我们会学习操作系统的运行机制,也就是说,操作系统在计算机上是怎么运行的。这样一个问题,那这个小节中会涉及到这样的一些概念。我们会学习到两种类型的指令,然后两种处理机状态和两种程序,他们其实都是一一对应的。那具体我们会一层一层慢慢讲解,根据…
一、两种程序
各位同学,大家好。
在这个小节中,我们会学习操作系统的运行机制,也就是说,操作系统在计算机上是怎么运行的。这样一个问题,那这个小节中会涉及到这样的一些概念。我们会学习到两种类型的指令,然后两种处理机状态和两种程序,他们其实都是一一对应的。那具体我们会一层一层慢慢讲解,根据去年同学的反馈,很多跨考的同学认为这个小节是很难理解的。有时候会涉及到一些底层硬件的知识。除了跨考的同学之外,也有不少同学所报考的学校不考计算机组成原理这门课。所以在这个小节当中,我们必须要准备一些预备的知识,好让大家能够理解之后所讲解的内容。
首先,我们要来解释一下程序在计算机硬件上底层是怎么运行的。其实像我们平时用 C 语言代码写的那些程序,都会经过编译器进行一个编译的工作,把这个 C 语言代码翻译成计算机能够听得懂的二进制代码,也就是机器指令。像我们平时用 C 语言这种高级语言写的一段代码,经过编译翻译之后可能会对应很多很多条机器指令。比如说,我们定义了一个 int 型的变量 x 等于一,并且对 x 进行了加加,也就是加一的操作。那么这样两行短短的代码,可能经过编译之后,形成的机器指令就会对应这么多条。当然,这个地方我也是随便胡乱写的,因为都是二进制数嘛,反正我们都看不懂。但是虽然我们看不懂这些二进制数,但是对于 CPU 对于计算机来说,这样的二进制代码才是它能够看得懂的一种语言。所以,我们这一段程序运行的过程,其实就是 CPU 把这些机器指令一条一条地执行的一个过程。而这些机器指令在背后实现的,其实就是我们用代码表示的这小段逻辑,只不过这种二进制的机器指令是 CPU 能看懂但是我们看不懂的。所以,这个地方所提到的所谓的机器指令,其实就是让处理器,也就是 CPU,能够识别并且执行的最基本的一个命令,比如说进行一个加法操作或者进行一个复制的操作等等。
那根据去年同学们的反馈,这个地方所谓的指令的概念比较容易和另一个概念进行混淆。很多同学在以前会习惯把 Linux、Windows 等等这种小黑框里输入的这种 LSCD 等等这样的命令称作为指令。但是其实这个小黑框里所用的这个命令,其实是我们之前提到过的交互式命令接口,它和我们这个小节所讲的指令是不一样的。我们这指的指令是指二进制的机器指令。所以大家需要对接下来所提到的指令进行一个区分。
总之,我们平时用高级语言编写的这种程序,最后执行的时候,肯定是需要变成 CPU 能够读得懂的,用二进制的机器指令表现的这种形式。那么这就是程序运行的一个基本原理。在操作系统这门课当中,我们需要注意区分两种类型的程序,一种叫内核程序,一种叫应用程序。所谓的应用程序,就是跑在操作系统之上的,我们平时很熟悉很喜欢用的那些,比如说 QQ、微信等等等等。而像我们普通程序员写的程序,其实就是应用程序,是跑在操作系统之上的。但是还有一些人,比如说像微软、苹果,会有一帮人是负责开发操作系统的,这帮人写的那些程序,就是所谓的操作系统的内核程序。这帮人编写了很多很多的内核程序,这些内核程序最终组成了所谓的操作系统的内核,英文叫 kernel。这个内核就是操作系统最核心的部分,也是最接近硬件的部分。我们之前提到过,操作系统最重要的一个角色是他要作为系统资源的管理者,而操作系统对系统资源的管理工作其实就是在内核部分来实现的。我们甚至可以说,一个操作系统只要有内核就可以了,比如说,有的同学也许会接触过容器技术,比如说 Docker,在 Docker 容器里只需要有 Linux 的内核,其实就可以实现 Linux 的所有的功能了。而我们用户平时使用的操作系统,其实它包含的不只是内核的功能,比如说图形化的用户
界面就不是放在内核当中实现的。即使没有图形化的用户界面,我们依然可以用命令行,也就是之前所提到的小黑框的那种方式来使用操作系统。
所以,操作系统的内核当中所包含的只是操作系统当中最重要、最核心、最必不可少的那些功能。那既然操…
二、两种指令
操作系统内核它是系统资源的管理者。作为这样一个角色,有时候就有可能会让 CPU 执行一些比较特殊的指令,比如说内存清零的指令。这种指令会对其他程序的运行造成很严重的影响。像这样的特权指令,运行之后是有可能影响到其他程序的正常运行的。所以这样的特权指令就应该只允许我们系统的管理者,也就是操作系统内核来使用。
也就是说,假如这一段程序是内核程序的话,那这些指令当中可以出现特权指令。而假如说这段程序是普通的应用程序的话,那么这其中就不应该包含特权指令,而只能使用非特权的指令,比如说让 CPU 做加减乘除运算的一系列的指令,就是非特权的指令。
我们的 CPU 在设计和生产的时候,就划分了哪些指令是属于特权指令,哪些指令是属于非特权指令。所以,CPU 在拿到一条指令的时候,其实它是可以区分出它到底是特权指令还是非特权指令的。但问题就出现了,CPU 在执行程序的时候,它只会负责把这些指令一条一条地执行。虽然它能够分辨出哪些指令是特权指令,哪些指令是非特权指令,但是它又怎么分辨出此时正在执行的这个指令,它到底是一个应用程序的指令还是一个内核程序的指令呢?
接下来我们要研究的就是这个问题。
三、两种处理器状态
为了让 CPU 能够区分此时正在运行的指令是属于应用程序还是内核程序,CPU 会被划分成两种状态:一种叫内核态,一种叫用户态。当 CPU 处于内核态的时候,说明此时 CPU 正在运行的是内核程序,那在这个时候是可以执行特权指令的。而如果 CPU 处于用户态,那么说明此时 CPU 正在运行的是应用程序,那此时 CPU 就只能执行非特权指令。
那么怎么区分 CPU 到底处于哪种状态呢?在 CPU 当中会有一个寄存器,也就是一个存储数据的地方,叫做程序状态寄存器,英文缩写叫 PSW。然后这个寄存器当中会有一个二进制位。这个二进制位为1的时候,表示 CPU 此时是处于内核态的;而二进制为0的时候,表示 CPU 此时处于用户态。当然,也有一些 CPU 有可能是0表示内核态,1表示用户态,但这个无关紧要,我们只需要知道用二进制的方式就可以实现对 CPU 状态的一个标记。
用户态和内核态还有各自的别名。用户态又可以叫作用户模式,然后内核态又可以叫作管态。这两个术语大家也需要注意一下。
接下来我们要探讨的问题是,CPU 要怎么实现这两种状态之间的切换。我们直接用…
四、状态切换过程
当然,以下是经过标点符号补全后的文本:
一个例子,让大家看一下 CPU 状态切换的一个过程。首先,当我们开机的时候,需要加载我们的操作系统。然后,这个操作系统就需要进行一些初始化的工作。那,那系统初始化的工作,其实就是由操作系统当中的呃某一些内核程序来完成的。所以,在开机的过程当中,需要执行内核程序。因此,在这个时候,CPU 肯定是需要处于内核态,它需要来执行呃系统初始化相关的这一系列的内核程序的呃这些指令。那么,当我们开机完成之后,用户就可以启动某一些应用程序。那,这个应用程序要正常运行的话,肯定需要让 CPU 执行它的这一系列的指令。但是,我们刚才不是说 CPU 此时正在执行的是内核程序吗?而如果说要让他运行这个应用程序的话,怎么实现这个事情呢?那,此时如果操作系统的内核想让这个呃应用程序呃开始运行的话,那么这个内核程序就需要执行一条特权指令。这个特权指令会把 PSW 的标志位从内核态转变为用户态。这样的话,就完成了 CPU 状态的一个切换。接下来,操作系统内核就会让出 CPU 的使用权,让这个应用程序上 CPU 运行。而此时 CPU 已经被切换为用户态了,所以接下来我们的应用程序会在用户态下运行。那,CPU 会执行这个应用程序的一条一条的指令。
那,此时一个小故事发生了。假如说此时有一个猥琐的黑客在这个应用程序当中植入了一条特权指令的话,会发生什么事呢?首先,CPU 在读入这条指令的时候,其实他就已经能够判断这条指令是一条特权指令了。但是,CPU 又检查了自己的 PSW 寄存器,发现自己此时是处于用户态的。这样的话,CPU 就能够知道我此时正在运行的其实是应用程序,而不是内核程序。而一个应用程序竟然他妈想要用一个特权指令,那这个事情坚决不能让他干。所以,这样的一个非法事件会引起一个中断信号。当 CPU 检测到这个中断信号之后,他就会立即强行变态强行变成核心态,并且 CPU 会拒绝执行这一条特权指令。
接下来,CPU 会暂停执行这个应用程序后面的这一系列的指令代码,转而会执行一个处理中断信号的内核程序。接下来,CPU 就在内核态下来执行这个内核程序相应的这一系列的啊指令。所以,其实刚才发生了这个中断信号之后,让操作系统内核又重新夺回了 CPU 的控制权。接下来,操作系统的内核程序会对这个中断进行相应的处理。等处理完了之后,他才会把 CPU 的使用权再重新还给呃应用程序。所以,从这个故事当中,我们就可以很形象地看到,CPU 从内核态切换回用户态是执行了一条修改 PSW 标志位的一个特权指令来完成的。执行了这个特权指令之后,就意味着操作系统内核要主动地让出 CPU 的使用权了。
当 CPU 切换为用户态之后,就可以在 CPU 上运行用户程序。而 CPU 的状态从用户态又切换回内核态是由中断引发的,然后由 CPU 硬件自动地完成这个变态的过程。并且 CPU 变回内核态之后,它会停止运行当前正在运行的应用程序,转而运行一个呃内核程序。所以,说其实触发了一个中断信号就意味着操作系统会强行重新夺回 CPU 的使用权了。那,除了非法使用特权指令之外,还会有别的很多的事件也会触发这个中断
信号。一个共性是,但凡我们需要操作系统来介入开展管理工作的时候,就会触发一个中断信号啊。那,具体有哪些中断,这个我们会在下一个小节当中进行更进一步的学习好的那。
五、总结
当然,以下是经过标点符号补全后的文本:
那么,这个小节当中,我们呃用一个故事来捋清了操作系统的运行机制。我们的 CPU 运行程序的过程其实就是在执行一条一条机器指令的过程。而系统中存在两种程序,一种是内核程序,一种是应用程序。内核程序是整个系统的管理者,所以它需要使用到一些呃特权指令,并且特权指令只有呃内核程序可以使用。那,当 CPU 的状态是内核态的时候,说明此时正在跑的这些指令是属于内核程序的。当 CPU 处于用户态的时候,说明此时他正在跑的是应用程序的啊指令。
那由一系列的内核程序就组成了操作系统的内核,它是整个系统最核心、最接近硬件的部分。那,我们还强调了 CPU 是如何变态的,内核态到用户态的转变是用一条特权指令实现的,而用户态到内核态的转变是由中断引起的,然后由 CPU 硬件自动完成。
那这个小节的内容都是十分重要的,很容易在选择题当中进行考察。那,根据去年同学们的反馈啊,第一次学习的初学者,特别是一些跨考的同学啊,在这个部分是很容易懵逼的。所以今年嗯,也对这个讲解的方式进行了优化,希望能够帮助到大家。不过即使我们第一次学习的时候没有完全理解,其实也没有关系。大家可以放心大胆地往后学。随着之后的学习啊,会对这个部分的内容会有越来越深的理解。这个小节虽然说很重要,但是他一般来说也就考察一个选择题,所以分值也不会占的特别高。大家可以结合我们的教材和课后习题来进行更进一步的巩固。
好的,那么以上就是这个小节的全部内容。
No.5 中断和异常
各位同学,大家好。
在这个小节中,我们会学习中断和异常相关的知识点。那首先,我们会介绍中断的作用,这其实在上一小节当中也有提到过,只不过由于这个内容十分重要,所以啊还是愿意做一个复读机。另外,我们会介绍一下中断有哪些类型,大致上可以分为内中断和外中断两种。内中断又可以称为异常。最后,我们会简单地介绍一下中断这种机制,它实现的一个具体的原理。那首先来看…
一、中断的作用
看下中断的作用。
在上小节中,我们已经学习到了,CPU上面实际上会运行两种类型的程序。一种是操作系统的内核程序,另一种是普通的应用程序。而内核程序充当着整个系统的管理者,它扮演着一个管理者的角色。在计算机刚启动时,运行的肯定是内核程序,只不过在适当的时机,内核程序会主动将CPU的使用权让给应用程序。这个部分涉及到第二章进程管理,我们会在那里具体学习这些内容,暂且不展开。
总之,一旦一个应用程序在CPU上运行,它就会持续运行下去,除非发生了中断。一旦中断发生,CPU会立即停止正在执行的应用程序,转而执行相应的内核程序。因此,中断是让操作系统内核重新夺回CPU使用权的唯一途径。中断会导致CPU从用户态切换为内核态。所以我们可以思考,如果没有中断机制,那么一个应用程序一旦运行在CPU上,它就可能无限期地运行下去。在这种情况下,如何实现多道程序并发呢?因此,没有中断技术,就无法实现多道程序并发,甚至可以说,没有中断技术就没有操作系统。
总之,操作系统内核充当着一个管理者的角色。当它想将CPU使用权交给应用程序时,会自愿使用特权指令完成这个过程。但是当它想要重新夺回CPU的使用权时,也可以通过中断这种方式来实现。结合上一小节中的例子,相信这个概念已经不难理解了。接下来,我们要看的是…
二、中断的类型
中断有哪些种类型呢?一种叫做内中断,另一种叫做外中断。内中断的产生与当前执行的指令有关,中断信号来源于CPU内部。而外中断则恰恰相反,它和当前执行的指令无关,中断信号来源于CPU的外部。
首先,让我们来看几个内中断的例子。
1、内中断
也就是说,这种中断的产生与当前执行的指令有关。举个例子,就像上一小节中提到的情况,一个应用程序在用户态下运行,CPU按照指令顺序逐步处理。但是,如果一个猥琐的黑客试图在应用程序中插入特权指令,CPU读取到这条特权指令时会发现当前处于用户态,正在运行应用程序。这种非法事件会触发一个中断信号,CPU会拒绝执行该特权指令,然后自动切换为内核态,开始执行处理中断信号的内核程序。这样,系统的管理者重新夺回了CPU的控制权。因此,这是一个典型的内中断例子,CPU在执行当前指令时由于该指令引发了中断而被打断。
有时候,即使CPU执行的是非特权指令,也可能会引发内中断。例如,当CPU执行除法指令时,发现除数为0,显然不能继续执行,因此这种情况也会引发内中断。
总之,如果当前执行的指令本身非法,或者指令的某些参数非法,就会产生一个内中断信号。接下来,我们继续看另一个内中断的例子。
当一个应用程序运行在用户态时,有时它希望请求操作系统内核提供一些服务。在这种情况下,应用程序会执行一条特殊的指令,称为陷入指令。这个指令会引发一个内部中断信号,随后CPU会转向这个中断信号对应的处理程序,进行中断信号的处理。因此,当应用程序执行陷入指令时,意味着它主动将CPU的使用权还给操作系统内核,以便操作系统为其提供所需的服务。这就是我们之前提到的系统调用,实际上就是通过这个陷入指令来完成的。
需要强调的一点是,陷入指令是一种特殊的指令,但并不是特权指令。因为我们可以思考一下,这个应用程序是运行在用户态下的吗?既然在用户态下可以执行陷入指令,那么这个指令肯定也不是特权指令。
总之,刚才提到的这个中断信号实际上与当前执行的指令是有关的。这个中断信号是来自于CPU的内部。接下来,我们将看一些更多的例子来进一步理解中断和异常。
2、外中断
外中断的例子
外中断和当前执行的指令无关,这个中断信号来自于CPU的外部。来看第一个例子,叫做时钟中断。这种中断信号是由计算机当中的一个硬件,叫做时钟部件来发出的。这个时间部件会每隔一段时间给CPU发一个中断信号,通过这个时钟中断信号,就可以实现多道程序并发运行了。那我们来看一下这个故事是怎么样的。假设此时系统当中想要并发地运行两个应用程序。首先,应用程序一他运行在用户态,然后CPU会执行他的这些指令。然后,当他执行了两条应用程序一的指令的时候,这个时钟部件发现已经过了50毫秒了,那么他会给CPU发送一个中断信号。注意这个中断信号和当前执行的指令是没有关系的,它来自于CPU的外部。然后,根据我们之前学习到的知识,我们知道当CPU检测到一个中断信号的时候,他会先暂停此时正在运行的应用程序,然后转而执行一个相应的内核程序来处理这个中断信号。
所以接下来,CPU会对这个时钟中断信号进行处理,并且转为内核态。那在内核态下,CPU开始执行这个内核程序来处理刚才收到的中断信号。然后,这个内核程序执行的过程当中发现,应用程序一刚才已经用了50毫秒的时间了,所以接下来为了公平起见,我想让第二个应用程序上CPU运行。于是接下来这个内核程序会把CPU的使用权给第二个应用程序,接下来又切换回用户态,然后第二个应用程序开始上CPU运行。而当第二个应用程序执行了一系列的指令之后,又过了50毫秒,此时这个时钟部件又会给CPU发送一个来自外部的中断信号。那同样的,CPU还是会回去执行和这个中断信号相关的那个处理程序。所以接下来他又会开始执行这个内核程序。
那接下来这个操作系统内核发现,程序2已经用了50毫秒了,所以接下来为了公平起见,我又想让程序一上去接着运行。于是,他会把CPU的使用权让给应用程序一,然后应用程序一就可以接着往下执行他之后的那一系列的指令了。所以刚才的这个故事中,我们就很清晰地看到了两个应用程序是如何在中断机制的支持下实现并发运行的,一直不断地相互切换。所以可以看到中断在现代的计算机当中到底有多大的作用。
那除了这个时钟部件发出的中断信号之外,有时候还会有来自于IO设备,也就是input output,也就是输入输出设备,发来的这种中断信号。比如说某一个应用程序可能会请求打印机的打印服务,那打印机在打印输出完成了之后会向CPU发送中断信号,用来通知CPU我的任务已经完成了。接下来CPU会用呃这个中断信号相对应的内核程序来对这个中断信号进行处理。
总之,我们这提到的这两种中断,中断的信号都来自于CPU的外部,和当前执行的指令是没有关系的。CPU在每一个指令执行结束的时候都会例行地检查一下是否有外部中断的信号需要我来处理。好的,那么刚才我进行了标点符号的补全,希望对您有所帮助。
三、中断的分类
以下是你提供的文本补全后的结果:
我们列举了一些内中断和外中断的例子,相信通过这些例子,大家可以更直观地感受到中断这种机制的一个强大的作用。那我们要分辨一个中断是内中断还是外中断,只需要判断啊这个中断信号的产生和当前执行的指令是否有关就可以了。那刚才我们讲解的过程中使用的是内中段和外中段这两个术语,因为内外这两个形容词可以让大家很形象地理解到他们俩之间的一个本质的区别。不过其实在很多教材还有很多学校的考试当中,内中断一般会称为异常,外中断一般就直接称为中断。所以考试当中遇到的中断一般来说是这个狭义的中断,他特指外中断。而我们这个小节当中之前一直在说的中断,其实指的是这种广义的中断。所以大家要理解他们的区别可以用内外这两种方式来理解。但是在做题的过程当中,更需要注意的是中断和异常这两个术语。那在接下来的讲解中,我们会经常使用到异常这个术语。大家需要呃知道,它其实指的就是内中断。那么异常又可以进一步地划分为这样的三种。
第一种叫做陷入Trap。这个其实就是刚才我们所提到的由陷入指令引发的那种异常。其实这种异常是程序故意引发的,当一个程序想要请求操作系统的服务的时候,他就会故意的执行这一条指令。那其实这也是系统调用实现的一个原理,而系统调用的内容我们会在下一小节再啊继续展开。
第二种异常称为故障故障,是一种由错误条件引起的,并且可能被内核程序修复的问题。内核程序修复故障之后会把CPU的使用权还给应用程序,让他继续执行下去。比如说我们在第三章当中会学习到的缺液故障,那这个地方啊大家暂时理解不了没有关系,等学完了第三章再回来呃细细品味。
第三种异常叫做中指终止,是由致命的错误引起的。这种错误一般是内核程序无法修复的,所以一般来说当发生了这种类型的异常之后,内核程序就呃不会再把CPU的使用权还给引发终止的那个应用。应用程序啊一般来说会直接的把这个应用程序直接给干掉,让他终止掉。比如说刚才我们提到了两个例子,整数除以0这种错误,那其实就是程序bug,也不是操作系统能够修复的,那是程序本身的问题或者非法的使用特权指令。那这样的程序也应该直接把它干掉,不应该再把CPU的使用权再还给他。所以这是第三种终止。那异常或者说内中断的这3种分类方式啊大家需要注意一下曾经考过。那么那么以上就是中断的一个分类。
四、中断机制的基本原理
接下来我们要简单地介绍一下中断机制背后的基本原理。刚才我们举了各种各样的中断的例子,有的中断是整数除以0,有的中断是时钟部件引起的,而有的中断又是应用程序自己引发的。那很显然这么多的中断的类型不可能用同一个程序来处理,所以CPU会根据中断信号的不同来找到,和这个中断信号相对应的中断处理程序。
具体的做法是,CPU在检测到中断信号之后,会根据这个中断信号的类型来查询中断向量表,然后通过这个中断向量表找到各种类型的中断所对应的中断处理程序。很显然,我们之前讲了那么多例子,大家应该也能够想到,中断处理程序它其实就是一种运行在内核态的内核程序。
那么,这就是中断机制的一个基本的实现原理。但是具体的硬件上应该怎么实现,这是计算机组成原理那门课要教大家的。如果不考那门课的同学,其实理解到这就差不多了。
好的,那么这个小节当中我们介绍了中断和异常,中断的作用时。
五、总结
十分重要。中断是让CPU从用户态变回内核态的一种唯一方式,也是让操作系统强制夺回CPU控制权的一种方式。引入了中断机制之后,操作系统才能正常工作,实现多道程序并发运行这一美好目标。
中断的分类是一个重要知识点,大家可以通过课后习题来巩固学习。最后,我们简要提了一下中断机制的基本实现原理,总结为以下两个步骤:
CPU首先检查中断信号。对于内中断信号,CPU在执行指令时会检查是否有异常发生;而对于外中断信号的检查,在每个指令周期的末尾,也就是CPU执行完一条指令后,会例行检查是否有外部中断信号需要处理。
当CPU检测到中断信号后,根据这个信号查询中断向量表,找到对应类型的中断处理程序进行处理。
好的,以上就是这个小节的全部内容。
No.6 系统调用
各位同学,大家好。
在这个小节中,我们会学习系统调用相关的知识。我们会为大家介绍什么是系统调用,它和库函数的区别,并且用一个小例子来直观地感受到系统调用为什么是必须的。最后,我们会介绍哪些功能需要由系统调用实现,以及系统调用背后的具体过程是什么样的。
让我们开始吧。
一、什么是系统调用
第一个问题,什么是系统调用?这个其实在第一个小节当中就有介绍过。操作系统作为用户和计算机之间的接口,需要向上提供一些简单的应用服务。给用户使用的就是命令接口 GUI,而程序接口又由一堆系统调用组成。所以,其实系统调用就是应用程序员请求操作系统内核服务的一个途径。它和我们平时编程的时候使用的函数调用其实是很类似的。但是,系统调用又和普通的库函数的调用又有一定的区别。其实我们在…
二、系统调用和库函数的区别
写程序的时候,是可以使用汇编语言的方式直接请求这个系统调用服务的。但是现在的编程更多地使用高级语言来编程,所以我们一般会直接使用那些高级语言提供的库函数。然而,这些高级语言的库函数在底层实现中其实也会利用操作系统提供的系统调用功能,通过请求操作系统的服务来完成操作。
因此,系统调用可以被看作是比高级语言的库函数更为底层的接口。在系统的层级中,裸机之上是操作系统,操作系统向上层提供的接口就是系统调用。这使得上层的库函数可以通过系统调用的方式来请求操作系统的内核服务。然后,各种高级编程语言会用库函数的方式封装这些系统调用,向更上层的应用程序程序员暴露更友好的编程接口。
然而,并不是所有的库函数在底层都会使用系统调用。许多库函数,比如C语言中的数学运算相关的库函数,像绝对值等,不需要特权指令就可以完成其功能。因此,这些库函数在底层并不需要使用系统调用。
然而,有些库函数,比如创建一个新文件,必须请求操作系统内核的服务才能完成。对于这类需要操作系统内核服务的库函数,它在底层肯定需要使用操作系统提供的系统调用服务。因此,这就是系统调用和库函数之间的一个区别。
三、为什么系统调用是必须的
当然,以下是你提供的文本的标点符号补全版本:
那接下来,我们用一个小例子来感受一下为什么系统调用是必须的,来描绘一个这样的场景:你去学校的打印店去打印论文,然后用WPS这个程序点下了打印按钮,之后打印机就会开始工作。但是当你的论文打印到一半的时候,另一个同学用Word也按下了打印按钮,请求打印他自己的论文。那么,我们知道WPS和Word在这个电脑里,这个系统当中,其实是两个正在并发运行的进程。所以,如果这两个进程能够随意地并发地来共享使用打印机资源的话,就会发生这样的情况:由于两个进程交替地并发地向打印机提出打印的请求命令,那么打印机设备就会交替地收到这两个进程发来的这打印请求。那这样的话,打印机就会把这两篇论文的内容给混杂在一起打印,先打印一行这个再打印一行这个。那这显然不是我们想要得到的结果。
所以,由于系统当中有各种各样的并发的进程,而这些并发的进程又需要共享使用类似于打印机设备这样的共享资源。但是这样的共享资源其实是需要各个进程互斥地共享的。那怎么实现对共享资源的互斥访问呢?最好的方式就是让操作系统内核,也就是这个系统的管理者,来对共享资源进行统一的管理。然后,上层的那些应用程序只能通过系统调用的方式来请求操作系统给他们分配这种资源。之后,这个进程才可以对这种共享资源进行使用和访问。而各个进程的请求会由操作系统内核来协调处理,保证他们并发运行的时候不会发生这种奇奇怪怪的事情。因此,从这个例子当中,我们就可以看到系统调用的功能是必须存在的。
四、什么功能要用到系统调用?
当然,这是你提供的文本的标点符号补全版本:
上面给出了,呃,系统调用按功能分类,可以分为这样的一些系统调用,比如设备管理、文件控制等等等等。这个就不再展开,大家自己看一下有个印象就可以。然后,有兴趣的同学可以去百度搜索一下Linux的系统调用,可以看一下Linux操作系统向上提供了哪些系统调用。
那到底哪些功能需要用系统调用的方式,呃,对外提供呢?其实都有一个共同的特点,凡是和共享资源有关的操作,比如说像对内存的这种分配与回收,内存是一种共享资源;IO设备也是一种共享资源;文件也是共享资源。总之,只要是对共享资源的访问,那肯定是需要通过系统调用来进行,因为这些共享资源是有限的,所以操作系统会对这些共享资源进行统一的管理和分配。因此,应用程序在使用这些资源的时候,就必须通过系统调用的方式请求操作系统内核,来帮他进行接下来的处理。这样的话,我们就可以保证系统的稳定性和安全性,防止非法操作。相信通过之前打印机的例子,大家能够有呃比较直观的体会。
那么,假设一个…
五、系统调用的过程
当一个应用程序想要进行系统调用时,背后需要进行一系列的步骤。我们来看一下一个运行在用户态的应用程序,它的各个指令会被CPU依次执行。当应用程序想要发出系统调用时,它需要使用传参的指令将一些必要的参数传递给CPU的寄存器。举例来说,可能在某个寄存器中放入了一个参数一,这个参数一指明了应用程序想要进行哪种类型的系统调用,就像Linux中的Fork系统调用。传递参数的指令可能会有多条,这取决于该系统调用需要传递几个参数。
操作系统会根据应用程序提供的这些参数来判断,应用程序想要的是哪种类型的服务。当这些参数都放入寄存器后,应用程序会执行一条特殊的指令,称为陷入指令。在上一小节中我们也提到过这个陷入指令。陷入指令的执行会引发一个内部中断。当CPU检测到这个内部中断信号后,发现这个中断信号是由Trap指令引起的。于是CPU会暂停运行应用程序,转而执行处理线路指令的那个处理程序。这个程序被称为系统调用入口程序。
显然,要执行这个入口程序,CPU需要处于内核态下运行。可以认为这个程序也是一种中断处理程序,只不过它处理的是由陷入指令引发的那个中断。接下来,系统调用入口程序会检查计算器中的这些参数,通过第一个参数,它会确定此时应用程序想要的是哪种类型的系统调用服务。于是,入口程序会调用与特定系统调用类型相对应的处理程序,然后让这个程序在CPU上运行。
在执行系统调用处理程序时,可以根据应用程序传递的其他参数来确定需要的具体服务。当系统调用处理完毕后,CPU会转回用户态,然后继续执行之前的应用程序。通过刚才的这个过程,相信大家对系统调用背后的过程有了一个比较直观的体会。我们在这个过程中可以看到,系统调用的功能是必须的,它确保了应用程序对共享资源的有序访问,保障了系统的稳定性和安全性,防止了奇怪的错误发生。
六、系统调用的过程
当我们将之前的库函数和系统调用串在一起时,普通的程序员可以使用高级编程语言编写自己的代码。在代码中,可以调用高级编程语言提供的库函数。然而,一些库函数内部实际上会使用操作系统提供的系统调用。具体来说,系统调用的过程需要先传递系统调用所需的参数。接着,应用程序会执行一条特殊的指令,即陷入指令,通过这个指令,应用程序将CPU的控制权主动交还给操作系统内核,以请求操作系统内核的服务。执行陷入指令后,会触发一个内中断,将CPU转向执行处理系统调用的内核程序。这个内核程序需要在核心态下运行,而它实际上也可以看作某种中断处理程序,只不过处理的是由陷入指令引发的中断。
当系统调用处理完成后,CPU会返回原先的应用程序,继续执行下面的指令。在这个过程中,有一些可能作为考点的小细节需要注意。首先,陷入指令实际上在用户态下执行,它是一条非常特殊但并非特权指令。执行这个指令后,会主动引发一个内中断,将CPU切换到核心态以运行内核程序。第二点需要注意的是,我们发出系统调用请求的动作是在用户态下进行的,但是对系统调用的响应处理是在核心态下完成的。最后,我们还需要注意陷入指令的另外两种名称,它也被称为Trap指令或房管指令。在不同的教材中,可能使用不同的术语,但需要知道这些术语指的是同一个事物。
好的,这个小节中我们已经对系统调用的工作过程有了更深入的理解。
七、总结
介绍了系统调用相关的知识。大家要能够理解系统调用和库函数它们的区别。另外,大家需要注意在系统中有各种各样并发的进程,这些进程会争夺着使用各种各样的系统资源。那么这些资源应该由操作系统来统一的掌管。所以,只要涉及对共享资源的访问操作,肯定需要用系统调用的方式来实现。这一点,大家随着后面的章节学习会越来越深入理解,而不需要死记硬背。
在本节中,我们还需要重点掌握系统调用背后的一个过程。这个过程中需要注意一条非常特殊的指令,叫做陷入指令,也可以称为Trap指令或者房管指令。当一个应用程序执行了陷入指令,意味着这个应用程序主动将CPU的控制权交还给操作系统,用这种方式来请求操作系统的服务。这个过程中,应用程序会触发一个内中断,然后CPU会切换执行一个处理系统调用的内核程序。这个内核程序通常需要在核心态下运行,因为它涉及操作系统的底层操作。
需要注意的是,我们提到的陷入指令也可以称为线路指令或者房管指令,不同教材可能使用不同的术语,但都指向同一个概念。
在接下来的学习中,大家会更深入地理解这些概念。这些知识将帮助我们更好地理解操作系统的运行原理和实现机制。
No.7 操作系统的体系结构
我们会学习操作系统的体系结构,也就是,操作系统的内核应该怎么设计,这样一个问题,那这个小节的内容,我们只需要做简要的了解就可以了,我们考试中,常考的是这样的两种体系结构,一种叫大内核一种叫微内核,那经过我们之前的学习我们知,
一、操作系统的内核
知道计算机系,统的层次结构是这个样子的,但是操作系统的内部,其实还可以再进行进一步的划分,一部分是内核的功能,另一部分是非内核的功能,操作系统最核心的那些功能,需要放在操作系统的内核当中,比如说时钟管理,中断处理还有言语,另外呢,还有之后我们要学习的进程管理啊,存储器管理设备管理等等啊,这些功能,都是要放在操作系统内核当中的,那那这提到的时钟管理,其实就是用我们之前提到过的,时钟中断,来实现了啊,计算机计时的功能,想要实现程序并发,就必然离不开时钟管理这个,很重要的内核功能,那中断处理呢,这就不再多解释了,之前已经举了很多例子,同样呢还有一种特殊的程序叫做原语,原语这种程序它具有原子性,所谓的原子性就是说这种程序,要么就一气呵成的全部运行完成,要么就是不运行,他的执行过程是不可被中断的,也就是说,在执行原语的,啊这一小段程序的过程当中,即使有外部中断信号过来了,那CPU也会继续把原语执行完成,才去处理,那个外部中断信号啊,总之我们这,列举的最下面这一层的这3个东西,是和硬件结合最为紧密的,所以,他们必须放在操作系统的内核当中,那其实像u帮图,还有Cento s等等,这些我们耳熟能详的Linux操作系统,这些系统的开发团队,他们主要干的事情,其实是在实现非内核的功能,而这些个操作系统的内核,使用的就是Linux的内核,那快考的同学,如果不知道这些是什么东西的话,也无所谓,这个不需要深究,总之内核是,
操作系统最核心最基本的部分,呃它由一系列的内核程序组成,这些内核程序必须运行在内核态,那,刚才我们提到的最底层的这三个部分,是与硬件关联最紧密的模块,这些功能是必须放在内核当中的,还有一些管理相关的功能,像进程管理存储器管理,对于这些功能的管理,更多的是对数据结构的一个操作,而不会直接涉及到硬件,所以有的操作系统,并不把这些管理功能放在内核当中,而只在内核当中保留,与硬件接触最紧密的这些部分,因此这就引出了两种截然不同的啊,内核的设计方法,把所有的这些功能都包含在,操作系统内核当中的,这种结构,就叫做大内核,而如果内核当中只保留,与硬件关系最紧密的这些部分,那么这种内核就叫做微内核,那我们需要注意的是,如果采用的是微内核的这种结构的话,那么属于内核的这些功能,是需要运行在内核态的,而不属于内核的,上面的这些功能就需要运行在用户态,这会对我们系统的,性能造成一定的影响,那我们用更直观的例子来体会这一点,
二、操作系统的两种体系结构
那假设现在有两种体系结构的呃系统,第一个系统,它采用的是大内核的体系结构,那么由于进程管理,存储管理等等这一些,呃这一些功能都是被划分在内核,当中的所以,这些功能的处理都需要运行在内核态,而只有应用程序是运行在用户态的,而对于采用,微内核结构的操作系统来说,只有和硬件联系最紧密的这些功能,被划分在了,内核当中,只有这些功能是需要在内核态,下可才可以执行的,而其他的这些,功能模块在用户态下就可以运行,现在来看这样一个故事,假设现在这个应用程序,想要请求操作系统的服务,并且这个服务的背后,需要同时涉及到进程管理,存储管理设备管理,这几个功能,如果采用的是大内核的体系结构的话,那么应用程序向操作系统,提出服务的请求,这个时候,呃CPU会从用户态切换为核心态,然后开始运行这一系列的内核程序,而如果采用的是,微内核的体系结构的话,应用程序向操作系统提出服务的请求,接下来操作系统的这几个模块,都需要为应用程序服务,而进程管理这个模块,在处理应用程序的请求的时候,他同样也需要得到内,核的呃支持,所以,这个模块对内核的访问就涉及到了,呃CPU从用户态转到内核态,服务完成了之后,又会从内核态再转回用户态,然后同样的,存储管理和设备管理这两个模块,他们也在完成相应的工作的时候,同样也需要得到内核的支持,因此,每一个模块都需要请求内核的服务,那每一次请求内核的服务,都会涉及到一个CPU状态转换的过程,因此如果我们采用的是大内核的,体系结构的话,那么应用程序的这个请求,只需要两次变态就可以了,这一次这一次,而如果采用的是微内核的,体系结构的话,那么呃,整个过程的处理就需要有6次变态,这需要注意的是,呃这个CPU的状态转换,这个过程其实是有成本的,需要消耗不少的时间,因此频繁的切换CPU的状态,是会降低系统性能的,对了这个地方也需要强调一下,大家在考试的时候,不要使用变态这个词,这个只是我们呃为了方便描述,然后使用的一种描述方式,大家在考试答题的时候,需要呃写的正规一点,就是要说成是CPU状态的转换,好了那么这个小节我们介绍的是
三、总结
操作系统的体系结构,分为大内核和微内核,呃相通过刚才的例子,相信大家也能够体会他们俩的,一个区别,大内核的优点就是性能高,因为应用程序在请求内核服务的时候,这个变态的过程会比较少,而微内核的缺点呢,呃是,需要频繁的在核心态和用户态,之间切换,所以它的性能会更低一些,不过微内核的优点呢,是它的内核功能很少,所以结构清晰,方便程序员维护,而大内核,由于他们把,很多很多功能都放在内核里,所以内核代码就会变得比较庞大,结构混乱,难以维护,这个也不难理解,那典型的大内核操作系统,像Linux Unix这些都是大内核的,然后微内核的操作系统的话,大家可以去看一下Windows NT,当然这些并不是考试考察的重点,考试的时候只会考察啊,这两种体系结构,他们的优缺点,大家只要能够有个印象就可以,好的,那么以上就是这个小节的全部内容
No.8 操作系统的引导
好的这个视频中,我们会学习操作系统的引导,那你可能看见这个词的时候,会觉得莫名其妙,不明觉地,什么是操作系统的引导呢,简单来说就是当你在开机的时候,如何让操作系统在你的电脑上,运行起来,这就是操作系统引导做的事情,那为了解释清楚这个问题,我们首先会介绍啊,在你的磁盘里边,有哪些和操作系统引导,相关的一些数据,了解了这些内容之后,我们再来介绍,操作系统引导的具体过程,那首先来看一下你的磁盘里边
一、操作系统的引导
有哪些数据,如果你花钱买了一个新的磁盘,那么这个磁盘的内部刚开始就像,你的钱包一样都是空空的,好接下来作为计算机专业的同学,我们都应该有能力,把一个新的磁盘,给安装到你的电脑主板上,那接下来,是不是就可以,在这个磁盘里边去安装操作系统了,那如果安装完操作系统,你的磁盘里边就有可能是这个样子,那先看后面这些部分,你应该很熟悉c d e f盘,那你的操作系统是安装在c盘里的,这个大家都知道,好那除了,你能看得见的这些磁盘分区之外,在你的磁盘的呃开头的位置,会流出一片区域,这片区域用于存储主引导记录,英文缩写叫MBR,这里边主要包含了两个重要的东西,首先是磁盘引导程序,这个我们一会来解释它有什么用,其次是分区表,那顾名思义,这个分区表其实就是一个数据结构,那这个数据结构里边说明了,在你的这个磁盘当中,每一个盘每个分区分别占多大的空间,以及每个分区的地址范围,好,接下来看一下你的c盘里边长什么样,首先你的c盘安装了操作系统,并且会使用这个c盘来启动操作系统,那在这种情况下,我们就可以把c盘称为呃,你的这个磁盘的活动分区,那我们再把c盘内部进一步细分,你会看到呃有两个比较特别的部分,首先,这有一片区域用于存储引导记录呃,英文缩写叫PBR,这个东西有什么用,我们一会再来解释,然后其次会有根目录相关的数据,那这个根目录,就是你双击打开c盘之后,看见的那些东西,那根目录里边,有可能会包含一些文件夹,有可能会包含一些文件对吧,那除了这两个部分之外,其他部分我们现在就暂时不做解释,好现在我们已经知道了,一个安装了操作系统的磁盘,内部大概长什么样,分为哪些部分,以及c盘的内部可以分为哪些内容,而接下来我们来看一下,你c盘里边安装的操作系统,是怎么一步一步启动的,那操作系统要启动操作系统的,
二、开机过程
数据肯定需要被放到储存里边对吧,好现在需要给大家补充一个知识,计算机的储存,由RAM和Rome两个部分组成,我们平时说手机内存是多少,或者电脑内存是多少,通常说的是RAM,除了RAM之外,还有这样的一个部分,这个ROM芯片,被集成在你的电脑主板上,那这个存储芯片里边存储的是BYOS,BYOS是基本输入输出系统的呃缩写,反正这个基本输入输出系统,它就是由一系列的程序组成的,那其中最重要的一个程序,就是Rome引导程序,又可以称为自举程序,好那我们知道,RAM芯片里面的数据只要一关机,呃一断电,里面的数据就被清空了对吧,就空了但是RAM芯片里面的数据,是不会因为断电而丢失的,那这就意味着当我们开机的时候,CPU一旦通上电,那CPU是不是就可以去储存当中,固定的这个位,置去找到这个若米引导程序,也就这个字句程序,然后执行这个程序里边的指令,一条一条往后执行,那执行,这个若米引导程序的作用是什么呢,它会指示着CPU,去把磁盘的,主引导记录把它给读入内存,那刚才我们说,主引导记录里边有分区表,对吧同时,还有一个叫做磁盘引导程序的东西,那么这两个东西,现在都被我们读到主存里了,接下来CPU,是不是就可以去执行,这个主存里边的,磁盘引导程序,而磁盘引导程序会根据分区表去判断,c盘所处的位置,接下来是不是就可以读入,c盘的第一部分的数据啊,也就是读入这个PBR引导记录,这个引导记录本质上也是一个程序,那接下来,CPU是不是就可以去执行这个引导,记录里边的程序,那执行这个程序,它的主要作用是,会负责找到启动管理器,那启动管理器它又是另一个程序,这个程序,通常存放在根目录下面的某个位置,所以接下来,从根目录里边找到这个启动管理程序,然后CPU再执行这个启动管理程序,接下来这个启动管理程序,就会完成呃,操作系统初始化的一系列的工作,好所以操作系统引导的过程,我们大致上,可以把它分为这样的四个主要步骤,第一步,CPU首先从一个特定的储存地址开始,去取指令,因为这个ROM引导程序,是存储在某一个特定的位置,固定不变的,那从这个位置开始一条一条往后,执行这些指令,那这些指令就是room引导程序对吧,那通常这个room引导程序,会先进行硬件的自检,就是检查呃这个有没有插磁盘,有没有插内存条等等,就是进行硬件的自检,那所有的这些硬件都没问题之后,才会进行下一步,也就刚才我们提到的第二步,会把磁盘当中的第一块,也就是主引导记录给读入内存,同时执行这个磁盘引导程序,并且扫描分区表,找到这个活动分区,也就是安装了操作系统的分区,那只要找到了活动分区的起始地址,接下来就可以去读入这个,活动分区的第一个部分的内容,也就是引导记录,把这个引导记录读入内存之后,就可以执行这个引导记录里边的程序,那这个程序完成的事情是,会从根目录下面,去找到完整的操作系统初始化程序,也就是我,们刚才提到的这个启动管理器,那最后再执行,操作系统初始化的这个程序,就可以完成一系列开机的动作,那这就是操作系统引导,也就是开机的过程,好那关于操作系统引导的过程,大家结合这些PPT来理解就可以了,那最后给大家拓展一个
三、例子
如果你用的是Windows操作系统的话,那你可以去找一下你的c盘,下面,应该会有一个叫做Windows的文件夹,然后在这个下面,你会找到一个叫做boot的文件夹,那在这个文件夹下面的东西,就是我们刚才提到的操作,系统初始化程序相关的那些内容,所以刚才我们说的第4步,本质上就是要从根目录,c盘的这个根目录出发,然后找到呃操作系统初始化程序,接下来再运行这一系列的程序,从而完成开机的那个动作,大家在开机的时候,看见你的那个电脑在转圈圈,什么正在启动,你看见那个画面的时候,其实它背后执行的就是这些个东西啊,好那有兴趣的同学,可以自己去翻一下你的电脑,学了理论,再结合实践去看一下这些东西,呃可以让你的记忆更牢固,也会让你对一门学科更有兴趣,好的,那以上就是这一小节的全部内容,
No.9虚拟机
一、传统计算机
我们来介绍虚拟机的概念:
首先看一下传统的计算机,传统的计算机在一个物理机器上只能运行一个操作系统,操作系统之上又可以运行各种各样的用户进程,那这看起来似乎是很合理的,但是在有的商业化的环境当中,这会导致硬件资源利用率不充分的一个问题:比如你拥有一个非常强大的一个物理机性能很好,但是由于这台机器上他只能运行一个操作系统,那么你的这台机器如果说你想要租给其他人使用的话,那其他人的这个要运行的东西只能在同一个操作系统之上运行。比如说王者荣耀的这个游戏服务器和吃鸡的那个游戏服务器他必须放在同一个操作系统之上来运行,但两个进程他们在同一个操作系统之上是不是有可能会有一些安全隐患?他们之间可能会相互影响也会相互的争夺操作系统管理的这些资源。
所以在商业环境当中两个应用让他们同时在一个操作系统上运行这可能会造成一些隐患,那一种解决方法是:我们把其中一个应用把它迁移到另一台物理机器上,然后这台物理机器上有一个独立的操作系统。那这样两个应用就不可能相互影响对吧,但是这又会导致物理机器硬件资源的极大浪费,刚才说很多商业级的这种物理机器它的性能是很强的,我的这个硬件性能本来可以同时支持你们两个进程的使用绰绰有余,但是为了安全起见我又不得不浪费把其中一个进程迁移到另一台机器上去运行,所以传统的这种结构一个机器上只能安装一个操作系统会带来很多应用上的限制。
二、虚拟机
因此就有人发明了虚拟机Virtual machine英文缩写叫VM,虚拟机是使用虚拟化的技术把一台物理机器虚拟化为多台虚拟机器,每一个虚拟机器上都可以独立的运行一个操作系统,要把一台物理机器虚拟化为多台虚拟机器,就需要使用到虚拟机管理程序,英文叫Virtual machine monitor缩写VMM,这个缩写也非常常见,那也有人把虚拟级管理程序称为hypervisor,在中文上也会把它翻译为虚拟机监控程序,所以虚拟机管理程序虚拟机监控程序VMM hypervisor这些术语都是一个意思。那接下来使用虚拟机管理程序这个术语。
虚拟机管理程序分为两类:
第一类的虚拟机管理程序会直接运行在硬件之上,虚拟机管理程序会把一个物理机器虚拟化为多台虚拟机器,会把一个总的硬件资源划分为多个部分,分别给各个虚拟机来使用,那每一台虚拟机器上面可以安装各自的操作系统,比如第一台虚拟机上安装Windows,第二台上面安装Linux,而第三台上面又安装Windows,在每一个操作系统之上又可以运行各自的用户进程,我们可以简单说一下如何把一个机器上的硬件资源把它分配给各个虚拟机器:比如一个CPU一个单核的CPU它也可以模拟多台虚拟机器,我们只需要把这个CPU的时间片进行划分,每个虚拟机器分配若干的时间片,那这样的话在上层的这个操作系统看来似乎给自己分配的就是一个独立的CPU,但事实上只是把这个物理CPU的某一些时间片分配给他了而已,那磁盘和内存的分配更不用说了只需要把磁盘空间划分出来分配给个虚拟机器,内存空间划分出来分配给各个虚拟机器那这样的话,每个虚拟机器都可以拥有各自独立的硬件资源,就有点类似于传统的计算机当中操作系统把硬件资源进行了划分,像CPU就是按时间划分为时间片像内存磁盘这些就是划分为了不同的空间分配给各个进程,这样每个进程是不是也可以拥有自己独立的资源。所以第一类虚拟机管理程序就有点类似于我们传统的操作系统一样,他会负责直接管理这些硬件资源并且分配这些硬件资源这只是一层更深的套娃而已。
那值得一提的是只有虚拟机管理程序是运行在内核态的,只有他可以使用特权最高的那些指令,而上层的操作系统和应用程序他们实际上是运行在用户态的。那这会导致一个问题:上层的操作系统他可不知道自己运行在用户态,他以为自己运行在内核态,所以上层的操作系统依然会使用一些特权指令,对吧但是刚才说,只有虚拟及管理程序运行在内核态,所以上层的这个操作系统不能让他使用特权指令,那这种情况怎么办呢?当上层的操作系统想要使用特权指令的时候,他的这个行为动作会被虚拟管理程序给截获,然后这个虚拟级管理程序会负责把上层的操作系统想要执行的这个特权指令进行一些等价的转换,反正就是要给上层模拟出好像这个指令执行成功了那种感觉,所以我们说上层的操作系统它是运行在虚拟内核空间的,它并不是真正的内核空间,实际上是用户空间,只不过他自己以为自己运行在内核空间而已,这是第一类虚拟级管理程序直接运行在硬件之上,直接会管理硬件分配硬件资源接下来。
再来看第二类的虚拟级管理程序,那这一类的虚拟管理程序它不是直接运行在硬件上的,而是运行在一个宿主操作系统上host OS。比如在我的Mac电脑上我安装了Mac OS这个操作系统,那我可以在我的这个电脑上安装第二类的虚拟机管理程序。比如很多同学可能听过Virtual box或者Vain well,这是学生比较常用的两款虚拟机管理程序。那电脑上是安装了Virtual box安装了这个软件之后,就可以去下载另一个操作系统的镜像文件。比如在这个Virtual box上安装了一个Linux的操作系统,并且可以指定要给我上层安装的这个操作系统分配多大的内存,也可以给他指定要给他分配多大的磁盘空间,那接下来我就可以点这个启动,然后在我的Mac电脑上启动一个Linux的操作系统。所以我的电脑本身是Mac OS的操作系统这就是宿主操作系统,在我的操作系统之上我安装了某一个第二类的虚拟机管理程序Virtual box,在这个虚拟管理程序之上我就可以安装一个客户操作系统,比如我安装的就是一个Linux,那如果我愿意的话我也可以安装一个Windows的操作系统那如果我再安装一个Windows的这个客户操作系统的话,我可以在我的电脑上同时启动两个客户操作系统,当然也可以只启动一个,只要我的硬件资源足够那我就可以在我的这个宿主操作系统之上安装并且同时启动多个客户操作系统,那显然在我的操作系统之上除了客户操作系统之外还会同时运行着很多我自己安装的一些进程,比如我的电脑上还在运行PPT相关的进程,同时我也可以启动我的这个客户操作系统让我的客户操作系统也正常的工作,而我的客户操作系统启动了之后就跟正常的操作系统一样,我也可以在上面安装软件也可以让这些软件正常的运行,如果想要给大家演示Windows操作系统的一些情况,那我就会启动一个Windows操作系统的虚拟机器然后在上面安装一些Windows的应用程序给大家做,这样的演示好所以第二类的虚拟机管理程序它并不是直接运行在硬件之上而是运行在宿主操作系统上面,这个虚拟机管理程序想要给各个虚拟机器分配硬件资源,那么他只能请求操作系统给他分配然后再由这个虚拟机管理程序进行再分配硬件资源的管理者,依然是宿主操作系统。
三、两类虚拟机对比
那这是两类虚拟机管理程序第一类虚拟机管理程序和第二类虚拟机管理程序思想各不相同那由于他们的实现方式不同因此就造成了一些特性上的差异这给大家做一个总结首先对物理资源的控制权第一类的虚拟机管理程序它是直接运行在硬件之上的可以直接控制和分配这些物理硬件资源。而第二类的这个虚拟机管理程序它是运行在宿主操作系统之上的依赖于宿主操作系统为其分配物理资源他要使用硬件资源只能向宿主操作系统申请并且被分配好。因此两类虚拟机管理程序在给上层的这个客户操作系统分配资源的时候也会出现一些差异:比如第一类虚拟机管理程序在安装客户操作系统的时候他会直接在原本的硬盘上给他划分一些存储空间直接分配给他。比如说我把0号块到1024号块全部分配给第一台虚拟机VM1然后从1025号快一直到2048号快全部给他分配到第二台虚拟机VM2,我可以直接把一些未经抽象的物理资源分配给上层的虚拟机器那这就有点类似于我们之前说的外核的那种分配方式,那相比之下第二类的虚拟机器向宿主操作系统申请物理资源的时候宿主操作系统给他分配的这个资源是经过抽象的。比如第二类虚拟机管理程序想要给第一台虚拟机分配10个GB的磁盘存储空间那么这个虚拟机管理程序会向操作系统申请创建一个大小为10GB的大文件,那这个大文件具体存放在磁盘当中的哪些位置是由宿主操作系统来决定的,那虚拟机管理程序在获得了这10GB的大文件之后他又会把这10GB的空间给分配给第一台虚拟机器,让第一台虚拟机器以为自己好像拥有了10GB的磁盘存储空间一样,但事实上这只是一个虚拟磁盘这10GB的空间,在磁盘当中未必是连续的背后对应的是宿主操作系统文件系统当中的一个大文件而已,这是对于外存的分配那对于内存的分配是不是也一样?第二类的虚拟机管理程序向操作系统请求给他分配一片内存空间,那宿主操作系统给他分配了4 GB的内存空间但这4 GB事实上是虚拟内存对吧各个页面也许是离散存储的好那这个虚拟机管理程序获得了这4 GB的虚拟内存之后,又可以把这4 GB的虚拟内存拆分分给不同的这个虚拟机器比如第一台虚拟机器分两GB第二台虚拟机器又分两GB他就是这么干的。所以就是多增加了一层套娃他本身得到的也是一个虚拟的硬件资源然后他又把这个虚拟的硬件资源再虚拟再分配给各个虚拟机器那显然这会导致第一类虚拟机管理程序性能更好,因为我们每进行一次硬件的虚拟化就意味着上层的这些用户操作系统在使用这些硬件资源的时候他的这个地址需要先映射为这个虚拟机管理程序获得的这个虚拟地址空间,然后宿主操作系统又需要把这个4GB的虚拟地址空间再给映射到实际的物理地址空间,所以经过了多层的虚拟就意味着在使用这些资源的时候又需要经过多层的映射才可以对应到最终的一个物理地址上,那这就会导致第二类的虚拟及管理程序它的性能更差总是需要通过这个宿主操作系统作为中介,
另一个方面在一台机器它的硬件资源确定固定不变的情况下,第一类的虚拟机管理程序往往可以支持更多台的虚拟机因为第一类的这个虚拟机管理程序他拥有所有的硬件资源对吧,而第二类的虚拟机管理程序他自己的资源需要跟宿主操作系统申请那宿主操作系统他本身也需要一些硬件资源,同时他上面的这些进程也需要使用一些硬件资源可以在硬件资源相同的情况下显然第一类的这个虚拟机管理程序可以支持更多台的虚拟机,这是可以支持的虚拟机数量
接下来虚拟机的可迁移性:第一类的虚拟机管理程序要迁移虚拟机比如要把这台虚拟机器迁移到另一个虚拟机管理程序之上那这个迁移的动作是比较麻烦的而第二类的虚拟机管理程序要迁移一台虚拟机就非常方便,比如我自己的这个虚拟机管理程序上我要迁移这个Linux操作系统我要把我的这个操作系统给你用,那么我只需要把这个操作系统导出导出为ISO就是镜像文件,然后你直接把我这个镜像文件考过去,在你自己的Virtual box上面一加载一安装你就可以使用到跟我这边完全一样的操作系统了,包括我在我的这个客户操作系统上安装的一些程序或者数据什么的都可以一起打包给你,然后你可以很方便的迁移到你自己的Virtual box上所以这是由于它的可迁移性好,所以第二类的这个虚拟机管理程序它的商业化应用目前来看是更广泛一些的,使用起来会很灵活
最后运行模式方面:第一类的虚拟级管理程序它运行在最高的特权级别可以使用最高特权的指令那以前当我们介绍指令的时候只是把指令分为了非特权指令和特权指令这样的两个特权级别,但是在近几年的CPU当中指令的特权级可能会被进行更多层次的划分比如化为0级一级二级三级越往上特权级越低,越往下特权级别就越高所以这地方我们说第一类的虚拟级管理程序运行在0环指的就是它运行在最高的这个特权级别它可以使用最高特权的一些指令,把指令划分为更多的特权级别是有好处的,比如像刚才我们说如果指令只分为非特权指令和特权指令那么任何一条特权指令的这个使用都需要虚拟及管理程序把它截获并且判断这条特权指令的使用是否合法,如果合法的话还需要由它来模拟出特权指令执行的一个效果,但是如果我们对指令的这个特权级进行更精细化的一个分类。让第一类的虚拟程序运行在最高特权级,我们把这个最高的特权级别称为0环然后让这个客户操作系统的内核运行在一环次高特权级,接下来让用户进程运行在二环就最低的特权级那进行了这样的划分就可以保证当上层的客户操作系统他使用二环一环的这些指令的时候,我这个虚拟级管理程序不用管直接让你执行就行了,除非你需要使用到少数的一些0环的指令,我才帮你检查这些0环的指令应不应该让你执行会不会导致不安全等等,这就相当于我们把原本的特权指令进一步的进行了细分,把特权指令当中的一些敏感指令放在0环,然后把一些不敏感的指令放在一环,这样的话虚拟机管理程序不用检查每一条特权指令的执行,只需要检查某一些敏感指令的执行就可以了,所以在第一类的虚拟机管理程序当中只有虚拟机管理程序是运行在最高特权机的,上层的操作系统运行在次高优先级,再来看第二类的虚拟机管理程序,第二类虚拟机管理程序一部分运行在用户态,一部分运行在内核态,在内核态的这个部分是以虚拟机驱动程序的方式加载到操作系统内核当中的,那当上层的这个应用程序发出系统调用比如说要write系统调用的时候,上层的这个操作系统它可以直接去读写词盘吗?显然不可以,所以用户进程的系统调用会被虚拟机管理程序截获然后由虚拟机管理程序进行一些处理,代替他向底层的这个宿主操作系统发出right系统调用来请求底层宿主操作系统的服务,所以无论怎么看第二类的虚拟级管理程序它的性能肯定都会更差一些,这个宿主操作系统它总是要作为一个工具人作为一个中介来被使用,