操作系统
- (一)、操作系统概述
- 1.1_操作系统的概念、功能和目标
- (1).操作系统的定义
- (2).操作系统的功能和目标——作为系统资源的管理者
- (3).操作系统的功能和目标——向上层提供方便易用的服务
- (4).操作系统的功能和目标--作为用户和计算机硬件之间的接口
- (5).操作系统的功能和目标——作为最接近硬件的层次
- (6).小章总结:
- 1.2_操作系统的四大特征
- (1).操作系统的特征——并发
- (2).**操作系统的特征——共享**
- (3).操作系统的特征——并发和共享的关系
- (4).操作系统的特征——虚拟
- (5).操作系统的特征——异步
- (6).小章总结
- 1.3_操作系统的发展与分类
- (1).手工操作阶段.
- (2).批处理阶段——单道批处理系统 (操作系统雏形)
- (3).批处理阶段——多道批处理系统 (操作系统诞生)
- (4).分时操作系统
- (5).实时操作系统
- (6).其他操作系统
- 1.4_操作系统的运行机制与体系结构
- (1).预备知识——程序是如何运行的?
- (2).内核程序与应用程序 (两种程序)
- (3).特权指令与非特权指令 (两种指令)
- (4).内核态与用户态 (两种处理器状态)
- (5).内核态 用户态的切换 (变态)
- (6).操作系统内核
- (7).操作系统的体系结构 (大内核 微内核)
- (8).本章小结
- 1.5_中断和异常
- (1).中断机制的诞生
- (2).中断的概念和作用
- (3).中断的类型
- (4).中断机制的基本原理
- 1.6_系统调用
- (1).什么是系统调用,有何作用?
- (2).系统调用与库函数的区别
- (3).为什么系统调用是必须的?
- (4).什么功能要用到系统调用?
- (5).系统调用的过程
(一)、操作系统概述
1.1_操作系统的概念、功能和目标
(1).操作系统的定义
- 厂家组装裸机
- 出售前安装一台操作系统
- 用户安装应用程序进行兼容(操作系统)
- 用户使用应用程序进行业务需求
用户和操作系统是有直接关系的,并不是没有直接关系
操作系统
是指控制和管理整个计算机系统的硬件和软件资源【1.操作系统是系统资源的管理者】,并合理地阻止调度计算机的工作和资源的分配,以提供用户和其他软件方便的接口和环境【2.向上层提供方便的服务】,他是计算机系统中最基本的系统软件【3.是最接近硬件的一层软件】。
(2).操作系统的功能和目标——作为系统资源的管理者
首先要看的是操作系统作为软件和硬件中间的层次,它是系统资源的管理者。
处理机管理: CPU。存储器管理: 内存。文件管理: 放的位置。设备管理: 摄像头。
补充知识: 进程是一个程序的执行过程。执行前需要将该程序放到内存中,才能被CPU处理。
下图以QQ视频聊天为例
- 在各个文件夹中找到QQ安装的位置 (如: D:/tencenter/qq/bin)
逐层打开文件夹,找到QQ.exe.这个程序(可执行)的存放位置
【文件管理】 - 双击打开QQ.exe
需要把该程序相关数据放入内存
【存储管理】 - QQ程序正常运行
对应的进程被处理机(CPU)处理
【处理机管理】 - 开始和朋友视频聊天
需要将摄像头设备分配给进程
【设备管理】
(3).操作系统的功能和目标——向上层提供方便易用的服务
(4).操作系统的功能和目标–作为用户和计算机硬件之间的接口
命令接口
:允许用户直接访问
联机命令接口或交互式命令接口:
用户说一句,系统做一句
脱机命令接口:
用户说一堆,系统做一堆
搜索*.bat随意打开一个就会发现:
.bat文件里有一堆命令,但本质上和time命令没有任何区别,我们只不过是把这一系列的命令罗列在了清单里,然后当我们执行.bat文件时操作系统其实就是根据这个文件当中的命令一条一条地往后执行。
程序接口
: 允许用户通过程序间接使用,由一组系统调用(系统调用命令/广义指令)组成 (程序接口=系统调用)
GUI
图形化用户接口: 现代操作系统中最流行的图形用户接口,用户可以使用形象的图形界面进行操作,而不再需要记忆复杂的命令、参数。eg:在window操作系统中,删除一个文件只需把文件拖拽到回收站即可
小总结:
(5).操作系统的功能和目标——作为最接近硬件的层次
- 需要提供的功能和目标: 实现对硬件机械的拓展
- 没有任何软件支持的计算机称为
裸机
。在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更方便的机器。 - 通常把覆盖了软件的及其成为
扩充机器
,又称之为虚拟机
类比:
硬件: 锤子、锯子、木头、钉子…
操作系统: 优秀的工匠
操作系统对硬件的拓展: 房子、车子、帆船
普通用户: 直接使用木匠拓展的工具
(6).小章总结:
1.2_操作系统的四大特征
(1).操作系统的特征——并发
并发
: 指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
并行
:指两个或多个事件在同一时刻同时发生。微观上也是同时的
并发和并行的区别:
操作系统的并发性
: 指计算机系统中同时存在多个运行着的程序。这些程序微观上看着是交替执行的,宏观上是同时执行的。
一个单核处理机(CPU)同一时刻只能执行一个程序,因此操作系统会负责协调多个程序进行交替执行
操作系统的诞生: 操作系统就是伴随着: "多道程序技术"而出现的。因此操作系统和程序并发是一起诞生的
当今的计算机,一般是多核CPU.
比如: intel的第八代i3处理器就是4核CPU.意味着有四个程序可以并行执行。
但是操作系统的并发性依然必不可少
。
(2).操作系统的特征——共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
所谓的同时: 往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
有的时候这个同时共享也有可能是微观上也确实在同时地共享资源,比如边打游戏边听歌,扬声器设备一边在播放游戏的音效一边在播放音乐。在这种情况下,扬声器的声音输出设备是真的在微观上也是同时正在被音乐播放器和游戏这两个进程同时使用的。(并行)
(3).操作系统的特征——并发和共享的关系
并发性:指计算机系统中"同时"存在多个运行着的程序
共享性:是指计算机中的资源可供内存中多个并发执行的进程共同执行。
总之并发性和共享性互为存在条件
(4).操作系统的特征——虚拟
虚拟是指一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际上真实存在的,而逻辑上对应物(后者)是用户感受到的。
空分复用技术
虚拟处理器技术
(5).操作系统的特征——异步
异步是指: 在多个程序环境下,允许多个程序并发执行,但是由于资源优先,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
(6).小章总结
没有并发和异步,就谈不上虚拟和异步,因此最基本的两个特征就是:并发和异步
1.3_操作系统的发展与分类
(1).手工操作阶段.
主要缺点: 用户独占全机,人机矛盾导致效率低
由有无小孔代表0和1
(2).批处理阶段——单道批处理系统 (操作系统雏形)
主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序CPU有大量的时间是在空闲等待I/0完成。资源利用率依然很低
引入脱机输入/输出技术(用外围机+磁带完成),并由监督程序负责控制作业的输入、输出
操作系统的雏形
(3).批处理阶段——多道批处理系统 (操作系统诞生)
主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持“忙碌”状态,系统吞吐量增大。
主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。
eg:无法调试程序/无法在程序运行过程中输入一些参数)
(4).分时操作系统
分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互
主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点: 不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户作业服务一个时间片,不区分任务的紧急性。
(5).实时操作系统
主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性
(6).其他操作系统
网络操作系统是伴随着计算机网络的发展而诞生的,能把网络中各个计算机有机地结合起来,实现数据传送等功能,资源的共享 (如文件共享) 和各台计算机之间的通信。 (如: windows NT 就是06一种典型搜索评论笔记网站服务器就可以使用)
分布式操作系统:主要特点是分布性和并行性。系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成这个任务。
个人计算机操作系统:如 Windows xP、Macos,方便个人使用。
1.4_操作系统的运行机制与体系结构
(1).预备知识——程序是如何运行的?
像我们平时用c语言代码写的程序都会经过编译器的编译工作把C语言代码翻译成二进制机器指令。像我们平时用C语言这种高级语言写的一条代码经过编译之后可能会对应很多机器指令。程序运行的过程其实就是CPU执行一条一条机器指令的过程。
“指令”就是处理器CPU能识别,执行的最基本命令。
注:很多人习惯把Linux,Windows,MacOS的“小黑框”中使用的命令也成为“指令”,其实这是“交互式命令接口”,注意与本节的“指令”区别开。本节中的“指令”指二进制机器指令
总之平时我们用高级语言编写的程序最后执行的时候肯定是要变成CPU能够读的懂的用二进制机器指令表现的这种形式,这就是程序运行的基本原理
(2).内核程序与应用程序 (两种程序)
在操作系统这门课当中,我们要注意区分两种类型的程序,分别是内核程序和应用程序。我们普通程序员写的程序就是“应用程序”。微软、苹果有一帮人负责实现操作系统,他们写的是“内核程序”。由很多内核程序组成了“操作系统内核”,或简称“内核(Kernel)”。内核是操作系统最重要最核心的部分,也是最接近硬件的部分
。甚至可以说,一个操作系统只要有内核就够了(eg:有的同学可能接触过容器技术,比如说Docker,在Docker容器里只需要有Linux的内核就可以实现Linux的所有功能了)。操作系统的功能未必都在内核中,如图形化用户界面 GUI。
即使没有图形化的界面我们依然可以用命令行(也就是之前说的“小黑框”)的方式来使用操作系统。所以操作系统的内核当中所包含的只是操作系统当中最重要最核心的功能
(3).特权指令与非特权指令 (两种指令)
既然操作系统内核是系统资源的管理者,它作为管理者的角色有时可能会让CPU执行一些比较特殊的指令
在CPU设计和生产的时候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出其类型。
怎么区分是特权指令还是非特权指令?
(4).内核态与用户态 (两种处理器状态)
虽然CPU能够分辨出特权指令和非特权指令,但是它又怎么分辨出此时正在执行的指令到底是一个“应用程序”的指令还是一个“内核程序”的指令呢?为了让CPU能够区分此时正在运行的指令是属于应用程序还是内核程序,CPU会被划分成两种状态,一种叫“内核态”,一种叫“用户态”。
CPU 有两种状态,“内核态”和“用户态
处于内核态时
,说明此时正在运行的是内核程序,此时可以执行特权
指令处于用户态
时,说明此时正在运行的是应用程序,此时只能执行非特权指令
拓展:CPU 中有一个寄存器叫程序状态字寄存器 (PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”别名: 内核态=核心态=管态;用户态=目态
接下来我们要探讨的问题是CPU要怎么实现这两种状态间的切换
(5).内核态 用户态的切换 (变态)
内核态->用户态:执行一条特殊的指令 修改PSW的标志位为:“用户态”,这个动作意味着操作系统主动让出CPU
用户态->内核态: 由"中断"引发,硬件自动变成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。
假设现在有两种体系结构的系统。第一个系统采用的是大内核的体系结构,由于进程管理,存储管理这些功能都是被划分在内核当中的,所以这些功能的处理都需要运行在内核态,只有应用程序是运行在用户态的。而对于采用微内核结构的操作系统来说,只有和硬件联系最紧密的这些功能被划分在了内核当中,只有这些功能是需要在内核态下才可以执行的,而其他的这些功能模块在用户态下就可以运行。
假设现在一个应用程序想要请求操作系统的服务,并且这个服务的背后需要同时涉及到进程管理、存储管理、设备管理这几个功能。如果采用的是大内核的体系结构的话,那么应用程序向操作系统提出服务的请求,这个时候CPU会从用户态切换为内核态,然后开始运行这一系列的内核程序。应用程序的这个请求只需要两次变态就可以了。
而如果采用的是微内核的体系结构的话,应用程序向操作系统提出服务的请求,接下来操作系统的这几个模块都需要为操作系统服务。而进程管理这个模块在处理应用程序的请求的时候同样也需要得到内核的支持,所以这个模块对内核的访问就涉及到CPU从用户态转到内核态,服务完成之后又会从内核态转回用户态。然后同样地存储管理和设备管理这两个模块在完成相应的工作的时候也需要得到内核的支持,因此每一个模块都需要请求内核的服务,每一次请求内核的服务都会涉及到一个CPU状态转换的过程。整个过程处理需要六次变态。
(6).操作系统内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
实现操作系统内核功能的那些程序就是内核程序。
操作系统内核
- 时钟管理: 实现计时功能
- 中断处理: 负责实现中断机制
- 原语: (1).是一种特殊的程序。(2).处于操作系统最底层,是最接近硬件的部分。(3).这种程序的运行具有原子性–其运行只能一起合成,不可中断(4).运行事件较短、调用频繁。
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆与硬件管理较紧密的模块⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆ - 对系统资源进行管理的功能: (1).进程管理 (2).存储器管理(3).设备管理
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆有的操作系统可能不包含这部分⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆
(7).操作系统的体系结构 (大内核 微内核)
大内核
(1).将操作西永的朱永功能模块作为系统内核,运行在核心态
(2).优点: 高性能
(3).缺点: 内核代码庞大,结构混乱,难以掩护
微内核
(1).只把最基本的功能保留在内核
(2).优点: 内核功能少,结构清晰,方便维护
(3).缺点: 需要频繁地在核心态和用户态之间切换,性能低。
eg: 操作系统的体系结构与企业管理问题很相式
内核是企业地管理层
,负责一些重要地工作。只有管理层才能执行特权指令
,普通员工只能执行非特权指令
。用户态和核心态的切换相当于员工和管理层之间的工作交接
。
大内核: 企业初创实体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织结构混乱,难以维护。
微内核: 随着企业体量越来越大,管理层只负责最核心的工作。优点是阻止结构清晰,方便维护;缺点是效率低
(8).本章小结
1.5_中断和异常
(1).中断机制的诞生
早期的计算机,各程序只能串行执行,系统资源利用率低。
也就是: 一个个执行,这个执行完毕之后下面的才能继续执行。
为了解决上面的问题:
人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行。
本质: 发生中断就以为着需要操作系统介入(不停变态->用户态和核心态
),开展管理工作。
(2).中断的概念和作用
1.当中断发生时,CPU立即进入核心态
2.当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理。
3.对于不同的中断信号,会进行不同的处理。
发生了中断,就意味着需要操作系统接入,开展管理工作。由于操作系统的管理工作(比如: 进程进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转换为核心态。中断可以使用CPU从用户态切换为核心态,使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。
用户态->核心态 就是通过中断实现的。并且中断是唯一途径
核心态->用户态 的切换时通过一个特权指令,将程序状态字(PSW)的标志位设置为"用户态"
(3).中断的类型
内中断的例子
例子1:试图在用户态下执行特权指令
例子2:执行除法指令时发现除数为0
总之若当前执行的指令本身或者指令的一些参数是非法的,则会引发一个中断信号
例子3:有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令陷入指令,该指令会引发一个内部中断信号。执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的
注意陷入指令并不是特权指令。因为这个程序是运行在用户态的,而在用户态下可以执行的指令不可能是特权指令
外中断的例子
例子1:时钟中断,由时钟部件发来的中断信号
例子2:I/O中断,由输入/输出设备发来的中断信号
时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号。通过时钟中断信号就可以实现多道程序并发运行了。当某应用程序执行了几条指令后,时钟部件发现此时已经过了50ms,它会给CPU发送一个中断信号(注意这个中断信号和当前执行的指令是没有关系的,它来自CPU的外部)。然后根据我们之前学习的知识,CPU检测到该信号后会先暂停此时正在运行的应用程序,然后转而执行一个相应的内核程序来处理这个中断信号。所以接下来CPU会对时钟中断信号进行处理,并且转为内核态。在内核态下CPU开始执行内核程序来处理刚才收到的中断信号,这个内核程序执行的过程当中发现该应用程序已经用了50ms的时间,应该让下一个应用程序上CPU运行。于是接下来这个内核程序会把CPU的使用权给下一个应用程序,接下来又会切换回用户态,然后下一个程序上CPU运行。之后的过程都是类似的,通过这个例子可以看出应用程序是如何在中断机制的支持下一直不断地切换来实现并发运行的,以及中断在现代计算机中到底有多大的作用。
除了时钟发出的中断信号之外,有时候还会有来自I/O设备的中断信号。比如说某个应用程序可能会请求打印机的打印服务,打印机在打印输出完成之后会向CPU发出中断信号用来通知CPU任务完成。接下来CPU会用中断信号相对应的内核程序来对中断信号进行处理。
每一条指令执行结束时,CPU都会例行检查是否有外中断信号
(4).中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号以此来找到相应的中断处理程序在内存中的存放位置。的类型去查询“中断向量表
1.6_系统调用
(1).什么是系统调用,有何作用?
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口(用户)和程序接口(程序)。其中,程序接口由一组系统调用
组成。
“系统调用
”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
(2).系统调用与库函数的区别
其实我们在写程序的时候可以用汇编语言的方式来直接请求系统调用服务的,但是现在的编程更多地是使用高级语言来编程,所以我们一般会直接使用高级语言的库函数,但是这些高级语言的库函数在底层其实也会用到操作系统提供的系统调用功能来请求操作系统的服务。所以系统调用应该是比高级语言的库函数更为底层的接口。
我们的裸机之上是操作系统,操作系统向上层提供的接口是系统调用,使上面的库函数和应用程序能够通过系统调用的方式来请求操作系统的内核的服务。然后在操作系统之上各种各样的高级编程语言会用库函数的方式来封装这些系统调用,然后向更上层的应用程序的程序员来暴露一些更好用的编程接口。
不过也并不是所有的库函数都会使用系统调用
(3).为什么系统调用是必须的?
通过系统调用来实现并发进程对共享资源的互斥访问
由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。
(4).什么功能要用到系统调用?
应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、/操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成
。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
(5).系统调用的过程
假设一个应用程序想要进行系统调用,它在背后需要做什么事情呢?
现有一个应用程序运行在用户态,然后这个应用程序的各个指令会被CPU依次执行。当它想要发出系统调用的时候,他需要用传参数的指令给CPU的寄存器当中传递一些必要的参数,比如说在某一个寄存器中放入了参数1,这个参数1是指明了此次要进行哪种类型的系统调用,比如说像Linux里的“folk”系统调用。传递参数的指令可能要有多条,主要看我们的系统调用需要传递几个参数。操作系统会根据应用程序提供的这些参数来判断它想要的到底是哪种服务,当这些参数都放入了寄存器之后,应用程序就会执行一条特殊的指令叫陷入指令,该指令会引发一个内中断,CPU在检测到这个内部中断信号之后,它发现这个内部中断信号是由陷入指令引起的,于是这个CPU接下来就会暂停运行这个应用程序,转而去执行处理陷入指令的那个处理程序,这个程序就是系统调用入口程序。显然接下来要执行的程序肯定是属于内核程序,因此它需要在内核态下运行,我们也可以说这个程序也是某一种中断处理程序,只不过它处理的是由陷入指令引发的那个内中断。接下来系统调用入口程序会检查寄存器里的参数,通过第一个参数它会知道此时这个应用程序想要的是这种类型的系统调用服务,于是接下来入口程序就会调用与特定的系统调用类型所对应的处理程序,然后让这个程序上CPU运行。那这个系统调用处理程序在执行的时候就可以根据应用程序传递的其他参数来看一下它所需要的具体是哪些服务。当系统调用被处理完之后CPU又会转回用户态,然后接着执行之前的那个应用程序。
执行了陷入指令之后就意味着这个应用程序把CPU的控制权主动交还给了操作系统的内核,用这样的方式来请求操作系统的服务,注意它并不是特权指令。
陷入指令是唯一一个只能再用户态执行,而不可在核心态执行的命令。