第1章 计算机操作系统概述
1.1 操作系统基本概念
1.1.1 操作系统的简介
在现如今的信息化时代,相信各位读者对于“操作系统”这四个字并不陌生。例如我们常常使用的Windows、安卓、IOS、MacOS以及Linux等,都属于操作系统。操作系统,是现如今信息化时代中不可或缺的一种软件。对于普通用户而言,操作系统这四个字,既熟悉又陌生,因为普通用户只关注那些运行在各个操作系统之上的应用软件。对于协助这些应用软件操作硬件资源的操作系统,其实是不甚了解的。
那么到底什么是操作系统?
这里,我们不妨先看一个计算机系统的结构图。
由上图可以看到,操作系统是介于应用程序和计算机硬件之间的一个软件,操作系统与计算机硬件是直接交互的,而应用软件以及用户无法直接与计算机硬件进行交互。
注:上图中用户与操作系统也有直接连接的部分,这是因为,用户可以通过操作系统提供的联机命令接口直接与操作系统进行交互,这一部分将在1.1.2小节详细讲解。
综上,我们给出操作系统的标准定义如下:
操作系统是指控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合,操作系统是计算机系统中最基本的系统软件。
小节总结
1.1.2 操作系统的功能
操作系统主要提供了三大方面的功能:
作为计算机系统资源的管理者作为用户与计算机硬件系统之间的接口作为对计算机资源的扩充1.1.2.1 作为计算机系统资源的管理者
操作系统作为计算机系统资源的管理者,具备了处理机管理、存储器管理、设备管理和文件管理这几个功能。
处理机管理
在多道程序环境下,处理机的分配和运行都是以进程(或线程)为基本单位,因而对处理机的管理也可以归结为对进程的管理,进程管理的主要功能包括进程控制、进程同步、进程通信、死锁处理、处理机调度等。(这些功能在后面章节中会被详细介绍)
存储器管理
存储器管理是为了给多道程序的运行提供良好的环境,方便用户使用以及提高内存的利用率,主要包括内存分配与回收、地址映射、内存保护与共享、内容扩充等功能。
设备管理
设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并且提高设备的利用率,主要包括缓冲管理、设备分配、设备处理和虚拟设备等功能。
文件管理
计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分被称为文件系统,文件管理包括文件存储空间的管理、目录管理以及文件读写管理和保护等。
1.1.2.2 作为用户与计算机硬件系统之间的接口
操作系统为了使用户可以方便、快捷、可靠地操纵计算机硬件并运行自己的程序,提供了用户接口。操作系统提供的用户接口有两类:命令接口和程序接口。其中用户可以直接使用命令接口与操作系统进行交互,完成作业的执行。程序接口则是由程序员通过编程,使用这些接口来请求操作系统提供的服务。
在这里,操作系统使用了封装的思想,将一些复杂的硬件功能封装成了简单易用的服务,使用户能方便的使用计算机,无需关心底层硬件的原理,只需对操作系统发出命令即可。
上图表示应用软件通过操作系统提供的接口获取某个操作系统提供的功能,从而操纵计算机硬件。
命令接口
命令接口分为两类:联机命令接口和脱机命令接口
联机命令接口
联机命令接口又称交互式命令接口,适用于分时或实时系统的接口。它由一组键盘操作命令组成,用户通过控制台或终端输入操作命令,向系统提出各种服务要求。用户每输入一条命令,控制权就会被转交给操作系统的命令解释程序,然后由命令解释程序解释并且执行输入的命令,完成指定的功能,然后,控制权转回控制台或终端,此时用户又可以输入下一条命令。即:用户使用联机命令接口与操作系统的交互,是交替进行的。
例如在Windows系统中,按下键盘Win+R,输入cmd后回车,进入命令解释器,使用各种操作系统提供的命令,与操作系统进行交互(如time命令,获取当前时间)。
脱机命令接口
脱机命令接口又称批处理命令接口,适用于批处理系统,它由一组作业控制命令组成,脱机用户无法直接干预作业的运行,而是事先用相应的一系列的控制命令编写成一份作业操作说明书,连同作业一起提交给操作系统。系统调度到该作业时,由系统中的命令解释程序逐条执行作业说明书上的命令,从而间接的控制作业的运行。即:用户使用脱机命令接口与操作系统的交互,是事先提供作业清单,随后交给系统按照清单逐条执行的。
例如Windows中的bat批处理文件
程序接口
程序接口由一组系统调用(也被称为广义指令)组成。程序员通过在程序中使用这些系统调用来请求操作系统提供的某些服务,例如各种外部设备、申请分配和回收内存等。
下图是程序员通过程序接口使用程序接口,请求操作系统提供显示器的显示服务的示例。
目前最为流行的图形用户界面(GUI),即图形接口,就是通过调用程序接口实现的。用户通过GUI,可以直接使用鼠标和键盘方便的使用操作系统。
1.1.2.3 作为计算机资源的扩充
裸机(没有任何软件的计算机)是构成计算机系统的物质基础,而呈现在用户面前的计算机系统是经过若干层软件改造后的计算机,裸机在最里层,外面一层是操作系统,操作系统提供的资源管理功能和方便用户使用的各种服务接口,使得裸机的功能更为强大和方便使用。因此我们常把覆盖了软件的机器称为扩充机器或虚拟机。
小节总结
1.1.3 操作系统的特征
操作系统是一种系统软件,与其他系统软件和应用软件有很大的不同,它具有自己特有的一些基本特性。包括并发、共享、虚拟和异步。这些概念的理解十分重要!!!
1.1.3.1 并发
并发是指两个或多个事件在同一时间间隔内发生。这些事件在宏观上是同时发生的,在微观上是交替发生的。在操作系统中,并发指计算机系统中同时存在多个运行的程序,操作系统具有处理和调度多个程序同时执行的能力。在多道程序环境下,一段时间内,宏观上有多道程序在同时执行,而在每个时刻,单处理机环境下仅能有一道程序执行,因此微观上这些程序仍然是分时交替执行的,即操作系统的并发性是通过分时实现的。
注意:并发与并行是两个不同的概念,并行是指两个或多个事件在同一时刻发生。
并行性是指系统具有同时进行运算或操作的特性,在同一时刻能完成两种或两种以上的工作,并行性需要有足够的硬件进行支持,例如多处理器硬件环境。
单核CPU同一时刻只能执行一个程序,各个程序只能并发执行。
多核CPU同一时刻能执行多个程序,各个程序可以并行执行。
下图举例说明了并发性和并行性的区别
在上图中,小明如果按照左图的流程先后进行写作业、听歌、写作业,则表明在10:00至12:00写作业和听歌这两种行为是并发执行的。小明如果按照右图的流程,在10:00至11:00边写作业边听歌,则写作业和听歌这两种行为是并行执行的。
1.1.3.2 共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
资源共享分为两类方式:互斥共享方式和同时访问方式
互斥共享方式
系统中的某些资源(如打印机等),虽然可以供给多个进程使用,但是为了使打印的结果不发生混淆,应规定一段时间内只允许一个进程访问该资源。
因此,使用互斥共享方式的资源,在同一时间段内,只能有一个进程访问,例如,进程A想要访问某个资源,需要先提出请求,若此时资源空闲,则系统就将该资源分配给进程A,此时进程B如果也想访问资源,则进程B必须等待进程A使用完资源后释放资源。这种方式就是互斥共享。
同时访问方式
系统中的某些资源(如磁盘等),允许一段时间内多个进程“同时”访问,这里所说的“同时”是宏观上的。即这些资源允许多个进程并发性的访问。例如多个进程可以并发性的访问磁盘设备,读取某个文件。
并发和共享是操作系统两个最基本的特征,两者之间的关系是互为存在条件,若系统不允许程序并发执行,那么自然就不存在资源共享的问题;若系统不能对资源共享实施有效的管理,那么就会影响到程序的并发执行。
1.1.3.3 虚拟
虚拟是指把一个物理上的实体变为若干逻辑上的对应物。物理实体是实际存在的,逻辑上的对应物是不存在的,是用户感觉出来的事物。
在操作系统中,使用虚拟技术实现了虚拟处理器、虚拟内存以及虚拟外部设备等功能。
虚拟处理器
虚拟处理器是通过多道程序设计技术,采用让多道程序并发的执行,分时使用一个处理器。此时,虽然只有一个处理器,但是在宏观上,它可以同时为多个用户服务,使得每个终端用户都感觉有一个CPU在专门为它服务。
虚拟内存
虚拟内存是将一台计算机的实际物理内存变为虚拟内存,从逻辑上扩充内存容量,此时用户感觉到的内存容量是虚拟的。
虚拟外部设备
虚拟外部设备是通过虚拟技术,将一台物理I/O设备虚拟为多台逻辑上的I/O设备,允许每个用户占用一台逻辑上的I/O设备,使原来仅允许在一段时间内由一个用户访问的设备变为一段时间内允许多个用户同时访问的共享设备。
操作系统的虚拟技术可以总结为:时分复用技术(虚拟处理器)和空分复用技术(虚拟内存)。
操作系统的虚拟技术的前提条件是并发性,如果没有并发性,一段时间内系统中只能运行一个进程,那么虚拟性就失去了意义,即,没有并发性,就没有虚拟性。
1.1.3.4 异步
操作系统在多道程序的环境下,由于多个程序是并发执行的,因此每个进行的执行不是一贯到底的,而是走走停停的,每个进程都是以不可预知的速度向前推进,这就是进程的异步性。
由于并发运行的进程会争抢有限的系统资源,因此进程的执行不是一贯到底的,只有系统拥有并发性,才有可能导致异步性。
小节总结
1.2 操作系统发展历程
1.2.1 手工操作阶段(无操作系统)
在最开始的手工操作阶段,使用计算机的每个工作都需要人工干预,例如程序的装入、运行、结果的输出等。下图表明了手工操作阶段的正常流程。
由上图可以看出,计算机计算的速度相较于整个流程的其他人工干预速度而言,是很快的。整个流程中,经常会出现计算机早已计算完毕,但是人工还在慢慢的输入下一段程序或者读取运行的结果。
由此可以看出,手工操作阶段有两个主要缺点:
用户独占全机,资源利用率低CPU等待手工操作,利用不充分1.2.2 批处理阶段(操作系统开始出现)
为了解决手工阶段的两个显著的问题,出现了批处理系统。批处理系统分为单道批处理系统以及多道批处理系统。
1.2.2.1 单道批处理系统
在单道批处理系统中,引入了脱机输入/输出技术(外围机+磁带),由监督程序负责控制作业的输入和输出,解决了人机矛盾以及CPU和I/O设备速率不匹配的问题。
特点
自动性,在正常情况下,磁带上的一批作业能自动地逐个运行,不需要人工干预。
顺序性,磁带上的作业按照顺序逐个进入内存并执行。
单道性,监督程序每次从磁带上只调入一道程序进入内存运行。
优点
在一定程度上解决了人机矛盾造成的资源浪费。
缺点
由于单道批处理系统具有单道性,因此如果在程序运行期间发出了I/O请求,那么高速CPU需要等待低速I/O设备完成之后才能继续运行。这就造成了CPU资源的浪费。
1.2.2.2 多道批处理系统
为了解决单道批处理系统的缺点,多道批处理系统应运而生,它使用多道程序设计技术,允许多个程序同时进入内存,并且允许它们在CPU中交替运行,这样,即使有某个程序A在运行的过程中请求了I/O设备,CPU也可以立即去运算其他程序,待I/O设备处理完毕后再继续运算程序A。
特点
多道性,在系统的内存中同时运行了多道程序。
宏观上并行,微观上串行,在宏观上,内存中的程序都处于运行状态,在微观上,同一时刻,只有一个程序占有CPU。
优点
多道程序并发执行,共享计算机资源,使得CPU和其他资源都能充分的“忙碌”起来,大大地提高了资源利用率。
缺点
用户响应时间长,没有人机交互功能(当用户提交了作业后,就只能等待系统自动处理完成,无法人工进行干预)。
1.2.3 分时操作系统
分时操作系统,利用分时技术,将处理器的运行时间分成一个个很短的时间片,按照时间片轮流把处理器分配给各个联机作业使用,各个用户可以通过终端与使用分时操作系统的计算机进行交互,如果某个作业A在一个时间片内无法完成,则该作业A会被暂停,CPU会去处理其他作业,等待下一轮再继续运行作业A。因为CPU的速度很快,作业运行轮转得也很快,使得每个用户都感觉专门有一个CPU在为自己服务。
特点
同时性,在分时操作系统中,允许多个终端用户同时使用一台计算机,这些终端上的用户可以同时或基本同时使用该计算机。
交互性,用户可以与系统进行人机对话,控制作业的运行。
独立性,在分时系统中的多个用户之间的操作是相互独立的,互不干扰。
及时性,用户的请求能在很短的时间内得到响应。
优点
分时系统解决了多道批处理系统无法人机交互的问题。它使得多个用户可以同时通过终端连接在一台主机上,并且每个用户的操作相互独立,感觉不到其他用户。
缺点
由于分时系统是轮转时间片来执行每个程序的,这就导致了分时系统无法优先处理一些紧急事项,在一些需要系统对外部的信息在规定时间内做出处理的场景下,分时系统就不适用了(例如,飞机订票、飞机实时监控等系统)。
1.2.4 实时操作系统
为了解决分时系统无法处理紧急任务的问题,实时系统应运而生。实时系统分为两种,硬实时系统和软实时系统。
硬实时系统
硬实时系统要求,某个动作必须绝对地在规定时刻或者规定的时间范围内发生。(例如自动驾驶系统)
软实时系统
软实时系统,规定某个动作在规定的时间内完成,但是能够接受偶尔有违反时间规定的情况发生,并且该情况发生后不会造成任何永久性损害。(例如火车票订票系统)
优点
在实时系统的控制下,计算机系统接收到外部信号后能够及时的处理,并在严格的时间范围内处理完成。
缺点
实现难度大。
1.2.5 其他操作系统
除了上述的操作系统外,还有网络操作系统、分布式计算机操作系统以及个人计算机操作系统。
网络操作系统
伴随着计算机网络的发展出现的一种操作系统,它能够把各个计算机有机地结合起来,实现数据传送功能,实现网络中各个资源的共享和各个计算机之间的通信。
分布式计算机操作系统
分布式计算机操作系统由多台计算机组成,并且满足以下几个条件:
1.系统中任意两台计算机间能够正常通信2.系统中的每台计算机都具有同等地位,没有从机和主机之分3.每台计算机上的资源为所有用户共享4.系统中的任意一台计算机都可以构成一个子系统且可以重构5.任何工作都可以分布在几台计算机上,由它们并行、协同完成。
其主要特点就是分布性和并行性。
个人计算机操作系统
目前使用最广泛的操作系统,例如Windows、Linux和MacOS等。
小节总结
1.3 操作系统的运行机制
1.3.1 前言
在学习操作系统的运行机制之前,我们需要有一定的知识储备。
即,我们需要明白,一个程序是如何运行的?
当我们程序员写完一段代码后,交由编译器编译后,会形成二进制指令文件,该文件中的指令才是CPU能够识别并且执行的指令。同理,一个程序想要在计算机中运行,那么其内部程序必定需要被编译成一条一条的二进制指令,交由CPU识别和执行。
学习操作系统的运行机制,我们需要理解两种指令(特权指令与非特权指令)、两种程序(内核程序与用户程序)、两种状态(用户态与内核态)以及操作系统内核包括的四个方面即可。
1.3.2 内核程序与用户程序
在操作系统中,CPU执行两种不同性质的程序,一种是操作系统内核程序,简称“内核程序”,一种是系统外层的应用程序,简称“用户程序”。
其中内核程序是用户程序的管理者,在内核程序中可以执行特权指令,在用户程序中只能执行非特权指令。
我们程序员写的程序一般就是用户程序。
1.3.3 特权指令与非特权指令
在CPU可以识别的指令中,按照权限分为两种指令,特权指令和非特权指令。
特权指令
不允许用户直接使用的指令,如I/O指令、置中断指令,存取用户内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。
非特权指令
允许用户直接使用的指令,非特权指令不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间,可以防止用户程序对系统程序进行破坏。
1.3.4 用户态与内核态
CPU的运行模式分为两种模式,用户态(目态)和内核态(核心态、管态)。处于内核态的CPU可以执行特权指令,处于用户态的CPU不能执行特权指令。
对于用户态和内核态这方面的内容,各位读者需要弄清楚两个主要问题。
1.3.4.1 CPU如何识别当前处于用户态还是内核态
在CPU中有一个寄存器叫程序状态寄存器(PSW),该寄存器中有一个二进制位,1表示CPU处于“内核态”,0表示CPU处于“用户态”。CPU处于内核态时,说明正在运行内核程序,可以执行特权指令,CPU处于用户态时,说明正在运行用户程序,此时只能执行非特权指令。
1.3.4.2 CPU如何切换状态
CPU想要从用户态切换至内核态,需要由用户程序触发中断或异常后,由硬件实现将PSW标志位设置为1后,就会切换到内核态。
CPU想要从内核态切换至用户态,由内核程序调用一条修改PSW的特权指令即可。
中断和异常,会在后续章节进行讲解。
1.3.5 操作系统内核包括的内容
1.3.5.1 时钟管理
时钟是操作系统最基本以及最关键的设备,它提供了计时、中断等功能。
计时功能使得操作系统可以为用户提供标准时间。时钟中断功能,可以实现进程的切换,例如分时操作系统中的时间片轮转管理。1.3.5.2 中断机制
操作系统引入中断计时的初衷是为了提高多道程序环境中的CPU利用率,即使得多道程序可以并发执行。随着时间的推移,中断机制逐渐成为了现代操作系统的基础。例如,键盘或鼠标信息的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等等,这些功能都依赖于中断机制。
1.3.5.3 原语
操作系统的底层是一些可以被调用的公用小程序,它们可以各自完成一定的操作,这些小程序被称为原语,它们具有以下特性
处于操作系统的最底层,是最接近硬件的部分。具有原子性,运行一气呵成,无法被中断。运行需要的时间短,且会被频繁调用。定义原语的直接方法是关闭中断,待原语执行结束后再打开中断。系统中的设备驱动、CPU状态切换、进程通信等功能的部分操作都可以定义为原语。即,使用“关中断指令”和“开中断指令”这两个特权指令实现原子性。使用了“关中断指令”后,CPU就不会在执行程序时检测是否有中断信号。使用了“开中断指令”后,CPU才会在执行程序时检测是否有中断信号。(中断相关的知识会在后续章节进行介绍)
1.3.5.4 系统控制的数据结构及处理
在操作系统中有许多用来登记状态信息的数据结构,如进程控制块、作业控制块、消息队列、缓冲区等,为了实现有效的管理,系统定义了一些基本的操作。
进程管理
负责进程状态管理、进程调度和分派、创建与撤销进程控制块等。
存储器管理
负责存储器的空间分配和回放、内存信息保护程序、代码对换程序等。
设备管理
负责缓冲区管理、设备分配和回收等。
由上述内容可以看出,内核态指令实际上包括系统调用类指令和一些针对时钟、中断和原语的操作指令。
小节总结
1.4 中断和异常
1.4.1 中断的作用
先说结论:中断是操作系统内核抢夺回CPU使用权的唯一途径。
我们假设下面一个场景:
在操作系统中,引入了内核态和用户态这两种状态,当用户启动用户程序A后,操作系统内核会在合适的时机将CPU使用权主动让给用户程序A(即,CPU由内核态切换为用户态),此时,如果没有中断机制,那么CPU就会一直保持在用户态,操作系统内核就无法获取CPU的使用权了。
因此,操作系统中引入了中断机制。
在上面章节中,我们也讲过,CPU由用户态切换为内核态,就是通过中断机制完成的。(由中断引发,硬件自动实现CPU状态的切换)。
1.4.2 中断的类型
中断分为外中断和内中断两种类型。
1.4.2.1 外中断
外中断也被称为中断,是指来自CPU执行指令外部的事件,通常用于信息输入/输出,如设备发出的I/O结束中断,表示设备输入/输出完成。
外中断举例:
时钟中断,假设时钟部件每100ms向CPU发送中断信号,则会出现如下情况:
1.CPU依次执行应用程序A的每一条指令(CPU每执行完一条指令后,就会检查是否接收到了中断信号,如果没有则继续执行下一条指令)。2.CPU接收到由时钟部件发送的中断指令,则转换为内核态,操作系统将CPU交给处理时钟中断指令的内核程序(此时一般会将CPU内核交给另外一个应用程序B)3.CPU由内核态转换为用户态且应用程序B占有了CPU,CPU依次执行应用程序B的每条指令...
同理,上述情况也可以适用于I/O设备向CPU发送中断信号的情况。
1.4.2.2 内中断
内中断也被称为异常,指来自CPU执行指令内部的事件,如程序的非法操作码、地址越界以及专门的陷入指令等引起的事件。异常不能被屏蔽,一旦出现需要立刻处理。
内中断举例:
1.应用程序A试图在用户态下执行特权指令,这个指令是非法的,会引起一个中断信号,CPU接收到该中断信号,则转换为内核态,交由处理该中断信号的内核程序占有CPU。2.应用程序A试图请求操作系统内核提供的服务,此时应用程序A执行了一个特殊的指令(陷入指令),该指令也会引起一个中断信号。
陷入指令意味着应用程序主动将CPU的使用权交还给操作系统内核。(系统调用就是通过陷入指令实现的)
1.4.2.3 分类图
1.4.3 中断的基本原理
中断和异常的处理过程大致如下
当CPU在执行用户程序的第i条指令时检测到一个异常事件(或者在执行第i条指令后发现一个中断请求信息),则CPU中断当前应用程序,然后转换为内核态,交由相应的中断或异常处理程序执行。如果中断或异常处理程序能够解决该问题,则在中断或异常处理程序执行结束后,将CPU通过执行中断或异常返回指令回到被中断的用户程序的第i条指令或第i+1条指令继续执行;如果中断或异常处理程序发现这是一个不可恢复的致命错误,则终止用户程序。
其中,CPU检测到中断或异常后,会在“中断向量表”中,根据不同的中断信号类型,查找相应的中断处理程序的位置。
小节总结
1.5 系统调用
1.5.1 什么是系统调用
系统调用是提供给"程序员"使用的一系列接口的统称。系统中的各种共享资源都是由操作系统统一管理的,用户程序可以通过系统调用请求相关的服务(存储分配、I/O输入输出等功能)。
系统调用就是我们在1.1.2.2小节中提到的操作系统提供的程序接口
1.5.2 系统调用与库函数的区别
系统调用和库函数的区别如下表所示
层次 | 说明 |
---|---|
用户程序 | 可以直接进行系统调用,也可以使用库函数 |
编程语言 | 向上提供库函数,有的库函数会封装系统调用并隐藏系统调用细节 |
操作系统 | 向上提供系统调用,使上层程序能够请求内核的某些服务 |
1.5.3 系统调用的必要性
如果没有系统调用,即操作系统不会统一管理计算机的各种共享资源,那么如下场景就会发送错误:
当你想通过打印机打印某个文件,你使用鼠标按下了word的“打印”按钮,于是打印机开始打印你的文件。
过了一会儿,另外一个同事,按下了WPS的"打印"按钮,于是打印机开始打印他的文件,此后,这两个进程就会并发执行,你的文件内容会和他的文件内容混杂在一起。
上述场景就是因为打印机这个共享资源没有被统一管理。
因此系统调用的必要性就体现出来了,由操作系统内核对共享资源进行统一管理,并且向上提供"系统调用",用户进程如果想要使用打印机这种共享资源,必须通过系统调用向系统内核发送请求,系统内核再去协调处理这些请求。
1.5.4 系统调用的适用场景
凡是与共享资源有关的操作(I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户的非法操作。
系统调用的分类如下表所示
功能 | 说明 |
---|---|
设备管理 | 完成设备的请求、释放以及启动等功能 |
文件管理 | 完成文件的读、写、创建以及删除等功能 |
进程控制 | 完成进程的创建、撤销、阻塞以及唤醒等功能 |
进程通信 | 完成进程之间的消息传递或信号传递等功能 |
内存管理 | 完成内存的分配、回收以及获取作业占用内存区大小及始址等功能 |
1.5.5 系统调用的过程
具体步骤如下:
CPU执行应用程序,应用程序的某些指令传入一些系统调用参数,随后执行到陷入指令CPU执行到该陷入指令后,该中断指令引发中断信号,CPU转入内核态,由相应的中断处理程序(系统调用入口程序)占用,根据寄存器中的某些参数,辨别是什么类型的系统调用该系统调用的处理程序占用CPU执行相关指令,执行完毕后,返回应用程序,继续执行后续指令上述过程可以总结为:
传递系统调用参数->执行陷入指令->执行相应的处理程序处理系统调用->返回应用程序
小节总结
1.6 操作系统结构
随着操作系统的不断壮大,操作系统也出现了多种体系结构,目前,我们可以把操作系统的体系结构分为:分层结构、模块化、宏内核、微内核以及外核这五种。
1.6.1 分层结构
1.6.1.1 定义
分层结构是指将操作系统分为若干层,最底层(0层)是硬件,最高层(N层)是用户接口,每层只能调用紧邻它的低层的功能和服务,即低层向上层提供服务,高层单向依赖它的下一层。具体如下图所示。
1.6.1.2 优点
便于系统的调试和验证,简化了系统的设计与实现。
由于是单向依赖,可以从低层逐层向高层调试,如果在某层发现了问题,可以快速定位到错误出现在该层,因为它的低层已经被调试过,确保了提供的功能没有问题
易于扩展与维护。
可以很方便的修改某一层的功能,只要不改变该层的层间接口就不会影响其他层。
1.6.1.3 缺点
各个层次之间难以界定。效率较差,每次执行高层的功能时,都可能需要自下而上的不断调用低层的服务。1.6.2 模块化
1.6.2.1 定义
模块化指将操作系统按照功能划分为若干个独立的模块,每个模块负责某方面的功能,每个模块又可以进一步划分为各个子模块。如下图所示
1.6.2.2 优点
提高了操作系统设计的正确性、可理解性和可维护性增强了操作系统的可适应性提高了操作系统的开发效率1.6.2.3 缺点
模块之间的接口很难满足对接口的实际需求各个模块设计者齐头并进,每个决定无法建立在上一个以验证的正确决定的基础上,因此无法找到一个可靠的决定顺序(相对于分层结构而言)。1.6.3 宏内核
1.6.3.1 定义
宏内核又被称为单内核或者大内核,是指将操作系统的主要功能都作为一个紧密联系的整体运行在核心态,从而为用户程序提供高性能的系统服务。示意图如下。
1.6.3.2 优点
由于各个模块之间共享信息,可以快速的调用各个模块之间的服务,因此,宏内核具有极高的性能优势。
1.6.3.3 缺点
内核功能复杂,难以维护。内核中的某个功能模块出现故障,就可能导致整个系统崩溃。1.6.4 微内核
1.6.4.1 定义
微内核是指将操作系统内核中最基本的功能保留在内核,将不需要在核心态执行的功能移到用户态执行,降低内核的设计复杂性,那些被移出内核的操作系统代码根据分层的原则被划分成若干服务程序,它们的执行相互独立,交互则借助于微内核进行通信。
微内核结构将操作系统划分为了两大部分:微内核和多个服务器。
微内核是能够实现操作系统最基本功能的小型内核,包括如下功能:
与硬件处理紧密相关的功能客户和服务器之间的通信功能一些基础功能操作系统的绝大部分功能都放在微内核之外的一些服务器中。例如,进程管理服务器、I/O设备服务器等。这些服务器运行在用户态,它们之间的通信是通过微内核提供的消息传递机制实现的。示意图如下。
1.6.4.2 优点
易扩展,很多功能在内核外,修改或者新增一些功能是十分容易的。具有极好的可移植性,与CPU和I/O硬件相关的代码都放在内核中,其他的各种服务器都与硬件无关,因此将操作系统移植到另一个平台上需要的改动就很小了。1.6.4.3 缺点
微内核结构的缺点主要在于性能,因为它需要频繁的在核心态和用户态进行切换。
1.6.5 外核
外核相关知识了解即可。
外核是一种运行在内核态的程序,它的任务是为虚拟机分配资源,并且检查使用这些资源的企图,保证没有机器会使用他人的资源。
1.6.6 汇总对比
结构名称 | 特性 | 优点 | 缺点 |
---|---|---|---|
分层结构 | 内核分为多个层次,高层向低层单向依赖 | 便于调试;易于扩充与维护 | 各层边界难以确定;效率低,无法跨层使用 |
模块化 | 将内核划分为多个模块 | 易于维护;各个模块之间可以相互通信;支持动态加载新的模块 | 模块之间的接口定义未必合理;模块之间相互依赖,难以调试 |
宏内核 | 所有功能都放在内核中 | 性能高,各个模块相互直接调用 | 内核功能复杂,难以维护;某个功能出错可能导致整个系统崩溃 |
微内核 | 只把基本功能放在内核中,其余功能放在其他服务器中 | 内核功能少易于维护;可移植性强 | 性能较差,需要频繁在用户态和核心态切换 |
外核 | 内核负责进程调度、进程通信等功能,外核负责为用户分配未经抽象的硬件资源并保证资源使用安全 | 外核直接分配给用户“抽象的”硬件资源,使用户进程更加灵活地使用硬件资源 | 降低了系统的一致性 |
小节总结
1.7 操作系统引导程序
1.7.1 概述
由前面章节的学习,我们了解到,操作系统本质上也是一种程序,那么在计算机中,程序都是以数据的形式存放在硬盘的。当我们电脑按下开机键,如何运行安装在硬盘上的操作系统呢?这个问题,就需要本小节介绍的操作系统引导程序来完成了。它是指计算机利用CPU运行特定程序->通过程序识别硬盘->识别硬盘分区-识别磁盘分区上的操作系统->最终通过程序启动操作系统。上述过程就是在操作系统引导程序的引导下,一环扣一环的完成的。
1.7.2 操作系统引导的过程
在学习操作系统引导过程之前,我们首先需要弄明白硬盘中都存放了哪些数据。
下图所示是一个空的磁盘
刚买来的新磁盘,里面什么内容都没有,如同一个空盒子。
下图所示是一个安装了操作系统后的磁盘
下图所示是主存示意图
了解了上述相关结构后,接下来我们就要开始学习常见的操作系统的引导过程了,一共分为如下八个步骤。
激活CPU,激活的CPU会读取ROM中的boot程序,将指令寄存器设置为BIOS(基本输入/输出系统)的第一条指令,即开始执行BIOS指令。硬件自检。启动BIOS程序后,先进行硬件自检,检查各个硬件是否出现了故障,如果出现了故障,则主板会发出不同的蜂鸣声进行提示并中止启动。如果没有故障,则会进入下一步。加载带有操作系统的硬盘,BIOS开始读取Boot Sequence(通过CMOS里保存的启动顺序,或者通过与用户交互的方式),把控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。加载主引导记录MBR。硬盘以特定的标识符区分引导硬盘和非引导硬盘,主引导记录MBR的作用是告诉CPU要去哪个硬盘的哪个主分区查找操作系统。扫描硬盘分区表,加载硬盘活动区。MBR包含硬盘分区表,在硬盘分区表中,以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,查找到含有操作系统的硬盘分区(活动分区),开始加载活动分区,将控制权交给活动分区。加载分区引导记录PBR。读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR)。其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)。加载启动管理器,分区引导记录搜索活动分区中的启动管理器,加载启动管理器。加载操作系统。上图中的执行过程可以总结为以下几个步骤:
1.CPU从特定的主存地址开始取指令,执行ROM中的引导程序(先进行硬件自检,然后再开机)
2.将磁盘的第一个扇区中的MBR读入内存,执行磁盘扫描程序,扫描磁盘分区表
3.从活动分区(又称主分区,即安装了操作系统的分区)读取分区引导记录,执行其中的程序
4.从根目录下找到完整的操作系统初始化程序(启动管理器),加载操作系统完成开机
1.8 虚拟机
1.8.1 概述
虚拟机是指利用虚拟化技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境的一种逻辑计算机。
目前虚拟机有两种虚拟化方法,我们可以分为第一类虚拟机和第二类虚拟机。
1.8.2 第一类虚拟机
第一类虚拟机就像一个操作系统,它是计算机系统中唯一一个运行在最高特权级的程序,它在裸机上运行并具备多道程序功能。
虚拟机作为用户态的一个进程运行,不允许执行敏感指令,然而,虚拟机上的操作系统认为自己处于内核态,这个被称之为虚拟内核态。当虚拟机操作系统执行了一条特权指令时,会陷入虚拟机管理程序,在支持虚拟化的CPU上,虚拟机管理程序检查这条指令,如果该指令是由于虚拟机中的操作系统执行的,则安排这条指令正常运行,否则将模拟真实硬件面对用户态执行特权指令的行为。
示意图如下
1.8.3 第二类虚拟机
第二类虚拟机就像一个普通进程一样,依赖于Windows、Linux等操作系统提供的资源。
例如:我们可以在Windows操作系统上安装VMware,然后再VMware上安装Linux操作系统的镜像,这样,我们就可以在Windows系统上使用Linux系统了,且可以同时在Windows系统上运行其他进程。
示意图如下
小节总结
参考文献
《2023年操作系统考研复习指导》-王道论坛
如果这篇文章有帮助到你,不妨点赞、转发、收藏一下喽~