操作系统定义
计算机系统层次
操作系统定义:
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调
度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本
的系统软件。
操作系统提供的功能
作为系统资源的管理者
- 文件管理
- 存储器管理
- 处理机管理
- 设备管理
向用户提供方便的服务
对于一台硬件设备,它只能听懂二进制指令,对我们操作并不友好;操作系统就是把这些不友好的接口封装成友好的接口;封装思想:操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对操作系统发出命令即可。
GUI:图形化用户接口(Graphical User Interface),用户可以使用形象的图形界面进行操作,而不再需要记忆复杂的命令、参数。
联机命令接口实例(Windows系统) 联机命令接口=交互式命令接口(就是用户说一句系统跟着做一句,就是我们常用的cmd)
脱机命令接口实例(Windows系统) 脱机命令接口=批处理命令接口(就是我们平常用的.bat文件,用户说一堆。系统跟着做一堆)
程序接口:可以在程序中进行系统调用(系统调用类似于函数调用,是应用程
序请求操作系统服务的唯一方式)来使用程序接口。普通用户不能直接使用程序接口,只能通过程
序代码间接使用
作为最接近硬件的层次
需要实现对硬件机器的拓展
没有任何软件支持的计算机成为裸机。在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更方便的机器
通常把覆盖了软件的机器成为扩充机器,又称之为虚拟机。
操作系统特征
- 并发(最基本)
并发指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
注意:并行是指两个或多个事件在同一时刻同时发生。两者是有区别的
操作系统的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观
上看是交替运行的。
重点:
- 单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行
- 多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行
- n核CPU意味着可以并行的执行n个程序
- 共享(最基本)
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
资源共享方式:
- 互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
- 同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问(同时指的是宏观,微观上可能是交替的对资源进行访问)
并发和共享区别:
如果失去并发性,则系统中只有一个程序正在运行,则共享性失去存在的意义。
如果失去共享性,则QQ和微信不能同时访问硬盘资源,就无法实现同时发送文件,也就无法并发。
并发和共享互为存在条件
- 虚拟
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上
对应物(后者)是用户感受到的;没有并发性就谈不上虚拟性。
虚拟技术:
- 空分复用技术
- 时分复用技术
- 异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,
而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
总结:没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本的特征
OS的发展与分类
操作系统运行机制
对于我们平时写的程序,都会通过编译器或者解释器“翻译成”机器指令(二进制),然后交给CPU执行一条一条的指令。
“指令”就是处理器(CPU)能识别、执行的最基本命令(二进制的)
我们程序员平时写的程序是“应用程序”;而实现操作系统功能的程序是“内核程序”;很多的内核程序就组成了“操作系统内核”,简称内核(Kernel);内核是操作系统最重要最核心的部分,也是最接近硬件的部分
注意:操作系统的功能未必都在内核中,如图形化用户界面 GUI
内核程序:操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
**应用程序:**为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态。
特权指令:操作系统内核可以让CPU执行特权指令。
非特权指令:我们平时的程序只能使用非特权指令。
CPU的两种状态:
- 内核态
处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
- 用户态
处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
**区分CPU状态:**CPU 中有一个寄存器叫 程序状态字寄存器(PSW),其中有个二进制位,1表示
“内核态“,0表示”用户态“。
黑客攻击的角度:如果我们在应用程序中嵌入一段特权指令破坏当前系统,会发生什么结果呢?
当黑客在应用程序中嵌入特权指令时,首先执行应用程序CPU处于用户态,此状态的CPU是不能执行特权指令的,遇到特权指令后会引发一个中断信号,CPU检测到中断信号之后会立即变为内核态(但是不会执行该恶意特权指令),并且停止当前程序的运行,转而处理中断信号的内核程序。
CPU状态的切换
内核态——>用户态:执行一条特权指令——修改PSW的标志位为“用户态”,这个动作意味着操作系统
将主动让出CPU使用权
用户态——>内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。(触发中断信号不仅仅是非法使用特权指令,还有很多事件会触发中断信号。但凡需要操作系统介入的地方,都会触发中断信号)
操作系统的内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
实现操作系统内核功能的那些程序就是内核程序。
大内核和微内核
中断和异常
基础知识:CPU上会运行两种程序,一种是操作系统内核程序(整个系统的管理者),一种是应用程序。在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序;中断是让操作系统内核夺回CPU使用权的唯一途径。
中断的作用:”中断“会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权。
中断的类型:
- 内中断(CPU在执行指令时会检查是否有异常发生)
与当前执行的指令有关,中断信号来源于CPU内部
两个内中断的例子:
- 就是我们上面所说的在应用程序中嵌套特权指令(就是在用户态下执行特权指令);执行除法运算时也会引发一个中断信号
- 就是应用程序想要请求操作系统内核的服务,此时会执行一种特殊的指令——陷入指令(注意:他是在用户态可以执行的,所以并不是特权指令),该指令会引发一个内部中断信号。执行”陷入指令“,意味着应用程序主动地将CPU控制权还给操作系统内核。系统调用就是通过陷入指令完成的。
- 外中断(每个指令周期末尾CPU都会检查是否有外中断信号需要处理)
与当前执行的指令无关,中断信号来源于CPU外部
外中断的例子:
- 时钟中断——由时钟部件发来的中断信号。
当CPU在执行应用程序时,时钟部件会每隔一段事件给CPU发出一个时钟中断信号;CPU会执行内核指令,然后CPU会分配给另一个程序。这样也就形成了并发
2.I/O中断——由输入/输出设备发来的中断信号
注意:我们平时所说的中断就是指外中断。内中断称为异常。
中断机制的基本原理:不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。(很显然,中断处理程序一定是内核程序,需要运行在”内核态“)。
系统调用
背景知识:操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用完成。
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
系统调用与库函数:
不涉及系统调用的库函数:取绝对值的函数
涉及系统调用的库函数:创建一个新文件的函数
系统调用的必要性:
由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用” ,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。
应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的过程:
当应用程序在用户态执行指令时,会执行一条陷入指令,引发中断信号,此时CPU进入相应的中断处理程序——即系统调用的入口程序;执行指令时候都会向寄存器发送一个参数,根据该参数判断用户需要哪种系统调用服务。当处理完系统调用后,CPU又回到用户态,继续执行应用程序的指令。
注意:
- 陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,使CPU进入核心态
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态进行。
操作系统体系结构
操作系统的内核
内核是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。操作系统内核需要运行在内核态,操作系统给非内核功能运行在用户态。
大内核:包括时钟管理、中断管理、原语、进程管理、存储器管理、设备管理等功能。
微内核:只包括时钟管理、中断管理、原语。
大内核体系结构
将操作系统的主要功能模块都作为系统内核,运行在内核态
优点:高性能
缺点:内核代码庞大、结构混乱、难以维护;大内核的某个功能模块出错,就可能导致整个系统崩溃
微内核体系结构
只是把基本的功能保留在内核
优点:内核功能少、结构清晰、方便维护
缺点:需要频繁的在核心态和用户态之间切换,性能低;用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信
声明:变态的过程是有成本的,要消耗不少时间,频繁地变态会降低系统性能
分层结构
最底层是硬件,最高层是用户接口,每层可调用更低一层。
思想:内核分多层,每层可单向调用更低一层提供的接口
优点:
- 便于调试和验证,自底向上逐层调式验证
- 易于扩充和维护,各层之间调用接口清晰固定
缺点:
- 仅可调用相邻低层,难以合理定义各层的边界
- 效率低,不可跨层调用,系统调用执行时间长
模块化
将内核划分为多个模块,各模块之间相互协作;内核=主模块+可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理
可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核
优点:
- 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发
- 支持动态加载新的内核模块(eg:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
- 任何模块都可以直接调用其它模块,无需采用消息船传递进行通信,效率高
缺点:
- 模块间的接口定义未必合理、使用
- 模块间相互依赖、难以调试和验证
外核
内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源、且由外核负责保证资源使用安全。
优点:
- 外核可直接给用户进程分配 “不虚拟 不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源。
- 减少了虚拟硬件资源的的“映射层” ,提升效率。
缺点:
- 降低了系统的一致性
- 使系统变得更复杂
操作系统引导
操作系统的引导就是我们电脑开机时候,操作系统是如何运行起来的
安装操作系统后的磁盘:
操作系统引导过程:
- CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
- 将磁盘的第一块——主引导记录 读入内存,执行磁盘引导程序,扫描分区表
- 从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
- 从根目录下找到完整的操作系统初始化程序(即 启动管理器)并执行,完成“开机”的一系列动作
虚拟机
虚拟机:使用虚拟化技术,将一台物理机器虚拟化为多台虚拟机器(Virtual Machine, VM),每个虚拟机器都可以独立运行一个操作系统。
-
第一类虚拟机,直接运行在硬件上
-
第二类虚拟机,运行在宿主操作系统之上
比较: