第一章 操作系统概述

操作系统的概念、功能和目标

操作系统的概念

首先,厂家把电脑需要使用到的一系列硬件组装起来,形成一台裸机

裸机在出售前,需要安装进操作系统

用户购买到安装了操作系统的电脑,就可以给电脑安装一些常用的应用程序

程序员还可以通过编写程序来调用操作系统提供的一些接口,来直接对操作系统进行操作

操作系统(Operating System, OS)可以控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件

  • 操作系统是系统资源(硬件资源和软件资源)的管理者
  • 操作系统需要向上层(用户和应用程序)提供方便易用的服务
  • 操作系统是最接近硬件的软件

操作系统的功能和目标 ------ 系统资源的管理者

功能:

  1. 处理机管理
  2. 存储器管理
  3. 文件管理
  4. 设备管理

目标:安全、高效

操作系统的功能和目标 ------ 向上层提供方便易用的服务

操作系统把一些复杂难懂的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的工作原理,只需要对操作系统发出命令即可

GUI

图形化用户接口(Graphical User Interface)

用户可以使用形象的图形界面进行操作,而不再需要记忆复杂的命令、参数

如在Windows操作系统中,删除一个文件只需要把文件"拖拽"到回收站即可

联机命令接口

又称交互式命令接口

特点:用户输入一句命令,系统就执行一个动作

如在命令行中输入time命令,按下回车后,系统会反馈给用户"输入新的时间"的信息,接下来用户只需要输入时间信息,计算机就会将系统时间修改为用户输入的时间

脱机命令接口

又称批处理命令接口

特点:用户一次性提出一堆命令,系统接收后执行一系列动作

如Windows系统下的.bat文件,里面保存着一系列的指令,系统会根据这些指令执行相应的一系列操作

GUI、联机命令接口和脱机命令接口都是操作系统提供给用户直接使用的

程序接口

用户可以在程序中进行系统调用来使用程序接口

系统调用类似于函数调用,是应用程序请求操作系统服务的唯一方式

注意:用户不能直接使用程序接口,只能通过程序代码的方式间接使用程序接口

有的教材中,把系统调用也称为广义指令

如编写C语言是要在屏幕上输出"Hello World"时,需要使用到printf函数,printf函数的底层就使用到了操作系统提供的与显示相关的"系统调用"

小结

也会有些教材中会将命令接口和程序接口统称为用户接口(即用户直接使用的接口)

操作系统的功能和目标 ------ 作为最接近硬件的层次

操作系统作为最接近硬件的层次,需要实现对纯硬件机器的扩展

没有任何软件支持的计算机称为裸机,在裸机上安装操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更方便的机器

通常把覆盖了软件的机器称为扩充机器,又称之为虚拟机

操作系统对硬件机器的扩展:将CPU、磁盘、显示器、键盘等硬件合理地组织起来,让各种硬件能相互协调配合着工作,实现更多更复杂的功能

总结

操作系统的特征

操作系统的特征有:并发、共享、虚拟、异步

其中并发和共享是最基本的两个特征,且二者互为存在条件

并发

并发是指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生的,但微观上是交替发生的

并行是指两个或多个事件同一时刻同时发生,并行的事件在宏观和微观上都是同时发生的

操作系统的并发性是指计算机系统中"同时"运行着多个程序,这些程序在宏观上看是同时运行的,但在微观上看是交替运行的

操作系统就是伴随着"多道程序技术"而出现的,因此,操作系统和程序并发是一起诞生的

对于单核CPU,在同一时刻只能执行一个程序,各个程序只能并发执行 对于多核CPU,在同一时刻可以执行多个程序,多个程序可以并行执行

如Intel的第八代i3处理器就是4核CPU,意味着可以并行执行4个程序

对于4核CPU(即系统中包含4个CPU),最多可以支持4个程序同时运行,但如果此时还需要运行第五个程序,那么就需要与正在运行的4个程序中的一个进行交替,所以并发性对于多核CPU的系统仍然是存在的,因此并发性是操作系统的一个最基本的特征

共享

共享即资源共享,是指系统中的资源可供内存中的多个并发执行的进程使用

资源共享又分为互斥共享方式和同时共享方式

互斥共享方式是指系统中的某些资源虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源

同时共享方式是指系统中的某些资源允许多个进程在一个时间段内同时访问

同时共享方式的"同时"往往是在宏观上定义的,在微观上,多个进程依然可能是交替地对资源进行访问的,即分时共享(只不过时间间隔非常小)

并发和共享的关系

如果系统失去并发性,则在一个时间段内系统中只有一个程序正在运行,则共享性就失去了存在的意义

如果系统失去共享性,则并发性就可能无法实现

并发和共享是一对相互依赖和制约的关系

虚拟

虚拟是指一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑对应物是用户感受到的

虚拟技术包括空分复用技术(虚拟存储器技术)和时分复用技术(虚拟处理器)

对于内存为4GB的计算机,实际运行中可能"同时"运行着占用总内存超过4GB的多个程序,也就是同一时刻实际运行着的程序需要的内存可能比计算机实际拥有的内存要大,这采用的就是虚拟存储器技术,机器实际只有4GB的内存,但在用户看来似乎内存远大于4GB

虚拟存储器技术是虚拟技术中的"空分复用技术"
对于单核的CPU,原则上计算机一次只能运行一个程序,但实际却是可以运行多个程序同时运行,这采用的就是虚拟处理器技术,计算机实际只有一个CPU,但在用户看来似乎是有多个CPU同时为自己服务

虚拟处理器技术是虚拟技术中的"时分复用技术",在微观上看,处理器在不同的微小时间段为不同的进程提供服务(各个进程被CPU交替着提供服务)

如果系统失去了并发性,则一个时间段内系统中只允许运行一道程序,那么就失去了实现虚拟性的意义,因此,没有并发性就谈不上虚拟性

异步

异步是指多道程序环境下,允许多个程序并发执行,但由于资源有限,并发执行的程序会争抢着使用系统资源,因此进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性

如单核CPU在同一时刻需要执行两个程序A和B,程序A内包括指令A-1和指令A-2,程序B内包含指令B-1和指令B-2

那么操作系统可能会这么安排两个程序的执行:

指令A-1 → 指令A-2 → 指令B-1 → 指令B-2

指令A-1 → 指令B-1 → 指令A-2 → 指令B-2

第一种执行顺序中程序A的执行时间就比第二种执行顺序短

如果系统失去了并发性,那么系统只能串行地运行各个程序,那么每个程序的执行就会一贯到底,因此只有系统具有并发性后,才有可能导致异步性

由于并发和共享互为存在条件,因此如果没有共享,就也谈不上虚拟和异步

总结

操作系统的发展和分类

手工操作阶段

在这个阶段,还没有诞生操作系统

程序员写程序是通过在纸带上打孔,有孔的地方代表1,无孔的地方代表0,并将纸带放入纸带机上

之后计算机就从纸带机上读取要运行的程序,程序运行结束后,再将结果输出到纸带机的纸带上,程序员通过查看纸带来读取结果

用户通过向纸带打孔进行程序输入以及用户查看纸带的内容分析结果的过程是非常慢的,而计算机从纸带机上读取程序以及计算机将结果输出到纸带上的过程也很慢,而计算机对程序的执行却非常快

只有当第一个程序员将结果读取之后,第二个程序员才可以输入第二个程序

主要缺点:用户独占全机,人机速度矛盾导致资源利用率极低

批处理阶段

该阶段中引入了脱机输入/输出技术(用外围机 + 磁带完成),并由监督程序负责控制作业的输入、输出

监督程序就是操作系统的雏形

单道批处理系统

各个程序员可以把自己的程序写在纸带上,然后放入不同的纸带机中,之后通过外围机控制着将这些纸带机中纸带上的程序数据存放到磁带中,计算机通过运行监督程序,实现对磁带的读写操作(计算机输出程序运行的结果到磁盘跟读取磁盘上的程序内容的步骤相反)

相对于计算机对纸带机的读写,计算机对磁带的读写速度要快得多

主要优点:一定程度上缓解了人机速度矛盾,资源利用率有所提升

主要缺点:内存中仅能有一道程序运行,只有当前程序运行结束之后才能调入下一道程序(程序之间串行执行)。CPU有大量的时间是在空闲等待I/O完成,资源利用率仍然很低

多道批处理系统

在该阶段,操作系统正式诞生,有了操作系统后,便可以支持多道程序并发运行

在多道批处理系统中,每次可以往内存中读入多道程序,这些程序可以并发运行

首先,第一个作业会从磁带输入到计算机中,输入结束后,计算机(的CPU)就可以运行这个作业程序 在CPU执行程序的过程中,计算机的输入设备是处于空闲状态的,因此可以利用CPU处理程序的这段时间来输入第二个的作业

当第一个程序运行结束后,需要把运行结果输出到磁带上,在输出结果的这段时间里CPU处于空闲状态,因此可以利用这段时间让CPU来运行第二个程序

主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持"忙碌"状态(资源利用率高),系统吞吐量增大

主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机将作业处理完成,中间不能控制自己的作业执行,也就无法调试程序,无法在程序的运行过程中输入一些参数)

分时操作系统

在分时操作系统中,计算机以时间片为单位轮流为各个用户/作业服务,各个用户可以通过终端与计算机进行交互

主要优点:用户请求可以被及时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且各个用户对计算机的操作相互独立,感受不到其他用户的存在

主要缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性

实时操作系统

在实时操作系统的控制下,计算机系统能对接收到的外部信号进行及时处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性

实时操作系统又分为硬实时操作系统和软实时操作系统

硬实时操作系统要求事件必须在绝对严格的规定时间内处理完成

软实时操作系统则对事件的处理完成时间要求没那么严格,能够接受偶尔的处理时间差

主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队就可以直接投入运行

其它几种操作系统

网络操作系统:是伴随着计算机网络的发展而诞生的,能把网络中各个计算机有机地结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信

分布式操作系统:主要特点是分布性和并行性。系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成这个任务

个人计算机操作系统:如Windows XP、MacOS,为了方便个人使用

总结

操作系统的运行机制

内核程序和应用程序

普通程序员编写的程序就是"应用程序",应用程序需要运行在操作系统之上

操作系统程序员编写的程序就是"内核程序",内核程序用于实现操作系统,由很多内核程序组成了"操作系统内核",操作系统内核可简称为"内核(Kernel)"

内核是操作系统最重要最核心的部分,也是最接近硬件的部分

操作系统是系统资源的管理者,而操作系统对资源管理的工作其实就是在内核部分进行的

操作系统的功能未必都在内核中,如图形化用户界面GUI

特权指令和非特权指令

操作系统内核作为"管理者",有时会让CPU执行一些"特权指令",如内存清零指令。这些指令对其他程序的执行影响重大,因此只允许操作系统内核来使用

也就是说,内核程序中允许出现特权指令,而应用程序中不允许出现特权指令,只能使用非特权指令

应用程序中不应该出现特权指令,CPU在用户态下执行应用程序时,一旦发现应用程序中出现了特权指令,会立刻引发中断

CPU在设计和生产时就划分出来特权指令和非特权指令,因此CPU在执行一条指令前就能判断出指令的类型

内核态和用户态

CPU存在两种状态:内核态和用户态

当CPU处于内核态时,说明此时CPU需要运行内核程序,此时可以执行特权指令

当CPU处于用户态时,说明此时CPU需要运行应用程序,此时只能执行非特权指令

CPU中有一个寄存器叫程序状态字寄存器(PSW),其中有一个二进制位用来表示此时CPU的状态,1表示"内核态",0表示"用户态"

内核态 = 核心态 = 管态

用户态 = 目态

内核态和用户态之间的切换

刚开机时,需要加载操作系统,并由操作系统完成一系列的初始化操作,这些操作需要通过执行内核程序来完成,由于需要执行内核程序,因此CPU此时为"内核态"

开机完成后,用户就可以启动某个应用程序,操作系统的内核程序在开机工作完成后会主动将CPU的使用权让给应用程序,内核在让出CPU之前(转为用户态之前),会先执行一条特权指令把PSW的标志位设置为"用户态",接下来就可以运行在"用户态"下应用程序了

若用户在"用户态"下向系统植入一条特权指令,当CPU发现这条特权指令并检查到当前处于"用户态"时,会引发一个中断信号,并拒绝处理这条非法的特权指令

CPU检测到中断信号后,会立即切换为"核心态",并停止运行当前的应用程序,转而运行处理中断信号的内核程序,因此这个中断会使操作系统重新取得CPU的控制权

接下来操作系统会对中断对应的内核程序进行处理,处理完成后再把CPU的使用权交给其它的应用程序(即再次切换为用户态,而那条异常的特权指令从始至终都不会被执行,出现特权指令的应用程序也将不会被继续执行)

内核态 → 用户态:通过执行一条特权指令 ------ 修改PSW的标志位为"用户态",这个动作意味着操作系统将主动让出CPU的使用权

用户态 → 内核态:由"中断"引发,是由硬件自动完成状态切换的过程,触发中断信号意味着操作系统将强行夺回CPU的使用权

除了非法使用特权指令外,还有很多事件也会触发中断信号,但凡需要操作系统介入的地方,都会触发中断信号

中断处理程序属于内核程序,中断处理程序的执行需要在内核态下完成

总结

中断和异常

中断的作用

CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序,操作系统内核程序是整个系统的管理者

在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序

"中断"是让操作系统内核夺回CPU使用权的唯一途径

"中断"会使CPU由用户态变为内核态,导致应用程序的运行暂停,转而去执行相应的内核程序

若没有中断,那么当一个应用程序开始上CPU执行时,这个应用程序就会一直运行下去,直到程序运行结束,所以如果操作系统没有"中断"机制,就不可能实现并发的操作

内核态 → 用户态:通过执行一条特权指令 ------ 修改PSW的标志位为"用户态",这个动作意味着操作系统将主动让出CPU的使用权

用户态 → 内核态:由"中断"引发,由硬件自动完成状态切换的过程,触发中断信号意味着操作系统将强行夺回CPU的使用权

中断的类型

中断分为内中断和外中断

  • 内中断与当前执行的指令有关,中断信号来源于CPU内部
  • 外中断与当前执行的指令无关,中断信号来源于CPU外部

内中断也称为异常、例外,内中断又可以进一步地划分为:

  • 陷阱、陷入(trap)

    由陷入指令引发,是应用程序故意引发的

  • 故障(fault)

    由错误条件引发的,可能被内核程序修复

    内核程序修复故障后会把CPU使用权还给原来的应用程序,让它继续执行下去。如缺页故障等

  • 终止(abort)

    由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如整数除0、非法使用特权指令等

广义的中断包括外中断和内中断,狭义的中断就是外中断

考试中,"中断"特指狭义的中断,即外中断,而内中断一般称为"异常"

内中断举例:

  1. 试图在用户态下执行特权指令
  2. 执行除法指令时发现除数为0
  3. 有时应用程序会主动请求操作系统内核服务,此时会执行一条特殊的指令------ 陷入指令,该指令引发一个内部中断信号(应用程序主动产生内部中断信号)

注意:陷入指令是非特权指令

执行"陷入指令",意味着应用程序主动地将CPU控制权还给操作系统内核,"系统调用"就是通过陷入指令完成的

外中断举例:

  1. 时钟中断 ------ 由时钟部件发来的中断信号

时钟部件每隔一个时间片(如50ms)的时间就会给CPU发送一个时钟中断信号,通过时钟部件的中断信号就可以实现多道程序并发执行

假设系统此时需要并发执行两个应用程序,首先CPU会执行应用程序1中的指令,当执行完应用程序1的某条指令并检测到时钟部件发来的中断信号后,会停止运行当前的应用程序,转而执行相应的中断处理程序并切换为内核态,接下来CPU就会在内核态下执行中断处理程序

在处理中断程序的过程中发现刚刚执行的是应用程序1中的指令,于是中断处理程序就会把CPU的使用权让给应用程序2,中断程序执行结束后切换状态为用户态,并开始执行应用程序2中的指令

  1. I/O中断 ------ 由输入/输出设备发来的中断信号

当输入输出任务完成时,设备会向CPU发送中断信号

CPU在每一条指令的执行结束前,会例行检查是否有外中断信号

中断机制的基本原理

不同的中断信号,需要使用不同的中断处理程序来处理

当CPU检测到中断信号后,会根据中断信号的类型去查询"中断向量表",以此来找到相应的中断处理程序在内存中的存放位置

中断处理程序一定是内核程序,需要运行在"内核态"下

总结

系统调用

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务,主要包括命令接口和程序接口,其中程序接口由一组系统调用组成

命令接口是操作系统提供给用户直接操作自身(即操作系统)的接口,程序接口是操作系统提供给程序员让其通过编写程序来操作自己(即操作系统)的接口

"系统调用"是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务

系统调用与库函数的区别

程序员是可以通过编写汇编语言来直接请求系统调用的服务

但现在编程更多是使用高级语言,所以程序员一般直接使用的是高级语言中的库函数,某些库函数在底层其实还是会使用到系统调用

所以系统调用是比高级语言库函数更为底层的接口

普通应用程序 可通过汇编语言直接进行系统调用,也可以使用高级语言库函数。有的库函数涉及系统调用,有的则不涉及
高级语言 向上提供库函数,有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员编程起来更为方便
操作系统 向上提供系统调用,使得上层程序能请求内核的服务
裸机

并不是所有库函数都会使用到系统调用,如取绝对值库函数

为什么系统调用是必须的

操作系统的各个进程是并发执行的,但这些进程可能需要对同一个资源进行访问

如在同一台电脑上同时使用WPS和MS给同一台打印机发送打印任务,如果不对这两个打印的任务加以协调控制,就会出现在一张纸上打印一点WPS中的内容后又打印一点MS中的内容的情况

解决方法:由操作系统内核对共享资源进行统一的管理,并向上提供"系统调用",用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求,操作系统内核会对各种请求进行协调处理

什么功能需要使用到系统调用

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储空间分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成,这样可以保证系统的稳定性和安全性,防止用户进行非法操作

系统调用的过程

一个应用程序运行在用户态,应用程序内的指令会依次执行,当应用程序想要请求操作系统内核服务时,需要使用到陷入指令

在陷入指令执行前,必须先执行一条或几条传参指令,传参指令用于传递一些必要的参数到CPU的内部寄存器,如给寄存器A传递应用程序所需系统调用服务的类型参数,操作系统会根据应用程序提供的参数判断应用程序要请求的是哪种类型的服务

当参数都存入寄存器后,就会开始执行陷入指令,陷入指令的执行会引发一个内中断,CPU检测到这个由陷入指令产生的内中断信号后,就会暂停执行当前的应用程序并切换为内核态,转而执行该内中断对应的中断处理程序 ------ 系统调用入口程序

执行系统调用入口程序的过程中,CPU会检测寄存器中的参数,并根据这些参数判断用户需要哪种系统调用服务,于是入口程序就会调用对应的系统调用服务处理程序

当系统调用服务处理程序执行完后,CPU又会转为用户态,并继续执行引发内中断的应用程序的后续指令

系统调用的过程:

  1. 传递系统调用所需要的参数
  2. (在用户态下)执行陷入指令
  3. (在内核态下)执行系统调用请求所对应的内核程序来处理系统调用
  4. 返回原应用程序

陷入指令 = trap指令 = 访管指令

注意:

  1. 陷入指令是在用户态下执行的,执行陷入指令会立即引发一个内中断,使CPU进入内核态
  2. 发出系统调用请求(即产生内中断信号的过程)是在用户态下进行的,而对系统调用的相应处理则是在内核态下进行的

总结

操作系统的体系结构

操作系统可以划分为内核部分和非内核部分

操作系统最核心的功能需要存放在内核部分:

  • 时钟管理

  • 中断处理

  • 原语(设备驱动、CPU切换等)

    原语是一种特殊的程序,具有原子性

    原子性是指程序的运行必须一气呵成,不可被"中断"(在执行的过程中,即使有中断信号,CPU也不会管这些中断信号,直到把原语执行完成为止)

  • 进程管理、存储器管理、设备管理

  • ...

操作系统的内核

内核是操作系统最基本、最核心的部分

实现操作系统内核功能的那些程序就是内核程序

时钟管理、中断处理、原语(设备驱动、CPU切换等)这些模块与硬件的关联最为紧密,这些功能必须放在操作系统的内核当中

而进程管理、存储器管理、设备管理等这些管理工作更多的是对数据结构的操作,不会直接涉及硬件,所以一些操作系统并不会把这些模块放到操作系统内核当中,而是放入非内核部分中

因此操作系统的内核设计就出现了两种情况:大内核和微内核

  • 大内核结构下,操作系统内核除了包含时钟管理、中断处理、原语模块外,还会包含进程管理、存储器管理、设备管理模块
  • 微内核结构下,操作系统内核只保留与硬件关联最紧密的模块,不包含进程管理、存储器管理、设备管理模块,这些模块是归为操作系统的非内核部分

大内核也称宏内核、单内核,典型的大内核操作系统:Linux、UNIX

典型的微内核操作系统:Windows NT

注:操作系统的内核功能必须运行在内核态下,非内核功能必须运行在用户态下

假设存在两台计算机,一台计算机采用的是大内核结构,另一台计算机采用的是微内核结构

现在两台计算机上的应用程序都想要请求各自的操作系统服务,而服务的处理同时涉及到进程管理、存储器管理、设备管理

在大内核体系结构下,当应用程序向操作系统提出服务请求,这时CPU就会从用户态转为内核态,之后开始运行内核程序

在微内核体系结构下,应用程序向操作系统提出服务请求,接下来操作系统的进程管理、存储器管理、设备管理都会为应用程序服务,而这些模块在处理相应请求时,都需要得到内核功能的支持,所以每次模块对内核的访问都需要切换用户态到内核态

注:CPU切换状态的过程是由成本的,要消耗不少的时间,频繁地切换状态会降低系统性能

大内核的特点:

  • 优点:高性能
  • 缺点:内核代码庞大,结构混乱,难以维护

微内核的特点:

  • 优点:内核功能少,结构清晰,方便维护
  • 缺点:需要频繁地在核心态和用户态之间切换,性能低

小结

操作系统结构 ------ 分层结构

在分层结构的操作系统中,操作系统内核被分为多层,最底层是硬件,最高层是用户接口

每层只能单向调用更低一层提供给自己的接口

优点:

  • 便于调试和验证,只需自底向上地逐层调试验证即可

自底向上地一层一层调试,低层确保没有问题后,就只需要调试当前层的内容即可

当进行调试时,最先调试最底层 ------ 硬件层,若硬件层没有问题,接下来就可以调试第二层,调试第二层时,由于最底层已经确保没有问题,第二层的调试只需要验证本身的内容而不必管更低层的内容和细节,因此调试起来很方便

  • 易扩充和维护,各层之间的调用接口清晰固定

相邻层之间的接口是在生产之前就已经设计好的,若要在相邻层中间增加新的一层,就只需要给这新的一层配置原来相邻层之间存在的接口即可

缺点:

  • 仅可以调用相邻低层,难以合理定义各层的边界

操作系统内核的各层之间关系是十分复杂的,用简单的"相邻层之间接口调用"的方式可能不足以表达内核的所有功能

  • 效率低,不可跨层调用,系统调用执行时间长

分层结构的系统只能将信息一层一层向上(或向下)传递,若高层要和低层进行交互,就必须让中间层参与消息的转发,效率低下

操作系统结构 ------ 模块化

将操作系统内核划分为多个模块,各个模块之间相互协作

内核由主模块和可加载内核模块组成

主模块负责核心功能,如进程调度、内存管理等

可加载内核模块可以动态加载新模块到内核,而无需编译整个内核

优点:

  • 模块按功能进行划分,模块间逻辑清晰,易于维护,确定模块间接口后即可多模块同时开发
  • 支持动态加载新的内核模块(如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
  • 任何模块都可以直接调用其他模块,无需采用消息传递的方式进行通信,效率高

缺点:

  • 模块间的接口定义难以确定
  • 模块间相互依赖,难以调试和验证

操作系统结构 ------ 宏内核、微内核

宏内核:将所有的系统功能都放在内核中,通常也采用了"模块化"的设计思想

优点:性能高,内核内部各种功能都可以直接相互调用

缺点:

  • 内核功能庞大复杂,导致难以维护
  • 大内核中某个功能模块出错,就可能导致整个系统崩溃

微内核:只把中断、原语、进程通信等最核心的功能放入内核。进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态下

优点:

  • 内核功能少,易于维护,同时内核可靠性高
  • 内核外的某个模块出错不会导致整个系统崩溃

缺点:性能低,需要频繁地切换用户态/内核态,用户态下的各个功能模块不可以直接相互调用,只能通过内核以进行"消息传递"方式来间接通信

如微内核系统中的进程管理模块要和存储管理模块进行通信,那么进程管理模块在通信时必须先将状态转变为内核态,并将消息传递给内核,让内核帮忙转发消息给存储管理模块,消息正式从内核转发到存储管理模块之前还需要把状态再次转变为用户态

操作系统结构 ------ 外核

操作系统由内核(Kernel)和外核(Exokernel)组成

内核负责进程调度、进程通信等(和硬件资源分配无关的)功能,外核负责为用户进程分配未经抽象的硬件资源(如为用户分配内存或磁盘的存储空间),且由外核负责保证资源使用安全

优点:

  • 外核可以直接给用户进程分配"不虚拟、不抽象"的硬件资源,使用户进程可以更灵活地使用硬件资源
  • 减少了虚拟硬件资源的"映射层",提升效率

缺点:

  • 降低了系统一致性,使系统变得更复杂

总结

操作系统引导

操作系统引导(boot)------ 电脑开机的时候,如何让操作系统运行起来

一块磁盘,在装入到电脑的主板中并安装了操作系统后,就会变为下面的样子:

其中操作系统程序存放在C盘中

除了用户可见的C ~ F盘的空间外,磁盘还会包含一个叫做主引导记录的区域,其中包含了磁盘引导程序和分区表

分区表中记录了每个盘所占的空间的范围(每个盘的起始地址以及结束地址)

C盘中安装着操作系统,并且需要使用到C盘来启动操作系统,因此C盘可以称为磁盘的活动分区

计算机的主存由RAM和ROM两个部分组成,其中ROM部分存储着BIOS(Basic Input/Output System),BIOS由一系列的程序组成,其中最重要的一个程序是ROM引导程序(又称自举程序)

ROM部分在主存中的位置是固定的,且ROM中的数据不会因为断电而丢失,所以当开机时,CPU一旦通上电,CPU就可以从主存中的固定位置(ROM部分)找到ROM引导程序并执行该程序

执行ROM引导程序的结果就是让CPU从磁盘中读取主引导记录MBR到内存中,CPU就可以根据主存中的主引导记录MBR里的磁盘引导程序和分区表将磁盘划分为若干个盘

接下来CPU找到C盘,并从C盘中读取引导记录PBR到主存中

"启动管理器"程序用于完成操作系统初始化的工作,而"启动管理器"存放在C盘的根目录下的某个位置,执行引导记录PBR中的程序就可以让CPU从C盘的根目录下找到"启动管理器"程序,并将它存入主存中

接下来CPU执行"启动管理器"程序,就可以完成一系列的操作系统初始化的工作

操作系统引导过程:

  1. CPU从一个特定的主存地址开始,取指令,即执行ROM中的引导程序(执行后会先进行硬件自检,再进入开机状态)
  2. 将磁盘的第一个块 ------ 主引导记录读入内存,并执行主引导记录中的磁盘引导程序,扫描分区表,并找到活动分区
  3. 从活动分区(又称主分区,即安装了操作系统的分区)读入引导记录,执行其中的程序
  4. 执行程序的结果就是从C盘的根目录下找到完整的操作系统初始化程序(即"启动管理器"程序)并执行,即可完成"开机"的一系列动作

四种引导程序:

  1. ROM引导程序,又称自举程序,位于内存的ROM区中
  2. 磁盘引导程序,又称主引导程序,位于硬盘的第一个扇区
  3. 分区引导程序,又称引导程序,位于活动分区的第一个扇区
  4. 操作系统引导程序,又称启动管理器、操作系统初始化程序,位于活动分区的根目录下的某个文件夹中

虚拟机

传统的计算机,一台物理机器只能运行一个操作系统

虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(Virtual Machine, VM),每个虚拟机都可以独立运行一个操作系统

所谓虚拟化技术,其实就是运行虚拟机管理程序,又称虚拟机监控程序(Virtual Machines Monitor/Hypervisor)

虚拟机管理程序分为两类:

  1. 第一类VMM,直接运行在硬件之上

这类VMM可以将一台物理机器划分为多台虚拟机器,它将一台物理机器的硬件资源划分为多个部分,分别供给各个虚拟机进行使用,每个虚拟机可以安装各自的操作系统,每个操作系统之上又可以运行各自的用户进程(硬件资源的管理者是VMM)

对于单核CPU,VMM会将CPU按时间片进行划分,不同的操作系统可以分配到不同时间片的CPU资源(按时间划分)

对于磁盘和内存,VMM则是将它们的不同空间分配给各个操作系统(按空间划分)

这类VMM需要运行在内核态(也只有VMM能运行在内核态),而利用VMM安装的各种操作系统和操作系统上的应用程序,都只能运行在用户态下,这些操作系统不知道自己运行在用户态下,所以它们仍然会使用特权指令(因此说上层的操作系统是运行在虚拟内核空间中,虚拟内核空间实际上还是属于用户空间)

当上层的操作系统使用到特权指令时,会被VMM拦截,且VMM会使用一些功能类似的非特权指令来代替特权指令达到类似的效果

  1. 第二类VMM,运行在宿主操作系统之上

如在Windows系统上安装VMware或VirtualBox等软件

使用这些软件就可以在原来的操作系统(宿主操作系统)之上再运行其它的操作系统(客户操作系统)

只要硬件资源足够,使用第二类VMM就可以在一个宿主操作系统上启动多个客户操作系统

在这类VMM中,宿主操作系统和客户操作系统可以同时运行,所以会出现宿主操作系统的进程与客户操作系统的进程同时运行的情况

VMM在给各个虚拟机分配硬件资源时,由于本身不是直接运行在硬件上,所以VMM需要先请求宿主操作系统给自己可分配的资源,VMM再将宿主操作系统提供的可分配资源再分配给各个客户操作系统(硬件资源的管理者仍然是宿主操作系统)

两类VMM的对比

支持虚拟化的CPU通常分更多指令等级

将指令的特权级别划分为多个等级,可以减少VMM对虚拟操作系统使用特权指令的转换工作

相关推荐
GoGeekBaird8 小时前
69天探索操作系统-第58天:操作系统中的高级负载均衡
后端·操作系统
易保山1 天前
MIT6.S081 - Lab5 Lazy(延迟分配)
linux·操作系统·c
MuYe1 天前
Android Hook - 动态链接器命名空间机制
android·操作系统
鑫鑫爱金金3 天前
存储管理(一)
操作系统
凉、介5 天前
SylixOS 中 select 原理及使用分析
c语言·网络·操作系统·select·sylixos
易保山5 天前
MIT6.S081 - Lab4(Trap)实验笔记
linux·操作系统·c
我蛋挞超好吃5 天前
Linux 内核和 Linux 操作系统
操作系统
Iqnus_1235 天前
用WSL安装Ubuntu(Windows11)
操作系统
GoGeekBaird6 天前
69天探索操作系统-第57天:现代操作系统的容错性:原理与实践
后端·操作系统