操作系统 复习文档
操作系统基本
第一章 操作系统引论
操作系统的目标和作用
操作系统目标是 实现管理计算机系统的 方便性-有效性-可扩充性-开放性
这四个目标如何记忆呢?
前两个可以看做是操作系统对于计算机的有效,对于人交互的有效
后两个看成是操作系统的进步,可扩充性是值得操作系统可以扩充其他功能,而开放性是指遵守国际协议,与其他兼容
不开放的操作系统就是不兼容的操作系统
操作系统的作用: 主要作用是管理硬件设备,提高他们的使用效率和系统吞吐量,并为用户和程序提供一个简单的接口,以便于用户和应用程序使用硬件设备.
不同的角度看操作系统的作用 人机交互 资源管理 资源抽象 可以联想计算机的四个特征来记忆
作用:
- 作为用户与计算机硬件系统之间的接口
- 作为计算机系统资源的管理者
- 实现了对计算机资源的抽象
操作系统的不同种类
- 为了提高计算机资源利用率
单道批处理系统 对比 多道批处理系统
- 为了方便人机交互需求
分时操作系统 对比 实时操作系统
- 为了普及计算机使用
微机操作系统
- 为了完成某一个功能而设计
嵌入式操作系统
- 为了对网络资源进行管理
网络操作系统
- 为了利用多个计算机资源
分布式操作系统
主要理解操作系统的分类就是,单道多道操作系统的区别,分时操作系统和实时操作系统的区别,微机操作系统是什么
单道与多道
单道批处理指的是上一个任务结束之后立即执行下一个任务,同一时间只能执行一个任务
多道批处理系数指的是,在同一时间,不同的任务使用计算机的不同资源,所以这些互不干扰的任务就可以同时进行
分时与实时
之前的操作系统一直都是实时操作系统,也就是当轮到这个任务执行了,那么这个任务一定会一直执行直到任务执行完毕
而分时操作系统为了满足人机交互的需求,需要在任务执行途中,执行另外的任务,这就是分时操作系统
主要的技术方式就是一个任务的时间片到了,任务会主动将cpu让出来,这样就可以插入其他任务了
此外分时操作系统还实现了共享主机的功能,多个用户使用同一台计算机的时候,就可以让计算机分时运行来自多个用户的任务
操作系统的基本特征
- 并发
- 共享
- 虚拟
- 异步
并发
并发这个特征就是为了提高计算机资源的利用率
话说多道批处理就是利用的并发提高了系统资源的利用率
为了提供操作系统的并发性质,操作系统还引入了接下来大名顶顶的进程概念
共享
在并发执行程序的过程中会出现资源抢占的情况,共享特征就是解决资源抢占问题
不同的资源有不同的共享方式,常见的有两种
- 互斥共享
- 同时共享
虚拟
虚拟的一大作用就是复用
通过复用技术使得原本有限的资源在使用的时候似乎是更多的,然而实际上只是提高了资源的利用率而不是资源的实际数量
虚拟技术就是通过复用技术,使得资源看起来更多的技术,上层不需要直到资源到底是怎样拿到的,只需要知道能够拿到资源即可
异步
并发执行情况下,任务的执行顺序,完成时间实际上不是可预知的,实际的运行效率和计算机资源的实际情况有关
异步就是运行多个任务在相同提交顺序的情况下,不同的执行流程.
总而言之,操作系统的四个特征就是 并发以及并发问题的解决并发的好处并发的特点
并发 -> 并发完成的问题解决 -> 并发的好处 -> 并发与顺序的不同点
操作系统的结构
从时间顺序上来讲,操作系统的结构:
- 简单结构
- 模块化结构
- 分层式结构
- 微内核结构
- 外核结构
简单结构
简单结构就是没有什么结构
典型的例子就是 早期的 MS-DOS操作系统
模块化结构
按照功能将操作系统换分为具有一定独立性的模块
分层式结构
使得模块之间有层次,上层模块使用下层模块的服务,下层模块为上层模块提供服务,这样进一步确定了模块的位置
主要缺点是每次执行一个功能都要经历这么多层,效率很低
微内核结构
主要流行起来的原因是多处理器机器的出现,分布式系统的出现
什么是微内核结构?
其实现在也没有什么供人的定义,但是微内核结构有4个方面
- 足够小的内核
- 基于客户/服务器模式
- 采用策略与机制分离原则
- 采用面向对象技术
第一点,微内核具有很小的内核…..
我不知道这是为什么,很小的内核有什么样的好处?
内核是指精心设计的实现现代操作 系统的最核心的功能,的小型内核
- 通常内核包括
- 处理与硬件紧密相关的部分
- 一些最基本的功能
- 客户和服务器之间的通信
基于客户/服务器模式指的是 :
将操作系统最核心的功能放在内核中,而那操作系统的绝大部分功能放在微内核外的一组服务器(进程)中实现,都是被当做进程来实现的, 他们运行在用户态,客户与服务器之间是利用微内核的消息传递机制实现信息交换的
- 采用策略与机制分离原则
所谓机制就是实现某一功能的具体执行机构
策略则是指在机智的基础上,借助有某些参数和算法来实现该功能的优化或达到不同的功能目标
策略利用机制,实现不同的目标或者优化
- 采用面向对象技术
对象,封装,继承等概念
系统调用
系统调用是操作系统为用户程序提供的获取操作系统服务的唯一途径,系统调用不仅仅可以给用户程序使用,操作系统自身也使用系统调用
这样操作系统的接口就很明显了,使用系统调用就是操作系统的接口
什么是系统调用?
需要和过程调用进行对比
过程调用可以拆分为过程和调用,其中过程可以理解为一段代码的执行过程,调用指的是将执行流交给被调用的代码过程
系统调用也是一种过程调用,但是相比于一般的过程调用,系统调用有自己的特点
- 运行在不同的系统状态
使用系统调用的调用程序一般都是运行在用户态的用户程序,而被调用的系统调用是运行在内核态的程序.
- 状态转换
在交换执行流的时候,要将运行在用户态的程序的程序,转而执行运行在内核态的过程,因为这是算作一个程序的执行,所以需要做程序运行状态的转换,此时需要软中断将用户态转变为内核态,等到内核态分宜之后才能去调用系统调用的子程序
- 返回问题
因为在系统调用的时候,原程序处于软中断,如果抢占式系统,此时有可能内别的进程抢占cpu,此时系统调用将不会返回,而是处于就绪队列,等待原程序再次占据cpu
- 嵌套调用
系统调用可以调用系统调用,但是系统调用最多只能嵌套6层,而一般的过程调用没有限制
系统调用类型
大致三种
- 进程控制类系统调用
进程的管理是操作系统的一大功能
- 文件操纵类系统调用
文件操作也是操作系统的一大功能
- 进程通信类
进程通信类也是操作系统的一大功能
第二章 进程的描述与控制
刚才才提到了系统调用的主要三种,就有进程控制类系统调用
什么是进程?
为了提高资源利用率和系统吞吐量,操作系统通常会将多个程序同时载入内存,使他们并发执行.此时程序执行独立运行的单位都是进程
因为在多道程序环境下,原本的程序在并发执行会导致程序失去封闭性,使得程序的执行结果不可再现,不可预知,所以需要有能够在并发执行环境下独立运行的单位,所有就有了进程的概念
进程因为拥有一个数据结构也就是PCB使得进程能够在并发执行环境下独立运行
操作系统通过PCB描述控制管理进程,所以由程序段,数据段,和pCB组成了进程实体
一般我们将进程实体简称为进程
- 三种不同的定义
- 进程是程序的一次执行
这个定义是从程序和进程的关系角度来讲的
- 进程是一个程序及其数据在处理机上循序执行时所发生的活动
这个定义是从进程的生命周期的角度来讲的
- 进程是具有独立功能的程序在一个数据集上执行的过程,他是系统进行资源分配和调度的一个独立单位
这个定义 说明了进程是一个过程 , 进程的特点是资源分配和调度的独立单位
同样结合了程序和数据, 以及过程定义3包含了定义2,包含了定义1,同时还指出了进程的特点独立,资源分配和调度
- 简化定义
可以定义为:
进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位
程序的执行顺序描述(进程需要解决的问题)
因为进程是解决多道程序并发执行的问题,所以多道程序的执行顺序需要被描述,这里是通过前驱图来描述程序执行顺序的
- 前驱图
从图形上讲,前驱图是一个有向无环图
前驱图的每一个节点代表的是一个程序的完全执行,拆开来讲,一个节点所包含的有用信息有:
- 程序执行完毕所需要的时间
- 程序执行完毕所创造的结果,环境
- 程序执行所需要的前驱条件或者是前提
在顺序执行顺序下,程序的结果是可重复的
在并发执行环境下,多道程序的执行是间断性,失去封闭性,不可再现性的
进程的特征
进程是解决程序并发问题的,所以进程天然有并发性,独立性,因为并发天然有动态性和异步性
所以进程的四种特征是:
- 并发性
- 动态性
- 异步性
- 独立性
独立性是保证程序结果可在现性的基础,所以所有程序都应该具有独立性
操作系统的基本特征还记得吗?也是四个特征,并发性,异步性,虚拟性,共享性,也都是并发引起的问题,而进程的特征就根细化特征了,可以说操作系统的四个特征中,并发性和异步性是并发自己的特征,而虚拟性和共享性都是并发带来的好处的问题解决,动态性其实也是并发的特点,但是这个特点没有那么重要所以就只包含在并发的特点里面了,而不是操作系统的特点
所以进程的特征是,并发性自带三个特征,并发,异步,动态,程序自带一个特征,独立性
进程的基本状态与转换
五种基本状态:
- 创建(被创建之后)
- 终止
- 就绪
- 执行
- 阻塞
最关键的是就绪,执行和阻塞三个状态,他们三状态一直在循环转换中
进程创建之后并不是立马进入就绪状态,就绪状态与创建状态的区别是,创建状态没有分配进程资源(通常是内存资源),当当前系统的性能和内存容量允许情况下当完成进程创建的必要操作之后就会将进程转为就绪态
PCB 进程控制块
PCB也就是process control block,也叫做进程表
PCB的作用
PCB与程序段,数据段共同组成了进程体
pcb是实现进程的并发性的关键,所以pcb起到的作用有
- 作为独立运行基本单位的标记
- 实现间断性运行方式 (也就是保证并发的独立性,封闭性)
- 提供进程管理所需要的信息
- 提供进程调度所需要的信息
- 实现与其他进程的同步与通信
PCB中的信息
根据上面的PCB作用,想要实现这些作用,那么PCB中的信息也不难推测
- 作为进程的标识符
需要有
- 外部标识符
- 内部标识符
外部标识是用户方便管理
内部标识是系统方便管理
- 实现间断性运行
为了实现间断运行,那么一定需要保存现场,以后才能恢复现场
所以需要有信息:
- 处理机状态
处理机状态包含很多部分,1. 通用寄存器 2. 指令计数器 3. 程序状态字寄存器 4. 用户站指针寄存器…
这么多的信息,只用处理机状态就涵盖了,真的方便了我们的记忆
- 提供进程管理所需要的信息
- 提供进程调度所需要的信息
进程管理和调度所涉及到的信息就是:
- 进程调度信息
- 进程控制信息
进程调度信息包含: 1, 进程状态 2. 进程优先级 3. 进程调度所需要的其他信息 3. 事件(阻塞原因)
进程控制信息包含: 1. 程序和数据的地址 2. 进程同步和通信机制 3. 资源清单 4. 链接指针
少了一个与其他进程同步和通信的信息,这个就包含在进程调度和控制信息里面
进程通信
进程之间的通信分为高级通信和低级通信,低级通信之所以叫做低级通信有以下特征:
- 通信效率低
- 通信不透明(也就是需要自己实现细节)
高级通信的特点是:
- 使用方便,透明(就是抽象了)
- 高效传递大量数据
所以就两个区别,效率和透明
高级通信的类型
共可分为四类:
共享存储器系统
- 共享数据结构的通信方式
- 共享存储器区的通信方式
管道通信系统
消息传递系统
客户机-服务器系统
- 套接字
- 基于文件型
- 基于网络型
- 远程过程调用和远程方法调用
- 套接字
linux的通信机制
- 管道
- 信号
- 消息队列
- 共享内存
- 信号量
- 套接字
线程和进程的比较
六个方面的比较
- 调度的基本单位
传统的进程作用独立的调度和分配的基本单位,但是在引入了线程概念的操作系统里面,实际上线程已经是调度和分派的基本单位了,所以线程是能够独立运行的基本单位,而进程少了基本二字
- 并发性
- 拥有资源
- 独立性
- 系统开销
- 支持多处理机系统
线程也是那三个基本状态
第三章 处理机调度与死锁
刚讲完进程,在信息上提供了并发执行的信息对并发执行的实现还得看处理机如何调度,处理机的调度算法决定了并发的实际效率
什么是处理机调度
在多道程序系统中,调度实际上是一种资源的分配,处理机调度就是对处理机进行分配
但是处理机的分配又有很多层次
- 高级调度
高级调度又称之为作业调度或者长程调度,主要作用就是根据某算法,将外存中的几个作业调入内存,分配资源进入就绪状态
高级调度只存在于多道批处理系统中,在分时系统和实时系统中不设置高级调度,因为只有多道批处理系统的程序是排队执行的,而实时和分时操作系统的程序要么是突然出现需要执行,要么突然出现,但是不需要排队,等一会一定会让他执行
- 低级调度
被称之为短程调度或者进程调度,调度的对象是进程
主要作用就是根据某种算法决定就绪队列中的那个进程应获得处理机
这种调度在多道,分时,实时都需要配置
- 中级调度
又被称为内存调度,主要是为了提高内存的利用率和系统吞吐量,这个调就被内存中暂时不用的进程往外存中调,进程挂起状态,等到要用了在调回来,中级调度实际上就是第五章存储器的对换功能
解释
之所以叫做长程,短程调度,就是看调用的频率,低级调度的频率最高所以叫做短程调度,而高级调度的频率很低叫做长程调度
作业和作业调度
作业的概念比程序概念更大,在linux中作业就是job单词,
不仅仅包含程序和数据,还有一分作业的说明书**,系统根据该说明书对程序的运行进行控制**,在多道批处理系统中,会将作业作为基本单位从外存调入
进程调度
实际上就是处理机调度中的低级调度,低级调度是最影响性能的
进程调度的主要任务有三个,为了将进程调入操作系统,又能调出还能恢复
主要任务:
- 保存CPU现场信息
记得PCB的作用和内容是:1 作为标识符 2 间断执行 3 提供进程管理信息 4 提供进程的调度信息 5 与其他进程同步和通信,内容 1 外部标识和内部标识 2 处理机状态 3 进程调度信息 4 进程控制信息
所以保存现场就是记录处理机状态信息到PCB中
- 按照某种算法选取进程
- 把cpu分配给进程
抢占式调度
非抢占式调度不能满足交互性和实时性的任务需求,所以很多系统都用的是抢占式调度
抢占不是一种任意性行为,需要遵循一定规则:
- 优先级原则 优先级高的才能抢占优先级低的
- 短进程优先
- 时间片原则 时间片到了立即让出处理机
所以时间片实际上是一种抢占式,只有程序自己让出处理机的行为才是非抢占式
调度算法的目标
调度算法的共同目标
- 资源利用率
最重要的资源是cpu资源,其利用率计算公式如下
$ cpu利用率 = \frac{cpu有效工作时间}{cpu有效工作时间+cpu空闲时间} $
- 公平性
- 平衡性
- 策略强制执行
第一个资源利用率很好理解,第二公平性是为了程序的正常执行第三平衡性是保证总体忙碌程度要平衡第三特殊策略可以不要之前的三种目标
不同类型的操作系统调度算法目标有些不一样
批处理系统中的调度算法目标
- 平均周转时间低
批处理系统的进程都是排队的,所以要看一个平均周转时间,平均周转时间就是让作业排队的时间,平均
计算方法是:$$ T = \frac{1}{n}(\sum_{i=1}^n{Ti})$$
- 系统吞吐量高
指的是单位时间内系统所完成的作业数,事实上为了提高吞吐量,应当尽量选择短作业运行
- 处理机利用率高
分时系统的调度算法目标
分时操作系统主要目的是满足用户的交互需求,所以调度算法的中心也是满足交互需求
- 保证响应时间快
用户体验要最好
- 保证均衡性
分时系统对于均衡性的要求更高,需要所有的程序都能得到一样的待遇
均衡性也不是指所有任务的响应时间一样,而是系统响应时间与用户请求的服务的复杂性相匹配
实时操作系统的调度算法目标
- 保证满足截止时间的要求
意思就是规定时间之内进程一定被执行,在时间要求上很严格
- 保证可预测性
可以预测下个时间会发生的请求
调度算法
先来先服务算法 FCFS
最简单的算法,这个算法可以结合其他的算法一起使用,例如在优先级算法中,每个优先级设置一个队列,而每个队列的算法就是先来先服务算法
短作业优先算法 SJF
这个算法可以提高系统的吞吐量,在多道批处理系统中,这个指标正好是其调度算法的目标
short job fist
可以明显降低平均周转时间
缺点是:
- 必须预先知道作业的执行时间
- 对长作业不利
- 无法交互
- 没有考虑任务的紧急程度
优先级调度算法 PSA
有这么几种
- 静态优先级
也就是设置的优先级不变
- 动态优先级
优先级会随着某些条件的变化而变化
还有在cpu上
- 抢占式
- 非抢占式
抢占式多用于实时操作系统
高响应比优先调度算法 HRRN
这个明显就满足分时操作系统的调度算法目标
highest response ratio next
这种调度算法是优先级调度算法的一种特例
轮转调度算法 round robin RR
这是分时系统中最简单的,也是比较常用的
也就是每个进程都只运行一个时间片,这个机制很公平
其他调度算法考试考的少就不做要求
死锁
死锁问题实际上是资源问题,也就是并发程序需要解决的共享问题,记得操作系统的四个基本特征就是并发性,异步性,共享性,虚拟性,其中的共享性就是解决并发的资源共享问题的.
- 引起死锁的原因往往是进程之间争夺有限的不可抢占资源或者可消耗资源
定义
如果一组进程中的每个进程都在等待仅由该组进程的其中进程才能引发的事件的发生,那么改组进程是死锁的
简化成 一组进程都在等待,组内其他进程做出让步
资源问题
计算机中的资源分为可重用资源和可消耗资源 ==== 可抢占资源和不可抢占资源
可重用资源就是大家可以重复使用,但是同时只能有一个进程使用
可消耗资源是临时资源,是进程运行期间动态创建和消耗的,典型的就是进程间通信的消息就是可消耗资源
可抢占资源可以被优先级更高的进程抢占,处理机和内存都是可抢占资源
不可抢占资源在分配给进程之后只能自己释放不能被抢占
死锁的四个必要条件
不是充分条件,是必要条件
- 互斥访问
- 不可抢占
- 请求和保持 (相互持有)
- 循环等待
解决死锁的几个方向
- 预防
- 避免
- 检测
- 解除
需要一些解释:
1,2方法的区别在于,预防死锁是破坏了死锁的四个必要条件,而避免是在运行过程中动态避免防止例如资源分配的时候合理的管理从而避免
3,4方法的区别在于检测死锁是及时的检测,这样带来很高的检测开销,而解除死锁是发现死锁之后,并不是主动去检测死锁而是可能是死锁被发现了再去解除
有意思的是,1-4对于死锁的防范程度一次下降,但是资源利用率缺升高了,并发程度升高了
死锁的预防
主要思想就是破坏死锁的四个必要条件,而四个必要条件中最好破坏的,代价最小的就是请求和持有条件了
破坏请求-持有条件
一次性请求所有
分批次请求该阶段所有
破坏不可抢占条件
这个需要付出很大代价,需要工作成果会被放弃
破坏循环等待条件
也就是对资源编号,使得资源呈线性排序,规定当进程申请资源时一定比持有的资源序号高才行,相等的资源要一次申请,申请序号低的资源需要把自身持有的资源释放
死锁的避免
动态避免死锁,但是在进程申请资源的时候先计算安全性
通过进程资源分配表来检测安全性
进程 | 最大需求 | 已分配 | 可用 |
---|---|---|---|
P1 | 10 | 5 | 3 |
P2 | 3 | 5 | ↑ |
P3 | 9 | 2 | ↑ |
是否能够找到一条安全序列使得系统一直处于安全状态
利用银行家算法避免死锁
一共涉及到4个数据结构
- 可利用资源向量(数组)
- 最大需求矩阵
- 分配矩阵
- 需求矩阵
每次进程请求资源的时候,获取请求资源:
- 先检查是否合理,即是否是小于他需要的need数目
- 如果过关,再检测是否有这么多个可用资源
- 再检测如此分配是否会导致进入不安全状态
难度在于最后一步,检测安全状态
其实就是找到一条能够满足在运行时不会出现资源不够分配的情况的执行流程
找到安全序列{p1,p2,p3,p4}
死锁定理
充分条件证明死锁
第四章 进程同步
进程同步是为了进程间协作工作的可再现性
进程之间的关系
一个是互斥关系,进程之间有互斥的资源需求
一个是**同步关系,**这个关系比互斥关系更严格,需要更严格的进程执行顺序而不是仅仅不在同一时间运行,例如可消耗资源
因为资源问题而控制进程运行的关系叫做间接相互制约关系
因为进程本身的同步叫做直接相互制约关系
临界区与临界资源
之前讲共享资源的时候提到过,可重用资源是临界资源
这里也涉及到临界资源
临界资源是使用中需要互斥访问的资源
临界区指的是进程中从申请临界资源到使用临界资源结束的一段代码
只要各个进程保证各自进入临界区是互斥进入的,那么一定就可以保证资源的互斥访问
- 互斥进入临界区规则
- 空闲让进
- 忙则等待
这两条很好记,资源无人使用则进入,有人使用就等待
- 有限等待
预防进程死等,一定在有限时间内能够进入
- 让权等待
如果长时间进入不了,可以让出自己的处理机
信号量机制
信号量机制是变量和一组操作的结合,具体是什么变量和什么操作呢?
操作是固定的,那就是P/V操作,该操作是信号量的唯一操作方式,P操作占用,V操作释放
而信号量这个变量具体是什么,代表什么含义,初值是什么都是要到具体问题才能确定的
整型信号量
信号量类型是整型,代表着P/V操作的变量是整型
该种信号量可以用来表示资源的数量,实现资源的分配
1 |
|
需要注意的是这里不能写成
1 |
|
因为这样会使得S可能处于负数,这样永远也过不了S<0这关,下面的信号量并不是循环判断,而是block后wakeup所以可以让S进入负数
记录型信号量
整型信号量在S<=0时都会一直测试信号量,这样处理机一直占用,不符合让权等待原则,如果经常遇到S<=0情况,可以选择记录型信号量
记录型信号量添加了一个新的数据结构,PCB中的进程控制中的链,用于记录正在等待的进程的链
1 |
|
AND型信号量
如果进程之间多种资源都需要互斥访问,此时该如何同步进程呢?
多个资源之间的分配容易出现死锁情况,and型信号量的思路就是预防死锁,一次性申请和分配和释放
其wait和singal操作可以这样描述
1 |
|
信号量集
and型信号量还存在一个问题,就是每次操作都只能对信号量进行+1和-1操作,如果要同时申请多个资源,那么要对信号量wait多次,这样子效率是不高的,并且还需要判断信号量下限是否到了某个值
所以可and型信号量再次扩充,加入下限参数,和步长
这样信号量的操作变成了这样
Swait(S1,t1,d1;s2,t2,d2;…;sn,tn,dn;)
Ssignal(S1,d1;s2,d2;…;sn,dn);
总结
可以发现,后面的信号量是前面信号量的升级,所以要从前向后理解
实际运用
第五章 存储器管理
计算机存储器的层次结构
对于通用计算机而言,至少要有三层存储
- cpu寄存器
- 主存储器
- 辅助存储器
为了提高性能,在速度差异过大的层次之间加入了缓存用于缓解速度差异
主要是在主存两侧,主存与寄存器之间高速缓存,主存与辅存之间的磁盘缓存
缓存都归属于主存范围
存储器之间的差异
主存储器和cpu寄存器都被称为可执行存储器,而辅助存储器因为访问机制不同所以程序并不能直接访问其中保存的信息
主存速度快,但是掉电无法保存内部数据
而辅助存储器能够没电时保存数据
程序的装入与链接
程序从外存进入主存就是装入,将程序中的库链接在一起形成一个完整的模块就是链接
外存中分为文件区和对换区
对换区的管理目标是速度,而文件区管理目标是空间利用率
所以兑换区不需要考虑碎片,直接使用连续分配存储管理方式
而文件区使用离散分配存储管理方式
连续分配存储管理方式
也就是一个程序分配一个连续的存储空间
这个比较简单,在连续的基础上,确定分配的地址
单一连续分配
直接把程序分配在固定的一个分区里面