【王道-绪论-计算机系统概述】

#pic_center

R 1 R_1 R1

R 2 R^2 R2

目录

知识框架

No.1 操作系统的概念功能和定义

零、大家熟悉的操作系统

  • 让我们首先看一下大家熟悉的操作系统有哪些。
  • 对于一些经济宽裕的人来说,他们可能更偏爱苹果的设备,例如苹果电脑上使用的是Mac OS,而苹果手机采用的是iOS系统。然而,对于我个人而言,相比于苹果设备的奢华,我更偏好那种朴实而优雅的安卓和Windows操作系统。
  • 然而,对于绝大多数普通用户而言,99%的人使用的是这几种操作系统。不过对于技术领域的同学来说,Linux操作系统也是必须学习和掌握的操作系统之一。
  • 此外,现在可能还有一些人在使用诺基亚的塞班系统。因此,我们可以看到,学习这门课之前,我们已经积累了很多关于操作系统的实际体验。
  • 因此,在学习这门课程时,我们可以运用自己平时使用这些操作系统的经验,结合我们学到的知识点来思考。这有助于更好地理解课程内容,将操作系统知识与日常生活联系起来,实现学以致用。

image-20230817185727325

一、操作系统的概念和定义

1、知识总览

  • 我们只介绍操作系统的一些最基础的概念和定义,并且会结合一些例子来加深大家的理解。
    那,操作系统的概念和定义要回答的就是,什么是操作系统这样一个问题。它的功能和目标要回答的是,操作系统它需要做什么这样的一个问题。

image-20230817185844192

2、操作系统的概念和定义。

  • 首先,让我们探讨操作系统的概念和定义。
  • 操作系统在整个计算机体系中扮演着重要的角色。为了更好地理解,让我们看一下我们现在使用的计算机是如何逐步变成我们所熟知的形态的。
  • 首先,电脑制造商会组装CPU、主板等硬件组件,创建一台裸机,即只包含硬件而没有操作系统的机器。然而,在出售前,制造商通常会在裸机的基础上安装操作系统,其中最常见的是Windows操作系统。一旦我们购买了电脑,我们可以在操作系统上安装各种应用程序,比如QQ。这样,作为用户,我们可以使用这些应用程序。
  • 这个过程揭示了计算机系统的分层结构。最底层是硬件,通常被称为裸机。在裸机之上是操作系统层,而在操作系统之上,我们可以安装各种应用软件。用户位于这个层次结构的最顶端。一些敏锐的同学可能会注意到用户和操作系统之间存在一些交互,程序与操作系统也有一些交集。接下来,我们将进一步解释这个问题。

image-20230817185930584

3、操作系统的概念定义

  • 在理解了操作系统在整个计算机系统中的位置后,我们来给出操作系统的定义。
  • 在《王道书》中,操作系统被定义为控制和管理整个计算机系统的硬件和软件资源,以及合理组织和调度计算机工作和资源分配的系统。这句话的核心思想是,操作系统充当了系统资源的管理者,包括硬件和软件资源。让我们以一个实际的例子来理解。如果你使用的是Windows操作系统,你可以打开任务管理器。在任务管理器中,你可以看到系统中正在运行的各个进程。这些进程实际上就是正在运行的软件或程序,例如QQ或Chrome。因此,操作系统负责管理这些软件资源。此外,在任务管理器的右侧,你可以查看操作系统对CPU、内存等硬件资源的使用情况。例如,你可以看到QQ进程使用了138.9兆字节的内存空间。从这个角度来看,操作系统不仅管理软件资源,还管理硬件资源。操作系统位于软件和硬件之间,充当了系统资源的管理者。
  • 下一句提到,操作系统必须向用户和其他软件提供方便的接口和环境。这意味着操作系统必须提供用户和应用程序易于使用的服务。
  • 最后一句指出,操作系统是计算机系统中最基本的系统软件,它是一种软件而不是硬件。然而,操作系统位于软件和硬件之间,紧密接触硬件层。

image-20230817190119188

二、操作系统的功能和目标

1、资源的管理者

  • 首先要看的是操作系统,它作为软件和硬件中间的层次,它是系统资源的一个管理者。我们用大家使用QQ和朋友视频聊天的例子,帮助大家来理解它作为系统资源的管理者要做一些什么事情。
  • 首先,我们肯定是需要在文件夹当中找到QQ的安装位置。比如说,像我的电脑当中,我的QQ就是安装在了地盘的一系列路径下面。所以,当我找到QQ的这个启动程序之后,我就可以双击打开QQ.exe。那,当我双击之后,QQ程序就可以正常的运行,然后我就可以用QQ和我的朋友进行视频聊天了。
  • 在这个过程当中,我们可以看到,第一步我们是通过了这些一层一层的文件夹目录来找到了我们的QQ启动程序。那,除了这个文件之外,系统当中还有各式各样的其他的文件,但是这些文件的组织和管理,其实是操作系统在帮我们完成的。所以,这就涉及到了操作系统作为系统资源的管理者所要提供的一个功能,叫做文件管理的功能。
  • 然后,第二步,当我们双击QQ.exe的时候,这个程序就可以开始正常的运行。那,在这个地方我们需要补充的一个知识点,跨考的同学可能不知道的是,我们的一个程序在执行之前,其实是需要把这个程序的数据放到内存里的。所以,在我们双击打开QQ.exe的时候,其实在背后,操作系统帮我们做了一个很重要的事情,就是把这个程序的数据从我们的磁盘放入了内存当中。并且,这些数据要放到内存中的适当位置,这些其实都是操作系统在帮我们完成的。所以,这一步就涉及到了操作系统它所要提供的第二个功能,叫做存储器管理或者叫存储管理、内存管理。
  • 在当QQ程序运行的过程当中,其实是需要被处理机,也就是CPU进行处理的。而什么时候给QQ程序分配处理机资源,这个事情是操作系统在背后替我们完成的。因此,这就涉及到了第三个功能,叫做处理机管理。
  • 第四步,我们开始使用QQ程序和朋友视频聊天。在视频聊天的过程当中,肯定需要把摄像头这个设备分配给QQ程序使用。因此,像摄像头这一类设备资源也是要由操作系统替我们管理,由操作系统来决定应该要把这些设备分配给哪个程序使用。所以,这就涉及到了操作系统要提供的第四个功能,叫做设备管理。
  • 我们王道书的第二章讲的其实就是处理机管理,而第三章讲的是存储器管理,第四章讲的是文件管理,第五章讲的是设备管理。所以,其实操作系统这门课,在后期我们要重点学习的就是,它作为系统资源的管理者,要如何设计和实现这些功能。对于各个部分的理解,大家会随着之后的学习不断深入,这就暂且不展开。在这个地方,大家只需要建立这样一个全局观,就可以好的。
  • 那么,这是第一部分:操作系统,它作为系统资源的管理者,所需要实现的一些事情。

image-20230817190335973

2、向用户提供服务

  • 第二部分,我们来看一下操作系统,他要向上层提供方便易用的服务,这是什么意思呢?
  • 通过刚才分析,我们知道计算机的最底层其实是裸机,也就是纯硬件。那,最底层的这些硬件,其实他只能听得懂二进制指令,也就是机器语言。也就是说,如果我们要直接和这些硬件打交道的话,那我们只能通过这种二进制的语言和这些硬件进行交互。所以,我们说最底层的这些硬件,他对外暴露的其实是一些丑陋的、不友好的交互接口。正常的人类很难和这些纯硬件直接来打交道。
  • 但是,在硬件之上安装的操作系统,其实会向它的上层提供一种更美丽、更友好的交互接口。在安装了操作系统之后,我们的用户和应用程序不需要直接和硬件打交道。我们只需要告诉操作系统我们想要得到的服务,就可以。而操作系统会把用户的这些命令需求翻译成二进制,来告诉硬件,然后由硬件来执行我们想要的这些操作。那,这其实是一个很典型的封装的思想。操作系统把一些丑陋的硬件功能,把它封装成了一些简单易用的服务,使用户能够更方便的使用计算机。
  • 上层的用户不需要再关心底层的硬件细节,而只需要用这种更简单的方式,对操作系统发出命令就可以。剩下的,操作系统会替我们来完成。其实,这种封装思想,在我们日常生活中也经常被使用。比如说,我们的汽车如果把它拆解了的话,会发现它里面有很多很多很复杂的一些构件。但是,我们的汽车设计师们会把这些底层复杂的这些构件,把它呃隐藏起来,把它封装成一个我们简单易用的接口,对用户暴露出的就只有方向盘、刹车、油门这些。用户能够理解的简单易用的接口。但是,用户不需要再关心它底层到底是怎么实现转向、加速、减速这些功能的。
  • 所以,其实操作系统做的事情,本质上和这种封装没有任何的区别。

image-20230817190536849

2.1图形化用户接口
  • 那,接下来我们来看一下操作系统屏蔽了底层硬件细节之后,它对上层提供了哪些方便应用的服务呢?

  • 首先,来看一个我们最熟悉的操作系统提供的服务,叫做GUI,又叫图形化用户接口。我们用户可以使用这些形象的图形界面来对我们的整个系统进行操作。比如说,在Windows操作系统当中,如果我们要删除一个文件的话,只需要把文件拖拽到那个回收站即可。这种操作方式对于我们用户来说是很形象、很容易理解的。但是,在我们这样一个简单的拖拽动作之后,操作系统其实在背后为我们做了很多很多的事情。

  • 现代的操作系统一般都会对我们的上层用户提供这种图形化的用户接口。不过,一些早期的操作系统其实是并没有这种图形化的界面的。

image-20230817190701867

2.2联机命令接口
  • 那,早期的操作系统都是让用户通过命令接口的方式和操作系统进行交互,也就是用命令行的方式和操作系统进行交互。那,命令接口又分为两种:一种是联机命令接口,一种是脱机命令接口。

  • 我们先来看第一种联机命令接口,它又叫交互式的命令接口。我们来看一个直观的例子。如果使用的是Windows操作系统的话,我们可以用这样的方式来打开命令解释器,也就是我们平时经常会看到的这个小黑框。然后,我们可以在这个命令解释器当中输入一个命令,叫做time。那,输入了time这个命令之后,操作系统会告诉我们当前的时间是几点几分。接下来,操作系统又会让用户输入一个新的时间,也就是说,你想把系统时间调到几点几分几秒。那,像这个time命令就是一个很典型的交互式的命令,也就是我们用户说一句,然后系统会跟着做一句,接下来用户需要再说一句,然后系统才会跟着再做一句。整个过程中,我们用户和操作系统是在不断的交互的。

  • 除了time命令之外,还有很多别的用于和操作系统交互的这种命令。由这些命令组成了所谓的交互式的命令接口,或者叫联机命令接口。

image-20230817190819853

2.3脱机命令接口
  • 那,第二种命令接口叫做脱机命令接口,又叫批处理命令接口。还是以Windows操作系统为例,我们可以在C盘当中搜索一个以.BAT作为后缀的一个文件,然后随便打开其中的一个文件,可以看到里面有密密麻麻的一系列的命令。但是,别看它复杂,其实它本质上和我们刚才所看到的time命令没有任何区别。我们只不过是把这一系列的命令,把它罗列在了这样的一个清单里。
  • 然后,当我们执行这个.BAT文件的时候,操作系统其实就是根据这个文件当中的这些命令,一条一条地往后执行。也就说,我们使用这种批处理命令接口,或者叫脱机命令接口,和操作系统进行交互的话,那么我们其实是一次提出一堆的请求,然后操作系统会根据我们的指示,一条一条地执行这一堆的请求。所以,这也是为什么这种命令接口称作为批处理命令接口的原因。
  • 那,这就是操作系统对上层提供的两种命令接口。

image-20230817190855361

2.4程序接口
  • 刚才我们提到的3种接口,GUI、联机命令接口和脱机命令接口,都是可以让普通用户直接使用的。那么,操作系统还有一种对外提供的接口叫做程序接口,这种接口是给程序员使用的。我们可以在我们编写的程序中,通过系统调用的方式来使用程序接口。注意,普通用户是不能直接使用程序接口的,我们只能通过编写程序代码的方式,来间接地使用这个程序接口。
  • 让我们用一个例子来帮助大家加深理解,什么叫系统调用,什么叫程序接口。在我们写C语言的"Hello, World!"程序的时候,我们会使用到printf这个函数。然后,在执行这个程序的时候,会在我们的电脑屏幕上打印出"Hello, World!"这两个单词。虽然我们只是简单的调用了printf函数,但是其实这个函数在底层实现的时候,肯定是使用到了操作系统提供的和显示相关的那些系统调用的功能。也就是说,我们普通程序员其实使用了C语言提供的库函数,也就是printf这个函数。而这个库函数在底层实现的时候,其实是使用了操作系统提供的系统调用的功能。操作系统在收到这个系统调用相关的请求之后,才会替我们去操作这个硬件,也就是显示器,并且在这个显示器上面显示出"Hello, World!"这两个单词。
  • 所以,其实这个系统调用很类似于我们很熟悉的这种函数调用。很多操作系统当中都提供了上百种的系统调用,由这些系统调用组成了所谓的程序接口。我们的应用程序请求操作系统服务的唯一方式,就是通过系统调用的方式。那这个地方有一个小细节,有的教材当中系统调用又会被称为广义指令。所以,这个术语大家也稍微注意一下。好了,这个部分我们讲了。

image-20230817191011785

2.4程序接口
  • 操作系统向上层提供了很多方便易用的服务。有的接口是直接给用户使用的,比如说GUI和命令接口。而有的接口是给软件或者说给程序员使用的,比如说程序接口。讲到这里,我们就可以理解为什么用户和操作系统中间有一段相接的部分了。因为用户通过这些方式可以直接地和操作系统进行交互,而应用程序则需要通过系统调用的方式,也就是通过程序接口,来和操作系统进行交互。
  • 连接命令接口和脱机命令接口的区别,大家也需要注意。有可能在选择题当中进行考察。连接命令接口或者叫交互式命令接口是使用户说一句,系统做一句的交互方式。而拖机命令接口或者叫p处理命令接口是用户说一对,然后系统跟着做一对的交互方式。
  • 另外,在有些教材当中,会把命令接口和程序接口啊统称为用户接口。也就是说,狭义的用户接口其实不包含GUI。这点大家稍微注意一下。接下来我们来看这个小节的内容。

image-20230817191131067

3、对硬件机器的拓展

  • 最后一个内容,操作系统,它作为最接近硬件的这个层次,所需要做的事情就是要实现对硬件机器的拓展。如果一个计算机当中没有任何的软件支持,那这种计算机就称之为裸机。而如果我们在裸机上安装了操作系统的话,就可以把裸机改造成功能更强、使用更方便的机器。我们会把覆盖的软件的这种机器称为拓充机器或者称为虚拟机。当然,这些只是一些无关紧要的概念,对于我们来说更重要的事情是要理解为什么说操作系统可以实现对硬件机器的拓展。
  • 为了理解这个特点,我们还是用刚才汽车的例子来进行类比。比如说,我们汽车当中原本只有一些啊零碎的一些硬件,比如发动机,其实它只有一个功能就是会转,然后轮胎它也只有一个功能就是会滚。但是,如果我们在这种原始的硬件机器上再覆盖上一层传动系统的话,我们就可以让发动机来带动着轮子来转。这样的话,我们的汽车就可以开始往前行走了。所以增加了这样的一个系统之后,我们以前的这些呃简单的硬件机器就得到了一种功能上的拓展。而我们的操作系统对硬件机器的拓展也是类似的。操作系统把CPU、内存等等这一系列的硬件合理的组织起来,并且让这些硬件能够相互协调,配合着工作。这样的话,这些简单的硬件就可以呃组合起来实现更多更复杂的功能。所以说操作系统它实现了对这些硬件机器功能的一个拓展,使这些单纯的硬件功能更强,使用更方便。

image-20230817191544453

三、总结

  • 当中,我们用了很多例子帮助大家感性地认识了什么是操作系统。操作系统需要实现一些什么样的功能?那操作系统这门课最关注的是,他作为系统资源的管理者,所需要实现的这些功能。这些功能应该怎么实现,怎么设计?这是我们之后的课程当中会重点、会详细讲解的。
  • 而这个小节当中,有可能会作为选择题进行考察的是:操作系统他对上层提供了哪些服务?大家要理解什么是 GUI,什么是命令接口?连接命令接口和脱机命令接口的区别是什么?另外,由一系列的系统调用组成了程序接口。系统调用这个概念会在后面专门用一个小节再进行更进一步的分析和讲解。

image-20230817191757196

No.2 操作系统的特征

  • 在这个小节当中,我们会学习操作系统的四个特征:并发、共享、虚拟和异步这四个基本的特征。其中,并发和共享是两个最基本的特征,二者互为存在条件。我们会按照这样的顺序为大家依次讲解,并且会解释为什么这两个,呃,这两个是最基本的特征,并且二者互为存在条件。

image-20230817192740961

一、并发与并行区别

  • 首先,我们来看…看一下并发这个特征。
  • 并发是指两个或者多个事件在同一时间间隔内发生,这些事件宏观上看是同时发生的,微观上其实是交替发生的。与这个并发概念比较容易混淆的是并行的概念。并行是指两个或者多个事件在同一时刻同时发生。这个对于跨考的同学来说,可能呃会不太容易理解。
  • 那么我们用一个例子来进行说明。假设有这样两个人,一个是小渣,一个是老渣,他们都有两个女朋友,然后有两个任务,都是分别是和1号约和2号约。那么对于小扎来说,他采用了一种翠绿翠绿的约会方式,就是和1号2号一起约会,而老渣采用了一种更绿的呃,约会方式,就是在各个时间段内,他交替的和两个女朋友进行约会。
  • 那么对于小渣的这种方式来说,他其实采用的就是并行约会的策略。并行的意思是指两个或者多个事件在同一时刻同时发生,也就是说对于小扎来说,他在同一时刻,他其实是同时在进行着两个约会任务。而对于老扎来说,他采用的是并发约会的这种方式,在宏观上看,这一整天,老扎进行了两个约会任务,但是在微观上看,任何一个时刻,老扎其实只在执行其中的某一个约会任务。
  • 所以,这就是所谓的微观上交替发生,而宏观上同时发生的并发的这种特征。那么经过这个例子,相信大家对并发和并行已经有了直观的理解。

image-20230817192912885

一、并发

  • 那在了解了并发和并行的区别之后,我们再来看一下什么是操作系统的并发性。
  • 操作系统的并发性指的是,在计算机当中同时运行着多个程序。这些程序宏观上看,它们是同时运行着的,但是微观上看其实是交替运行的。接下来我们再来看一下,为什么并发性对于操作系统来说是一个很重要的基本特性。
  • 其实我们的操作系统,它就是伴随着多道程序技术出现的,这个我们会在下个小节操作系统的发展历史当中会有进一步的介绍。总之,操作系统的出现就是为了支持多道程序并发运行同时运行而诞生的。
  • 那我们需要注意一个很重要的考点,对于一个单核CPU来说,同一时刻呃只能执行一个程序,因此一个单核CPU的系统当中各个程序肯定是只能并发的执行。但是对于多核CPU来说,同一时刻可以同时执行多个程序,也就是说多个程序可以并行的执行。
  • 举个例子,我们的英特尔第八代I3处理器,它就是一种四核的CPU。这个大家可以上网去搜一下。四核CPU就意味着它可以并行的执行四个程序。比如说在这个CPU上,我们可以同时并行的运行啊,微信、QQ、Word还有Chrome这四个程序。但是如果此时有第五个程序也想同时运行,比如说我们想同时在听歌的话,那么我们就必须剥夺其中的某一个程序,他对呃CPU的使用权。比如说我们把Word这个程序给换下CPU,然后让QQ这个程序上CPU运行,然后Word和QQ这两个程序,嗯,交替着来使用CPU。总之对于4核CPU来说,同一时刻只能同时执行4个程序,而如果要有超过4个以上的程序同时运行的话,那么并发性依然是必不可少的。
  • 所以不管是早期的操作系统还是现代的操作系统,并发性都是操作系统一个很重要的最基本的特性

image-20230817193023613

二、共享

  • 那么,再来看第二个共享特性
    共享也就是资源共享,是指系统当中的资源可以供内存当中的多个并发执行的进程共同使用。资源共享可以分为两种共享方式,一个是互斥共享,一个是同时共享。对于互斥来说,是指在一个时间段内,这个资源只允许一个进程来使用。而同时共享是指在一个时间段内,他允许多个进程同时对这个资源进行访问。这个地方所谓的"同时"为什么要打双引号呢?因为它往往是在宏观上同时,而在微观上可能是交替的对这个资源进行访问的。这个在这个地方宏观和微观,刚才理解了并发和并行之后,这大家应该就已经可以理解了。
  • 那么,直接来看一个例子。对于互斥共享方式来说,我们比如说我们使用QQ和微信视频聊天,但是在同一时间段呢,我们只会允许摄像头给其中的一个进程使用。比如你用QQ和你的家人正在进行聊天,那么这个时候你还想用电脑的微信和你的小伙伴进行视频聊天的话,你就会发现这个视频是发不出去的,因为它会提示你说这个摄像头正在已经被分配给其他的进程。所以这就是所谓的互斥共享方式,在一个时间段内,摄像头这个资源他只能被分配给其中的一个进程使用。
  • 再来看第二个例子,同时共享方式。我们可能会遇到这样的情况,我们用QQ给某人发送文件A,然后用微信发送文件B。在宏观上看来,微信和QQ的这个文件发送的进度条都是一直在推进的,往前推进的。所以在用户宏观上看来,看起来两边都是在同时读取发送文件。这些文件它是被放在硬盘里的,那么在用户看来,就看起来就像是QQ和微信这两个进程都在同时访问硬盘这个资源,从中读取各自的文件数据。但事实上,微观上来看,这两个进程他们是交替的访问硬盘的,QQ先读出了文件A的某一个部分,然后微信又读出文件B的某一部分,接下来又交替着让QQ读文件A的下一部分,然后以此交替的访问这个硬盘。所以这就是所谓的微观上交替的访问这个硬盘资源的意思。所以这就是两个很典型的互斥共享和同时共享的例子。有的时候这个同时共享也有可能是微观上也确实在同时的共享这个资源,比如说你在玩游戏的时候一边听歌,那么你会发现你的扬声器这个声音输出设备一边在播放游戏的音效,同时还在播放音乐。所以在这种情况下,扬声器这个声音输出设备是真的在微观上也是同时正在被你的音乐播放器和游戏这两个进程同时使用的。所以这个地方稍微注意一下。
  • 那么我们再来…

image-20230817193129168

二、并发与共享的关系

  • 看一下并发和共享的关系。继续通过上面的例子来分析,用QQ发送文件A,微信发送文件B,那么就说明QQ和微信两个进程实际上是在并发的执行的,也就是有并发性。那么这两个进程需要同时完成这个发送文件的事情,所以他们需要共享地访问硬盘资源,这又体现了共享特性。如果我们的系统失去了并发性,就意味着在系统当中同一时间段只能有一个程序正在运行,那么也就意味着这两个进程就不需要同时共享来访问这个硬盘资源,这个共享性也就失去了存在的意义。

  • 而另一个角度来看,如果系统失去了共享性,那么QQ和微信这两个进程就没办法同时访问这个硬盘资源,所以他们也没办法完成同时发送文件这件事。既然如此,QQ和微信也就没办法并发地执行。所以我们可以看到,如果失去了并发性,那么共享性就失去了存在的意义。而如果失去了共享性,那么并发性就不可能被实现。所以并发和共享,我们才说他们是互为存在条件的。这就是开篇提到的一个知识点。

image-20230817193215594

三、虚拟

  • 好的,下面我们来讨论第3个特征:虚拟化,将物理实体映射为多个逻辑实体。这个概念可能对于初学者来说有点抽象,让我们通过一个实际的例子来解释。
  • 想象一下,当一个程序需要在计算机上运行时,它需要加载到内存中,并获得CPU的时间来执行。让我们以我特别喜欢的游戏GTA为例。官方数据显示,运行GTA需要4GB的内存。除了这个游戏,我的电脑上还运行着各种其他应用程序。然而,我的电脑只有4GB的内存,实际上,这些应用程序所需的内存总量远远超过了4GB。那么为什么它们可以同时在我的电脑上运行呢?这就是虚拟存储器技术的应用。尽管我的电脑只有4GB内存,即物理实体只有4GB内存,但在用户看来,它似乎有更多的内存可用。这就是虚拟化的一个例子。
  • 虚拟存储器技术是虚拟化技术的一种,允许有效地共享和管理计算机内存。在这个阶段,只需记住虚拟存储器和分页复用技术的概念,因为这两个知识点将在第三章中详细讨论。
  • 另一个例子是,在单核计算机上,用户可以同时运行QQ、等应用程序。尽管计算机只有一个单核CPU,这是物理实体,但在用户看来,它似乎有6个CPU在同时为它服务。这是虚拟处理器技术的应用。实际上,虚拟处理器技术将一个物理处理器划分成多个逻辑处理器,以同时执行多个任务。这也是虚拟化的一个典型例子。
  • 总的来说,虚拟技术将时间划分为小的时间片段,使处理器能够轮流为不同的进程提供服务。这是虚拟技术的核心思想。再次强调,虚拟存储器和虚拟处理器技术将在后续章节中更详细地讨论。

在这里插入图片描述

image-20230817193603673

三、虚拟技术两大类

  • 我们刚才讲了实现虚拟性的啊,这个虚拟技术分为空分复用技术和十分复用技术。然后很显然,我们如果说这个系统当中是这个操作系统失去了并发性,那么就意味着一个时间段呢只需要有一道程序在执行。那么从刚才我们分析的过程中可以看到,如果没有了并发性,那么这个十分复用技术和空分复用技术其实也没有存在的意义。那么我们也就是说,我们这个虚拟性也就没必要实现了。所以可以说没有并发性就谈不上虚拟性,虚拟性就没有存在的意义。最后,再来看第四个特性。

image-20230817193645580

四、异步

  • 异步是指多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停的,以不可预知的速度向前推进。用一个例子来帮助大家理解什么是一步。假设老渣现在要和两个女孩并发的约会,然后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号把老渣的心归还给老渣之后,系统才会接着执行第二道程序。在这种情况下,各个程序的执行肯定是会一贯到底的,不会走走停停。所以说只有系统拥有并发性,才有可能会导致我们之前所说的这个异步性。

image-20230817193737041

五、总结

  • 非常好,你已经对操作系统的四个基本特性进行了很好的总结。你理解了并发、共享、虚拟和异步这四个特性之间的相互关系,以及它们在操作系统中的重要性。
  • 在考试中,确实重点关注并发和共享的概念,因为它们是操作系统最基本的特性之一,同时也是其他特性的基础。你也明确指出了如果失去了并发和共享,虚拟和异步这两个特性就没有存在的意义,这表明你对这些概念有很好的理解。

在这里插入图片描述

No.3 操作系统的发展与分类

  • 在这个小节中我们会学习操作系统的发展历史和分类,那我们会按照各种类型的操作系统出现的时间顺序啊,来依次进行讲解。那在这个小节当中,重点会考察的是绿框部分的这些内容。所以,我们会重点讲解绿框部分。在学习的过程当中,大家需要重点关注和理解的是各类型的操作系统,他们主要想解决的是什么问题。然后要稍微关注一下他们各自的优缺点。这个有可能在选择题当中进行考察。

image-20230817194236723

一、手工操作阶段

  • 照各种类型的操作系统出现的时间顺序啊,来依次进行讲解。那在这个小节当中,重点会考察的是绿框部分的这些内容。所以,我们会重点讲解绿框部分。在学习的过程当中,大家需要重点关注和理解的是各类型的操作系统,他们主要想解决的是什么问题。然后要稍微关注一下他们各自的优缺点。这个有可能在选择题当中进行考察。
  • 接下来是关于第一个阶段的手工操作阶段的讲解。在这个阶段其实啊,操作系统还并没有诞生。程序员写程序是要写在这样的纸袋上的。可以看到这个纸袋上有一些小孔,那么有孔的地方代表的是二进制的一,没孔的地方代表的是二进制的0。所以,程序员通过在纸袋上打孔这样的方式,啊,写好了自己的程序。然后把自己的这个程序放到纸袋机上。然后,计算机从纸袋机当中读取啊,我们要运行的程序。等程序运行结束了之后,又把程序运行的结果再给输出到纸袋机上,之后再由程序员从纸袋机取走自己程序运行的结果。
  • 但是用手工操作的这种方式存在一个呃很明显的问题,就是程序员用手工的方式把纸袋装到纸袋机,或者从纸袋机取走自己的呃,这个程序运行结果的过程,其实是超级慢的。所以假设一个程序员此时要提交一个自己的作业,提交一个自己的程序让他运行的话,那么首先,程序员需要花很长的时间把自己的程序放到纸袋机上。之后,计算机需要把纸袋机上的这个程序数据给读到计算机里。而这个读取的过程也是一个很慢速的过程,也需要消耗不短的时间。但是计算机的计算速度,处理程序的速度是非常快的,所以其实计算机在计算的时候只需要花很短的时间就可以把这个程序运行结束了。
  • 那当程序运行完了之后,他又同样需要花比较长的时间把程序运行的结果输出到纸袋机上,之后程序员再把纸袋机上的结果再给用手工的方式取走。等第一个程序员把自己的呃,运行结果取走之后,才能由第二个程序员来接着使用计算机。那同样的,他首先需要把自己的程序放到纸袋机上,需要花很长的过程。接下来又从纸袋机读到计算机内,这也需要花不少的时间。但是同样的,计算机处理这个程序其实只需要花很短的时间。
  • 所以可以看到在手工操作阶段存在的主要的缺点就是用户独占拳击。在第一个程序员在自己的程序啊没有完全运行结束之前,是不允许第二个程序员和他同时使用计算机的。所以当他使用计算机的时候就是独占着使用。第二个很明显的缺点是,由于手工操作是一个很慢的过程,但是计算机计算又是很快的一个过程,因此这样的人机速度矛盾会导致啊资源的利用率极低。特别是计算机CPU的利用率极低。我们可以看到在这么长的一段时间内,其实CPU或者说计算机真正在忙碌在工作的时间只有这样一小段和这样一小段有很大的比例。这个计算机是处于空闲的状态的。但是在这个阶段,其实计算机的造价十分昂贵。所以让计算机这种昂贵的资源有大量时间处于空闲状态,那显然是一种很不经济很低效的一种方式。
  • 因此,为了解决这个问题…

image-20230817194620669

二、单道批处理系统

  • 当然,下面是你提供的文本内容的标点符号补全版本:
  • 人们发明了单道劈除处理系统。嗯,在这个阶段,人们引入了磁带输入输出技术。各个程序员可以把自己的程序都依次放到纸袋机上,然后会有一个叫做外围机,或者叫外围控制机的一个呃,专门的机器控制着,把这些纸袋机里的程序数据先把它放到呃磁带上。之后,计算机可以直接从这个磁带里读取这些程序的数据,而磁带的读写速度要比纸带机快很多。此时的计算机当中会运行着一个叫做监督程序的程序。由这个监督程序控制着,自动的从这些磁带当中输入输出作业的数据,而从磁带中输入输出作业其实是速度是要更快的。所以,引入了这种磁带输入输出技术之后,我们读取一个作业所需要花的时间比例就小了很多了。
  • 这个监督程序会控制着计算机自动的从磁带当中读入啊,第一个作业。这个读入的过程要比从纸袋机读入要快很多。接下来会进行程序的运算,再接下来进行输出输出到这个磁带上。等第一个作业完成之后,就可以开始紧接着读入第二个作业,然后计算再输出。那以此类推,可以看到,在引入了磁带输入输出技术之后,这个作业的输入输出过程所需要占的时间比例其实是降低了很多的。
  • 这样的话,就可以让CPU有更高比例的时间处于计算处于忙碌的状态,这就使CPU的资源利用率有一定的提升,缓解了一定程度上的人机速度矛盾。但是这种方式很显然,他的资源利用率依然是不够高的,内存中同一时刻只能有一道程序运行。只有这个程序运行结束,并且输出完成之后,才可以继续读入第二个程序,也就说各个程序之间,他们是串行着执行的。
  • 所以虽然比起上一个阶段,CPU利用率有所提升,但是这种方式依然会使CPU有大量的时间是在空闲等待的状态,资源利用率依然是很低的。因此,为了解决这个问题,人们就发明了多道处理系统。

image-20230817194810140

image-20230817194826236

三、多道批处理系统

  • 当一个用户把自己的作业提交了之后,接下来用户就只能干等着计算机把自己的作业处理完成。也就说,在多道批处理系统当中,用户是无法调试自己的程序的,也不可能在程序运行的过程中输入一些参数,这些事情都是无法实现的。所以,为了实现人机交互的功能,人们逐渐开始思考如何改进操作系统,使用户能够更灵活地使用计算机资源,同时也能够方便地与计算机进行交互。
  • 这就引出了下一个阶段,即交互式操作系统。交互式操作系统允许用户通过终端设备(如键盘和显示器)与计算机进行实时的交互。用户可以直接在终端上输入指令,操作系统会立即响应并执行相应的操作。这种方式使得用户能够更加灵活地使用计算机资源,能够方便地查看程序运行的中间结果,进行调试和修改。同时,交互式操作系统也提供了更好的用户体验,用户不再需要等待作业完成后才能获得结果,而是可以实时地与计算机进行交互,更好地掌握程序的运行状态。
  • 在交互式操作系统中,操作系统会负责管理多个用户的请求,并且根据优先级和调度算法来分配计算机资源。这种操作系统的引入进一步提高了资源的利用率,使计算机更加高效地工作。而且,用户也能够更好地体验到计算机的实时响应和交互性。
  • 总之,在操作系统的发展历程中,从最早的手工操作阶段,到引入了批处理系统和多道程序技术,再到交互式操作系统的出现,每个阶段都在不断地改进和创新,以适应不同的需求和挑战。不同阶段的操作系统都有其独特的特点和优缺点,这些改进也为我们现代计算机系统的高效运行提供了基础。

image-20230817195056003

四、分时操作系统

  • 当然,下面是你提供的文本经过标点符号补全后的版本:
  • 用发明了分时操作系统。在分时操作系统当中,嗯,计算机会以时间片为单位,轮流的为各个呃用户,或者说各个作业服务。而用户可以通过呃,像键盘啊,鼠标啊,等等这一类的终端,和计算机进行交互。比如说,这个计算机先给这个用户服务50毫秒,再给这个用户50毫秒,这个用户50毫秒。总之,在分时操作系统当中,各个用户可以轮流的得到服务。所以,分时操作系统的主要优点就是,用户的请求可以被及时的响应。有没有发现,我们之前举的老扎约会的例子,其实它就是一个分时操作系统。老扎以时间片为单位,轮流的为各个用户来服务。这样的话,各个用户的请求就可以被及时的响应。因为对于他们俩来说,至少每隔一个小时,肯定能够被老扎服务一次。所以他们的请求最多在一个小时之内,肯定可以被老扎响应。所以这种分时操作系统,使人机交互的问题得到了解决。并且允许多个用户同时使用一台计算机。他们对这个计算机的操作都是相互独立的。他们还感受不到别人的存在。在用户看来,似乎就像是自己独占拳击一样。那分时操作系统也存在一个明显的缺点,那就是他不能优先处理一些紧急的任务。这种操作系统对各个用户都是完全公平的。所以,为了能够让计算机优先的处理一些紧急任务,人们又提出了啊实施操作系统。

在这里插入图片描述

五、实时操作系统

  • 实时操作系统能够根据任务的优先级来优先的响应一些紧急任务。这种操作系统要求计算机在接收到一些紧急的信号之后,需要进行及时的处理,并且要在严格的时间限制内完成处理,保证处理结果的正确性。因此,这种操作系统的主要特点是即时性和可靠性。
  • 而实时操作系统又分为硬实时和软实时操作系统。比如像导弹控制系统、自动驾驶系统等,这类系统必须严格在规定的时间内完成相应的处理,否则会导致严重的问题,比如导弹偏航或自动驾驶汽车直接开进马路下面等等。
  • 另一种软实时操作系统则像我们熟悉的12306火车订票系统。这个系统要求网站上需要实时地显示剩余的票数,但即使偶尔更新不及时,也不会产生严重后果。
  • 所以,这种是软实时系统。除了刚才介绍的操作系统,还有一些其他类型的操作系统。

image-20230817195429328

六、其它操作系统

  • 网络操作系统、分布式操作系统和个人计算机操作系统等,大家只需要有一个简单的了解,自己阅读一下就可以。在我们的考试当中,一般会考察的是之前提到的那几种操作系统,所以这些就不再展开。
  • 好的,那么这个就是关于操作系统发展历史和分类的内容了。

image-20230817195511703

七、总结

  • 非常好!你对操作系统的发展历史和分类进行了很详细的介绍,强调了各种操作系统类型的特点、优点和缺点,以及它们解决的问题和采用的方式。记得在复习时,重点理解各种操作系统的核心概念和特点,以及它们在解决不同问题方面的应用。

image-20230817195540318

No.4 操作系统的运行机制

  • 在这个小节中,我们会学习操作系统的运行机制,也就是说,操作系统在计算机上是怎么运行的。这样一个问题,那这个小节中会涉及到这样的一些概念。我们会学习到两种类型的指令,然后两种处理机状态和两种程序,他们其实都是一一对应的。那具体我们会一层一层慢慢讲解,根据…

image-20230817195904847

一、两种程序

  • 在这个小节中,我们会学习操作系统的运行机制,也就是说,操作系统在计算机上是怎么运行的。这样一个问题,那这个小节中会涉及到这样的一些概念。我们会学习到两种类型的指令,然后两种处理机状态和两种程序,他们其实都是一一对应的。那具体我们会一层一层慢慢讲解,根据去年同学的反馈,很多跨考的同学认为这个小节是很难理解的。有时候会涉及到一些底层硬件的知识。除了跨考的同学之外,也有不少同学所报考的学校不考计算机组成原理这门课。所以在这个小节当中,我们必须要准备一些预备的知识,好让大家能够理解之后所讲解的内容。
  • 首先,我们要来解释一下程序在计算机硬件上底层是怎么运行的。其实像我们平时用 C 语言代码写的那些程序,都会经过编译器进行一个编译的工作,把这个 C 语言代码翻译成计算机能够听得懂的二进制代码,也就是机器指令。像我们平时用 C 语言这种高级语言写的一段代码,经过编译翻译之后可能会对应很多很多条机器指令。比如说,我们定义了一个 int 型的变量 x 等于一,并且对 x 进行了加加,也就是加一的操作。那么这样两行短短的代码,可能经过编译之后,形成的机器指令就会对应这么多条。当然,这个地方我也是随便胡乱写的,因为都是二进制数嘛,反正我们都看不懂。但是虽然我们看不懂这些二进制数,但是对于 CPU 对于计算机来说,这样的二进制代码才是它能够看得懂的一种语言。所以,我们这一段程序运行的过程,其实就是 CPU 把这些机器指令一条一条地执行的一个过程。而这些机器指令在背后实现的,其实就是我们用代码表示的这小段逻辑,只不过这种二进制的机器指令是 CPU 能看懂但是我们看不懂的。所以,这个地方所提到的所谓的机器指令,其实就是让处理器,也就是 CPU,能够识别并且执行的最基本的一个命令,比如说进行一个加法操作或者进行一个复制的操作等等。
  • 这个地方所谓的指令的概念比较容易和另一个概念进行混淆。很多同学在以前会习惯把 Linux、Windows 等等这种小黑框里输入的这种 LSCD 等等这样的命令称作为指令。但是其实这个小黑框里所用的这个命令,其实是我们之前提到过的交互式命令接口,它和我们这个小节所讲的指令是不一样的。我们这指的指令是指二进制的机器指令。所以大家需要对接下来所提到的指令进行一个区分。
  • 总之,我们平时用高级语言编写的这种程序,最后执行的时候,肯定是需要变成 CPU 能够读得懂的,用二进制的机器指令表现的这种形式。那么这就是程序运行的一个基本原理。在操作系统这门课当中,我们需要注意区分两种类型的程序,一种叫内核程序,一种叫应用程序。所谓的应用程序,就是跑在操作系统之上的,我们平时很熟悉很喜欢用的那些,比如说 QQ、微信等等等等。而像我们普通程序员写的程序,其实就是应用程序,是跑在操作系统之上的。但是还有一些人,比如说像微软、苹果,会有一帮人是负责开发操作系统的,这帮人写的那些程序,就是所谓的操作系统的内核程序。这帮人编写了很多很多的内核程序,这些内核程序最终组成了所谓的操作系统的内核,英文叫 kernel。这个内核就是操作系统最核心的部分,也是最接近硬件的部分。我们之前提到过,操作系统最重要的一个角色是他要作为系统资源的管理者,而操作系统对系统资源的管理工作其实就是在内核部分来实现的。我们甚至可以说,一个操作系统只要有内核就可以了,比如说,有的同学也许会接触过容器技术,比如说 Docker,在 Docker 容器里只需要有 Linux 的内核,其实就可以实现 Linux 的所有的功能了。而我们用户平时使用的操作系统,其实它包含的不只是内核的功能,比如说图形化的用户
  • 界面就不是放在内核当中实现的。即使没有图形化的用户界面,我们依然可以用命令行,也就是之前所提到的小黑框的那种方式来使用操作系统。
  • 所以,操作系统的内核当中所包含的只是操作系统当中最重要、最核心、最必不可少的那些功能。那既然操…

image-20230817200204197

image-20230817200244878

image-20230817200320173

二、两种指令

  • 操作系统内核它是系统资源的管理者。作为这样一个角色,有时候就有可能会让 CPU 执行一些比较特殊的指令,比如说内存清零的指令。这种指令会对其他程序的运行造成很严重的影响。像这样的特权指令,运行之后是有可能影响到其他程序的正常运行的。所以这样的特权指令就应该只允许我们系统的管理者,也就是操作系统内核来使用。
  • 也就是说,假如这一段程序是内核程序的话,那这些指令当中可以出现特权指令。而假如说这段程序是普通的应用程序的话,那么这其中就不应该包含特权指令,而只能使用非特权的指令,比如说让 CPU 做加减乘除运算的一系列的指令,就是非特权的指令。
  • 我们的 CPU 在设计和生产的时候,就划分了哪些指令是属于特权指令,哪些指令是属于非特权指令。所以,CPU 在拿到一条指令的时候,其实它是可以区分出它到底是特权指令还是非特权指令的。但问题就出现了,CPU 在执行程序的时候,它只会负责把这些指令一条一条地执行。虽然它能够分辨出哪些指令是特权指令,哪些指令是非特权指令,但是它又怎么分辨出此时正在执行的这个指令,它到底是一个应用程序的指令还是一个内核程序的指令呢?
  • 接下来我们要研究的就是这个问题。

image-20230817200501971

三、两种处理器状态

  • 为了让 CPU 能够区分此时正在运行的指令是属于应用程序还是内核程序,CPU 会被划分成两种状态:一种叫内核态,一种叫用户态。当 CPU 处于内核态的时候,说明此时 CPU 正在运行的是内核程序,那在这个时候是可以执行特权指令的。而如果 CPU 处于用户态,那么说明此时 CPU 正在运行的是应用程序,那此时 CPU 就只能执行非特权指令。

  • 那么怎么区分 CPU 到底处于哪种状态呢?在 CPU 当中会有一个寄存器,也就是一个存储数据的地方,叫做程序状态寄存器,英文缩写叫 PSW。然后这个寄存器当中会有一个二进制位。这个二进制位为1的时候,表示 CPU 此时是处于内核态的;而二进制为0的时候,表示 CPU 此时处于用户态。当然,也有一些 CPU 有可能是0表示内核态,1表示用户态,但这个无关紧要,我们只需要知道用二进制的方式就可以实现对 CPU 状态的一个标记。

  • 用户态和内核态还有各自的别名。用户态又可以叫作用户模式,然后内核态又可以叫作管态。这两个术语大家也需要注意一下。

    接下来我们要探讨的问题是,CPU 要怎么实现这两种状态之间的切换。我们直接用…

image-20230817200610799

image-20230817200835285

四、状态切换过程

  • 一个例子,让大家看一下 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的使用权时,也可以通过中断这种方式来实现。结合上一小节中的例子,相信这个概念已经不难理解了。接下来,我们要看的是…

image-20230817201646933

二、中断的类型

  • 中断有哪些种类型呢?一种叫做内中断,另一种叫做外中断。内中断的产生与当前执行的指令有关,中断信号来源于CPU内部。而外中断则恰恰相反,它和当前执行的指令无关,中断信号来源于CPU的外部。
  • 首先,让我们来看几个内中断的例子。

image-20230817201731304

1、内中断

  • 也就是说,这种中断的产生与当前执行的指令有关。举个例子,就像上一小节中提到的情况,一个应用程序在用户态下运行,CPU按照指令顺序逐步处理。但是,如果一个猥琐的黑客试图在应用程序中插入特权指令,CPU读取到这条特权指令时会发现当前处于用户态,正在运行应用程序。这种非法事件会触发一个中断信号,CPU会拒绝执行该特权指令,然后自动切换为内核态,开始执行处理中断信号的内核程序。这样,系统的管理者重新夺回了CPU的控制权。因此,这是一个典型的内中断例子,CPU在执行当前指令时由于该指令引发了中断而被打断。
  • 有时候,即使CPU执行的是非特权指令,也可能会引发内中断。例如,当CPU执行除法指令时,发现除数为0,显然不能继续执行,因此这种情况也会引发内中断。
  • 总之,如果当前执行的指令本身非法,或者指令的某些参数非法,就会产生一个内中断信号。接下来,我们继续看另一个内中断的例子。

image-20230817201832977

  • 当一个应用程序运行在用户态时,有时它希望请求操作系统内核提供一些服务。在这种情况下,应用程序会执行一条特殊的指令,称为陷入指令。这个指令会引发一个内部中断信号,随后CPU会转向这个中断信号对应的处理程序,进行中断信号的处理。因此,当应用程序执行陷入指令时,意味着它主动将CPU的使用权还给操作系统内核,以便操作系统为其提供所需的服务。这就是我们之前提到的系统调用,实际上就是通过这个陷入指令来完成的。
  • 需要强调的一点是,陷入指令是一种特殊的指令,但并不是特权指令。因为我们可以思考一下,这个应用程序是运行在用户态下的吗?既然在用户态下可以执行陷入指令,那么这个指令肯定也不是特权指令。
  • 总之,刚才提到的这个中断信号实际上与当前执行的指令是有关的。这个中断信号是来自于CPU的内部。接下来,我们将看一些更多的例子来进一步理解中断和异常。

image-20230817201920747

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在每一个指令执行结束的时候都会例行地检查一下是否有外部中断的信号需要我来处理。好的,那么刚才我进行了标点符号的补全,希望对您有所帮助。

image-20230817202321370

三、中断的分类

  • 以下是你提供的文本补全后的结果:
  • 我们列举了一些内中断和外中断的例子,相信通过这些例子,大家可以更直观地感受到中断这种机制的一个强大的作用。那我们要分辨一个中断是内中断还是外中断,只需要判断啊这个中断信号的产生和当前执行的指令是否有关就可以了。那刚才我们讲解的过程中使用的是内中段和外中段这两个术语,因为内外这两个形容词可以让大家很形象地理解到他们俩之间的一个本质的区别。不过其实在很多教材还有很多学校的考试当中,内中断一般会称为异常,外中断一般就直接称为中断。所以考试当中遇到的中断一般来说是这个狭义的中断,他特指外中断。而我们这个小节当中之前一直在说的中断,其实指的是这种广义的中断。所以大家要理解他们的区别可以用内外这两种方式来理解。但是在做题的过程当中,更需要注意的是中断和异常这两个术语。那在接下来的讲解中,我们会经常使用到异常这个术语。大家需要呃知道,它其实指的就是内中断。那么异常又可以进一步地划分为这样的三种。
  • 第一种叫做陷入Trap。这个其实就是刚才我们所提到的由陷入指令引发的那种异常。其实这种异常是程序故意引发的,当一个程序想要请求操作系统的服务的时候,他就会故意的执行这一条指令。那其实这也是系统调用实现的一个原理,而系统调用的内容我们会在下一小节再啊继续展开。
  • 第二种异常称为故障故障,是一种由错误条件引起的,并且可能被内核程序修复的问题。内核程序修复故障之后会把CPU的使用权还给应用程序,让他继续执行下去。比如说我们在第三章当中会学习到的缺液故障,那这个地方啊大家暂时理解不了没有关系,等学完了第三章再回来呃细细品味。
  • 第三种异常叫做中指终止,是由致命的错误引起的。这种错误一般是内核程序无法修复的,所以一般来说当发生了这种类型的异常之后,内核程序就呃不会再把CPU的使用权还给引发终止的那个应用。应用程序啊一般来说会直接的把这个应用程序直接给干掉,让他终止掉。比如说刚才我们提到了两个例子,整数除以0这种错误,那其实就是程序bug,也不是操作系统能够修复的,那是程序本身的问题或者非法的使用特权指令。那这样的程序也应该直接把它干掉,不应该再把CPU的使用权再还给他。所以这是第三种终止。那异常或者说内中断的这3种分类方式啊大家需要注意一下曾经考过。那么那么以上就是中断的一个分类。

在这里插入图片描述

四、中断机制的基本原理

  • 接下来我们要简单地介绍一下中断机制背后的基本原理。刚才我们举了各种各样的中断的例子,有的中断是整数除以0,有的中断是时钟部件引起的,而有的中断又是应用程序自己引发的。那很显然这么多的中断的类型不可能用同一个程序来处理,所以CPU会根据中断信号的不同来找到,和这个中断信号相对应的中断处理程序。
  • 具体的做法是,CPU在检测到中断信号之后,会根据这个中断信号的类型来查询中断向量表,然后通过这个中断向量表找到各种类型的中断所对应的中断处理程序。很显然,我们之前讲了那么多例子,大家应该也能够想到,中断处理程序它其实就是一种运行在内核态的内核程序。
  • 那么,这就是中断机制的一个基本的实现原理。但是具体的硬件上应该怎么实现,这是计算机组成原理那门课要教大家的。如果不考那门课的同学,其实理解到这就差不多了。
  • 好的,那么这个小节当中我们介绍了中断和异常,中断的作用时。

image-20230817202624272

五、总结

  • 十分重要。中断是让CPU从用户态变回内核态的一种唯一方式,也是让操作系统强制夺回CPU控制权的一种方式。引入了中断机制之后,操作系统才能正常工作,实现多道程序并发运行这一美好目标。
  • 中断的分类是一个重要知识点,大家可以通过课后习题来巩固学习。最后,我们简要提了一下中断机制的基本实现原理,总结为以下两个步骤:
    1. CPU首先检查中断信号。对于内中断信号,CPU在执行指令时会检查是否有异常发生;而对于外中断信号的检查,在每个指令周期的末尾,也就是CPU执行完一条指令后,会例行检查是否有外部中断信号需要处理。
    2. 当CPU检测到中断信号后,根据这个信号查询中断向量表,找到对应类型的中断处理程序进行处理。

image-20230817202709943

No.6 系统调用

  • 在这个小节中,我们会学习系统调用相关的知识。我们会为大家介绍什么是系统调用,它和库函数的区别,并且用一个小例子来直观地感受到系统调用为什么是必须的。最后,我们会介绍哪些功能需要由系统调用实现,以及系统调用背后的具体过程是什么样的。

在这里插入图片描述

一、什么是系统调用

  • 第一个问题,什么是系统调用?这个其实在第一个小节当中就有介绍过。操作系统作为用户和计算机之间的接口,需要向上提供一些简单的应用服务。给用户使用的就是命令接口 GUI,而程序接口又由一堆系统调用组成。所以,其实系统调用就是应用程序员请求操作系统内核服务的一个途径。它和我们平时编程的时候使用的函数调用其实是很类似的。但是,系统调用又和普通的库函数的调用又有一定的区别。其实我们在…

image-20230817203422159

二、系统调用和库函数的区别

  • 写程序的时候,是可以使用汇编语言的方式直接请求这个系统调用服务的。但是现在的编程更多地使用高级语言来编程,所以我们一般会直接使用那些高级语言提供的库函数。然而,这些高级语言的库函数在底层实现中其实也会利用操作系统提供的系统调用功能,通过请求操作系统的服务来完成操作。
  • 因此,系统调用可以被看作是比高级语言的库函数更为底层的接口。在系统的层级中,裸机之上是操作系统,操作系统向上层提供的接口就是系统调用。这使得上层的库函数可以通过系统调用的方式来请求操作系统的内核服务。然后,各种高级编程语言会用库函数的方式封装这些系统调用,向更上层的应用程序程序员暴露更友好的编程接口。
  • 然而,并不是所有的库函数在底层都会使用系统调用。许多库函数,比如C语言中的数学运算相关的库函数,像绝对值等,不需要特权指令就可以完成其功能。因此,这些库函数在底层并不需要使用系统调用。
  • 然而,有些库函数,比如创建一个新文件,必须请求操作系统内核的服务才能完成。对于这类需要操作系统内核服务的库函数,它在底层肯定需要使用操作系统提供的系统调用服务。因此,这就是系统调用和库函数之间的一个区别。

在这里插入图片描述

三、为什么系统调用是必须的

  • 那接下来,我们用一个小例子来感受一下为什么系统调用是必须的,来描绘一个这样的场景:你去学校的打印店去打印论文,然后用WPS这个程序点下了打印按钮,之后打印机就会开始工作。但是当你的论文打印到一半的时候,另一个同学用Word也按下了打印按钮,请求打印他自己的论文。那么,我们知道WPS和Word在这个电脑里,这个系统当中,其实是两个正在并发运行的进程。所以
  • 如果这两个进程能够随意地并发地来共享使用打印机资源的话,就会发生这样的情况:由于两个进程交替地并发地向打印机提出打印的请求命令,那么打印机设备就会交替地收到这两个进程发来的这打印请求。那这样的话,打印机就会把这两篇论文的内容给混杂在一起打印,先打印一行这个再打印一行这个。那这显然不是我们想要得到的结果。
  • 所以,由于系统当中有各种各样的并发的进程,而这些并发的进程又需要共享使用类似于打印机设备这样的共享资源。但是这样的共享资源其实是需要各个进程互斥地共享的。那怎么实现对共享资源的互斥访问呢?最好的方式就是让操作系统内核,也就是这个系统的管理者,来对共享资源进行统一的管理。然后,上层的那些应用程序只能通过系统调用的方式来请求操作系统给他们分配这种资源。之后,这个进程才可以对这种共享资源进行使用和访问。而各个进程的请求会由操作系统内核来协调处理,保证他们并发运行的时候不会发生这种奇奇怪怪的事情。因此,从这个例子当中,我们就可以看到系统调用的功能是必须存在的。

在这里插入图片描述

四、什么功能要用到系统调用?

  • 上面给出了,呃,系统调用按功能分类,可以分为这样的一些系统调用,比如设备管理、文件控制等等等等。这个就不再展开,大家自己看一下有个印象就可以。然后,有兴趣的同学可以去百度搜索一下Linux的系统调用,可以看一下Linux操作系统向上提供了哪些系统调用。
  • 那到底哪些功能需要用系统调用的方式,呃,对外提供呢?其实都有一个共同的特点,凡是和共享资源有关的操作,比如说像对内存的这种分配与回收,内存是一种共享资源;IO设备也是一种共享资源;文件也是共享资源。总之,只要是对共享资源的访问,那肯定是需要通过系统调用来进行,因为这些共享资源是有限的,所以操作系统会对这些共享资源进行统一的管理和分配。因此,应用程序在使用这些资源的时候,就必须通过系统调用的方式请求操作系统内核,来帮他进行接下来的处理。这样的话,我们就可以保证系统的稳定性和安全性,防止非法操作。相信通过之前打印机的例子,大家能够有呃比较直观的体会。
  • 那么,假设一个…

image-20230817203813098

五、系统调用的过程

  • 当一个应用程序想要进行系统调用时,背后需要进行一系列的步骤。我们来看一下一个运行在用户态的应用程序,它的各个指令会被CPU依次执行。当应用程序想要发出系统调用时,它需要使用传参的指令将一些必要的参数传递给CPU的寄存器。举例来说,可能在某个寄存器中放入了一个参数一,这个参数一指明了应用程序想要进行哪种类型的系统调用,就像Linux中的Fork系统调用。传递参数的指令可能会有多条,这取决于该系统调用需要传递几个参数。
  • 操作系统会根据应用程序提供的这些参数来判断,应用程序想要的是哪种类型的服务。当这些参数都放入寄存器后,应用程序会执行一条特殊的指令,称为陷入指令。在上一小节中我们也提到过这个陷入指令。陷入指令的执行会引发一个内部中断。当CPU检测到这个内部中断信号后,发现这个中断信号是由Trap指令引起的。于是CPU会暂停运行应用程序,转而执行处理线路指令的那个处理程序。这个程序被称为系统调用入口程序。
  • 显然,要执行这个入口程序,CPU需要处于内核态下运行。可以认为这个程序也是一种中断处理程序,只不过它处理的是由陷入指令引发的那个中断。接下来,系统调用入口程序会检查计算器中的这些参数,通过第一个参数,它会确定此时应用程序想要的是哪种类型的系统调用服务。于是,入口程序会调用与特定系统调用类型相对应的处理程序,然后让这个程序在CPU上运行。
  • 在执行系统调用处理程序时,可以根据应用程序传递的其他参数来确定需要的具体服务。当系统调用处理完毕后,CPU会转回用户态,然后继续执行之前的应用程序。通过刚才的这个过程,相信大家对系统调用背后的过程有了一个比较直观的体会。我们在这个过程中可以看到,系统调用的功能是必须的,它确保了应用程序对共享资源的有序访问,保障了系统的稳定性和安全性,防止了奇怪的错误发生。

image-20230817204158343

六、系统调用的过程

  • 当我们将之前的库函数和系统调用串在一起时,普通的程序员可以使用高级编程语言编写自己的代码。在代码中,可以调用高级编程语言提供的库函数。然而,一些库函数内部实际上会使用操作系统提供的系统调用。具体来说,系统调用的过程需要先传递系统调用所需的参数。接着,应用程序会执行一条特殊的指令,即陷入指令,通过这个指令,应用程序将CPU的控制权主动交还给操作系统内核,以请求操作系统内核的服务。执行陷入指令后,会触发一个内中断,将CPU转向执行处理系统调用的内核程序。这个内核程序需要在核心态下运行,而它实际上也可以看作某种中断处理程序,只不过处理的是由陷入指令引发的中断。
  • 当系统调用处理完成后,CPU会返回原先的应用程序,继续执行下面的指令。在这个过程中,有一些可能作为考点的小细节需要注意。首先,陷入指令实际上在用户态下执行,它是一条非常特殊但并非特权指令。执行这个指令后,会主动引发一个内中断,将CPU切换到核心态以运行内核程序。第二点需要注意的是,我们发出系统调用请求的动作是在用户态下进行的,但是对系统调用的响应处理是在核心态下完成的。最后,我们还需要注意陷入指令的另外两种名称,它也被称为Trap指令或房管指令。在不同的教材中,可能使用不同的术语,但需要知道这些术语指的是同一个事物。
  • 好的,这个小节中我们已经对系统调用的工作过程有了更深入的理解。

image-20230817204415469

七、总结

  • 介绍了系统调用相关的知识。大家要能够理解系统调用和库函数它们的区别。另外,大家需要注意在系统中有各种各样并发的进程,这些进程会争夺着使用各种各样的系统资源。那么这些资源应该由操作系统来统一的掌管。所以,只要涉及对共享资源的访问操作,肯定需要用系统调用的方式来实现。这一点,大家随着后面的章节学习会越来越深入理解,而不需要死记硬背。
  • 在本节中,我们还需要重点掌握系统调用背后的一个过程。这个过程中需要注意一条非常特殊的指令,叫做陷入指令,也可以称为Trap指令或者房管指令。当一个应用程序执行了陷入指令,意味着这个应用程序主动将CPU的控制权交还给操作系统,用这种方式来请求操作系统的服务。这个过程中,应用程序会触发一个内中断,然后CPU会切换执行一个处理系统调用的内核程序。这个内核程序通常需要在核心态下运行,因为它涉及操作系统的底层操作。
  • 需要注意的是,我们提到的陷入指令也可以称为线路指令或者房管指令,不同教材可能使用不同的术语,但都指向同一个概念。
  • 在接下来的学习中,大家会更深入地理解这些概念。这些知识将帮助我们更好地理解操作系统的运行原理和实现机制

image-20230817204445799

No.7 操作系统的体系结构

  • 我们会学习操作系统的体系结构,也就是,操作系统的内核应该怎么设计,这样一个问题,那这个小节的内容,我们只需要做简要的了解就可以了,我们考试中,常考的是这样的两种体系结构,一种叫大内核一种叫微内核,那经过我们之前的学习我们知,

image-20230819155652778

一、操作系统的内核

  • 计算机系统的层次结构如前所述,但在操作系统内部,还可以进一步划分为内核功能和非内核功能两部分。操作系统的核心功能必须置于内核中,例如时钟管理、中断处理和我们将在后续学习的进程管理、存储器管理、设备管理等。这些功能都必须位于操作系统内核中。
  • 时钟管理,正如之前提到的,使用时钟中断来实现计算机的计时功能。实现程序的并发性必不可少,时钟管理是一个非常重要的内核功能。关于中断处理,不再赘述,之前已经举了很多例子。
  • 此外,还有一种特殊的程序叫做原语。原语程序具有原子性,也就是说它们要么完全运行完成,要么不运行。其执行过程是不可被中断的。即使在执行原语程序的过程中有外部中断信号发生,CPU也会继续执行完原语程序,然后再处理外部中断信号。
  • 总之,这三个内核功能与硬件密切相关,因此它们必须位于操作系统的内核中。像Ubuntu、CentOS等广为人知的Linux操作系统,它们的开发团队主要负责实现非内核功能,而内核部分通常采用Linux内核。
  • 对于初学者来说,如果对这些概念不太了解,也没关系,不需要深究。总之,内核是操作系统的核心部分。

image-20230819155729366

  • 操作系统的核心部分由一系列内核程序组成,这些程序必须在内核态运行。正如之前提到的,最底层的三个部分与硬件密切相关,因此它们必须放在内核中。此外,还有一些管理相关的功能,如进程管理和存储器管理。对于这些功能的管理,更多涉及数据结构的操作,而不直接涉及硬件。
  • 因此,有些操作系统选择不将这些管理功能包含在内核中,仅在内核中保留与硬件关系最密切的部分。这引出了两种截然不同的内核设计方法。将所有这些功能都包含在操作系统内核中的结构称为大内核。而如果内核仅保留与硬件关系最密切的部分,这种内核称为微内核。
  • 需要注意的是,如果采用微内核结构,内核的这些功能需要在内核态运行,而不属于内核的功能需要在用户态运行。这可能会对系统性能产生一定的影响。通过更具体的例子,我们可以更好地理解这一点。

image-20230819155800438

二、操作系统的两种体系结构

  • 假设现在有两种体系结构的系统。第一个系统采用大内核的体系结构,其中进程管理、存储管理等功能都被划分在内核中,因此这些功能的处理都需要在内核态下运行,而应用程序在用户态下运行。对于采用微内核结构的操作系统,只有与硬件联系最紧密的功能被划分在内核中,并且只有这些功能需要在内核态下执行,其他功能模块可以在用户态下运行。
  • 现在让我们看一个故事,假设一个应用程序想要请求操作系统的服务,并且这个服务需要涉及进程管理、存储管理和设备管理这几个功能。如果采用大内核的体系结构,应用程序向操作系统提出服务请求时,CPU会从用户态切换到内核态,然后开始运行一系列内核程序。而如果采用微内核的体系结构,应用程序向操作系统提出服务请求后,操作系统的这几个模块都需要为应用程序提供服务,而进程管理模块在处理应用程序的请求时也需要内核的支持。因此,这个模块需要访问内核,涉及CPU从用户态切换到内核态。服务完成后,再次从内核态切换回用户态。同样,存储管理和设备管理这两个模块在完成相应工作时也需要内核的支持。因此,每个模块都需要请求内核的服务,每次请求内核服务都会涉及CPU状态切换的过程。因此,如果采用大内核的体系结构,应用程序的请求只需要两次状态转换。而采用微内核的体系结构,则需要进行6次状态转换。需要注意的是,CPU状态切换的过程实际上是需要成本的,它会消耗相当多的时间。因此,频繁切换CPU状态会降低系统性能。在这里需要强调的是,考试时不要使用“变态”这个词,这只是为了方便描述而使用的一种方式。在考试答题时,请使用更正式的术语,如CPU状态切换。

image-20230819155852006

三、总结

  • 操作系统的体系结构可以分为大内核和微内核。通过刚才的例子,相信大家也能够理解它们之间的区别。大内核的优点是性能较高,因为应用程序在请求内核服务时,状态转换的次数较少。而微内核的缺点是需要频繁在核心态和用户态之间切换,因此性能较低。不过,微内核的优点在于它的内核功能较少,因此结构清晰,方便程序员维护。相比之下,大内核将许多功能都放在内核中,导致内核代码较庞大,结构混乱,难以维护。
  • 典型的大内核操作系统,如Linux和Unix,都采用大内核体系结构。微内核操作系统的代表可以参考Windows NT。需要注意的是,这些内容并不是考试的重点,考试时只会考察这两种体系结构的优缺点。大家只需对其有个基本印象即可。

image-20230819155920558

No.8 操作系统的引导

  • 我们将学习操作系统的引导过程。你可能对这个词汇感到陌生,不太明白什么是操作系统的引导。简而言之,当你开机时,操作系统是如何启动并在你的电脑上运行的,这就是操作系统引导的功能。为了更清楚地解释这个问题,我们首先会介绍在你的硬盘中与操作系统引导相关的数据。了解这些内容后,我们将详细介绍操作系统引导的具体过程。

image-20230819160116245

一、操作系统的引导

  • 在新磁盘内部,最初是空的,就像你的钱包一样。作为计算机专业的学生,我们应该能够将新磁盘安装到计算机主板上。然后,我们可以在这个磁盘上安装操作系统。一旦操作系统安装完成,你的磁盘可能会包含以下内容。
  • 首先,你可能会熟悉C、D、E、F等盘符,其中操作系统通常安装在C盘上。除了这些可见的磁盘分区外,磁盘的开始位置还有一个区域,用于存储主引导记录(MBR)。这个区域包含两个重要的组成部分:磁盘引导程序和分区表。磁盘引导程序负责启动操作系统,而分区表是一个数据结构,描述了每个分区的大小和地址范围。
  • 在C盘内,你的操作系统安装并启动。因此,我们可以将C盘称为活动分区。此外,C盘内部包含两个特殊部分:引导记录区域(PBR)和根目录相关的数据。引导记录区域用于引导系统,而根目录包含文件夹和文件。
  • 现在,我们已经了解了安装了操作系统的磁盘内部的大致结构和C盘的内部内容。接下来,我们将了解操作系统是如何一步一步启动的。操作系统启动的过程如下。

image-20230819160159714

image-20230819160220994

二、开机过程

  • 数据肯定需要存储在储存设备中。计算机的存储包括RAM和ROM两个部分。我们通常提到的手机内存或电脑内存指的是RAM。除了RAM外,计算机主板上还集成了ROM芯片。ROM中存储了一个名为BYOS(基本输入输出系统)的程序集合。BYOS由多个程序组成,其中最重要的是ROM引导程序,也称为自举程序。

  • 需要注意的是,RAM芯片中的数据在关机或断电后会被清空,而ROM芯片中的数据不会丢失。因此,当计算机上电时,CPU可以访问ROM中固定的地址,以找到ROM引导程序,然后执行其中的指令。ROM引导程序的作用是指导CPU将磁盘的主引导记录读入RAM。主引导记录包含分区表和磁盘引导程序。CPU现在可以执行RAM中的磁盘引导程序。根据分区表,磁盘引导程序确定C盘的位置,并读取C盘的引导记录。引导记录本质上也是一个程序,CPU执行后会找到启动管理器。启动管理器通常存储在根目录下的特定位置。CPU继续执行启动管理器,这个程序负责完成操作系统的初始化工作。

    因此,操作系统引导可以分为四个主要步骤:

    1. CPU从特定存储地址开始执行ROM引导程序,执行硬件自检。
    2. ROM引导程序读取主引导记录,执行磁盘引导程序,扫描分区表并找到活动分区。
    3. 磁盘引导程序读取活动分区的引导记录,执行其中的程序。
    4. 引导记录程序从根目录中找到操作系统初始化程序,继续执行操作系统的初始化。

    这就是操作系统引导的过程。希望通过这些信息,大家能更好地理解。

image-20230819160301139

三、例子

  • 如果你使用的是Windows操作系统,你可以找到C盘下的一个名为"Windows"的文件夹。在这个文件夹中,你会找到一个名为"boot"的文件夹,其中包含了刚才提到的操作系统初始化程序相关的内容。因此,我们刚才提到的第4步本质上是从C盘的根目录出发,寻找操作系统初始化程序,然后依次执行这些程序,以完成开机过程。
  • 当你在开机时看到计算机正在启动,屏幕上出现"正在启动"等信息时,实际上是在执行这些操作。如果你对此感兴趣,可以自行查看你的计算机,将理论与实践相结合,这将有助于更牢固地记住这些知识,并增加对这一学科的兴趣。
  • 以上是本小节的全部内容。

image-20230819160341050

No.9虚拟机

一、传统计算机

  • 我们来介绍虚拟机的概念:
  • 首先看一下传统的计算机,传统的计算机在一个物理机器上只能运行一个操作系统,操作系统之上又可以运行各种各样的用户进程,那这看起来似乎是很合理的,但是在有的商业化的环境当中,这会导致硬件资源利用率不充分的一个问题:比如你拥有一个非常强大的一个物理机性能很好,但是由于这台机器上他只能运行一个操作系统,那么你的这台机器如果说你想要租给其他人使用的话,那其他人的这个要运行的东西只能在同一个操作系统之上运行。比如说王者荣耀的这个游戏服务器和吃鸡的那个游戏服务器他必须放在同一个操作系统之上来运行,但两个进程他们在同一个操作系统之上是不是有可能会有一些安全隐患?他们之间可能会相互影响也会相互的争夺操作系统管理的这些资源。
  • 所以在商业环境当中两个应用让他们同时在一个操作系统上运行这可能会造成一些隐患,那一种解决方法是:我们把其中一个应用把它迁移到另一台物理机器上,然后这台物理机器上有一个独立的操作系统。那这样两个应用就不可能相互影响对吧,但是这又会导致物理机器硬件资源的极大浪费,刚才说很多商业级的这种物理机器它的性能是很强的,我的这个硬件性能本来可以同时支持你们两个进程的使用绰绰有余,但是为了安全起见我又不得不浪费把其中一个进程迁移到另一台机器上去运行,所以传统的这种结构一个机器上只能安装一个操作系统会带来很多应用上的限制。

image-20230805155609308

二、虚拟机

  • 因此就有人发明了虚拟机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的应用程序给大家做,这样的演示好所以第二类的虚拟机管理程序它并不是直接运行在硬件之上而是运行在宿主操作系统上面,这个虚拟机管理程序想要给各个虚拟机器分配硬件资源,那么他只能请求操作系统给他分配然后再由这个虚拟机管理程序进行再分配硬件资源的管理者,依然是宿主操作系统。

在这里插入图片描述

三、两类虚拟机对比

  • 这里有两类虚拟机管理程序,它们的思想和实现方式不同,因此存在一些特性上的差异。首先,让我们总结一下它们之间的不同之处。
  • 第一类虚拟机管理程序直接运行在硬件之上,因此具有直接控制和分配物理硬件资源的能力。相反,第二类虚拟机管理程序运行在宿主操作系统之上,依赖宿主操作系统来分配物理资源。它必须向宿主操作系统请求物理资源的分配。
  • 这两类虚拟机管理程序在向上层的客户操作系统分配资源时也存在差异。例如,第一类虚拟机管理程序在安装客户操作系统时可以直接在硬盘上划分存储空间。相比之下,第二类虚拟机管理程序需要向宿主操作系统申请抽象后的物理资源。宿主操作系统会创建一个虚拟磁盘文件,该文件实际上是一个大文件,并将其分配给虚拟机管理程序。虚拟机管理程序将这个虚拟磁盘分配给虚拟机,使虚拟机以为它拥有了真正的磁盘存储空间。
  • 类似地,对于内存的分配也存在类似的差异。第二类虚拟机管理程序向宿主操作系统请求分配一块内存空间,但实际上这块内存是虚拟内存,不一定是连续存储的。虚拟机管理程序将这块虚拟内存拆分分配给不同的虚拟机。因此,它增加了一层虚拟化,每一层都需要进行地址映射,这可能导致性能下降。
  • 总的来说,第一类虚拟机管理程序通常具有更好的性能,因为它们减少了多层虚拟化的复杂性,而第二类虚拟机管理程序通常需要通过宿主操作系统作为中介来访问硬件资源,因此性能较差。

image-20230805155721784

  • 另一个方面在一台机器它的硬件资源确定固定不变的情况下,第一类的虚拟机管理程序往往可以支持更多台的虚拟机因为第一类的这个虚拟机管理程序他拥有所有的硬件资源对吧,而第二类的虚拟机管理程序他自己的资源需要跟宿主操作系统申请那宿主操作系统他本身也需要一些硬件资源,同时他上面的这些进程也需要使用一些硬件资源可以在硬件资源相同的情况下显然第一类的这个虚拟机管理程序可以支持更多台的虚拟机,这是可以支持的虚拟机数量
  • 接下来虚拟机的可迁移性:第一类的虚拟机管理程序要迁移虚拟机比如要把这台虚拟机器迁移到另一个虚拟机管理程序之上那这个迁移的动作是比较麻烦的而第二类的虚拟机管理程序要迁移一台虚拟机就非常方便,比如我自己的这个虚拟机管理程序上我要迁移这个Linux操作系统我要把我的这个操作系统给你用,那么我只需要把这个操作系统导出导出为ISO就是镜像文件,然后你直接把我这个镜像文件考过去,在你自己的Virtual box上面一加载一安装你就可以使用到跟我这边完全一样的操作系统了,包括我在我的这个客户操作系统上安装的一些程序或者数据什么的都可以一起打包给你,然后你可以很方便的迁移到你自己的Virtual box上所以这是由于它的可迁移性好,所以第二类的这个虚拟机管理程序它的商业化应用目前来看是更广泛一些的,使用起来会很灵活

image-20230805155739401

  • 在运行模式方面,有两类虚拟机管理程序。第一类虚拟机管理程序在最高特权级别(0环)运行,可以使用最高特权级别的指令。近年来,CPU的指令特权级别可能会进行更多层次的划分,例如0级、1级、2级、3级等,其中0级特权级别最高。这里我们指的是第一类虚拟机管理程序运行在0环的最高特权级别,可以使用最高特权级别的指令。
  • 将指令分为更多特权级别是有好处的。如果指令仅分为非特权指令和特权指令,那么每次使用特权指令都需要虚拟机管理程序拦截并验证其合法性,然后模拟执行特权指令的效果。然而,如果对指令的特权级别进行更精细的分类,可以将虚拟机管理程序运行在最高特权级别(0环),并将客户操作系统内核运行在次高特权级别(1环),然后将用户进程运行在较低特权级别(2环),这将确保当客户操作系统使用2环和1环的指令时,虚拟机管理程序不需要干预,可以直接执行。只有在需要使用0环指令时,虚拟机管理程序才会检查其执行,以确保安全性等。
  • 此外,第二类虚拟机管理程序一部分运行在用户态,一部分运行在内核态。内核态的部分以虚拟机驱动程序的方式加载到操作系统内核中。当上层应用程序发出系统调用(例如write系统调用)时,上层操作系统无法直接访问磁盘。用户进程的系统调用将被虚拟机管理程序拦截,然后由虚拟机管理程序进行处理,代替其发出write系统调用以请求底层宿主操作系统的服务。因此,第二类虚拟机管理程序的性能肯定会较差,因为宿主操作系统总是作为一个工具人和中介被使用。

image-20230805155757567

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值