导图社区 OS
这是一篇关于OS的思维导图,OS是计算机的操作系统(Operating System)。操作系统是管理计算机硬件与软件资源的核心系统软件,为用户和应用程序提供与计算机交互的接口。主要内容包括:I/O管理,文件管理,内存管理,线程 .
编辑于2025-04-21 11:15:19这是一篇关于PCC的思维导图,主要内容包括:BUS,I/O System,CPU,Instruction System,Memory System,Arithmetic Methods 。
这是一篇关于OS的思维导图,OS是计算机的操作系统(Operating System)。操作系统是管理计算机硬件与软件资源的核心系统软件,为用户和应用程序提供与计算机交互的接口。主要内容包括:I/O管理,文件管理,内存管理,线程 .
408考研合集(数据结构全),在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
社区模板帮助中心,点此进入>>
这是一篇关于PCC的思维导图,主要内容包括:BUS,I/O System,CPU,Instruction System,Memory System,Arithmetic Methods 。
这是一篇关于OS的思维导图,OS是计算机的操作系统(Operating System)。操作系统是管理计算机硬件与软件资源的核心系统软件,为用户和应用程序提供与计算机交互的接口。主要内容包括:I/O管理,文件管理,内存管理,线程 .
408考研合集(数据结构全),在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
OS
概述
What is OS?
① OS是系统资源的管理者
提供的功能
处理机管理
存储器管理
文件管理
设备管理
目标
安全、高效
② 向上层提供方便易用的服务
封装思想
GUI
命令接口
联机命令接口=交互式命令接口
特点:用户说一句,系统跟着做一句
脱机命令接口=批处理命令接口
特点:用户说一堆,系统跟着做一堆
程序接口
可以在程序中进行系统调用来使用程序接口
系统调用是应用程序请求操作系统服务的 唯一方式
③ 是最接近硬件的下层软件
实现对硬件机器的拓展
特征
并发
宏观上是同时发生的,但微观上是交替发生的(区别于并行)
共享
互斥共享方式
一个时间段内只允许一个进程访问该资源
同时共享方式
可多个
所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
两个最基本的特征,二者互为存在条件
使用QQ发送文件A,同时使用微信发送文件B
1. 两个进程正在并发执行(并发性)
2. 需要共享地访问硬盘资源(共享性)
虚拟
把一个物理上的实体变若干个逻辑上的对应物
没有并发性,就谈不上虚拟性
空分复用技术(如虚拟存储器技术)
时分复用技术(如虚拟处理器)
异步
在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性
只有系统拥有并发性,才有可能导致异步性
发展与分类
手工操作阶段
缺点:用户独占全机、人机速度矛盾导致资源利用率极低
批处理阶段
单道批处理系统
缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待I/O完成。资源利用率依然很低
特点
自动性
顺序性
单道性
多道批处理系统(操作系统开始出现)
优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持“忙碌”状态,系统吞吐量增大
缺点:用户响应时间长,没有人机交互功能
特点
多道
宏观上并行
微观上串行(并发)
分时操作系统
计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互
特点
同时性
交互性
独立性
及时性
实时操作系统
能够优先响应一些紧急任务,某些紧急任务不需时间片排队
硬实时系统
必须在绝对严格的规定时间内完成处理
软实时系统
能接受偶尔违反时间规定
特点
实时性
可靠性
网络操作系统
分布式操作系统
个人计算机操作系统
操作系统的运行机制
两类程序
内核程序
应用程序
两类指令
特权指令
非特权指令
两种处理器状态
内核态/核心态/管态
用户态/目态
内核
内核(Kernel)是操作系统最重要最核心的部分
由很多内核程序组成操作系统内核
如何变态?
内核态 -->用户态
一条修改PSW的特权指令
用户态 -->内核态
由中断引起,硬件自动完成
中断和异常
中断的作用
“中断”是让操作系统内核夺回CPU使用权的唯一途径
中断的类型
内中断(也称"异常")
与当前执行的指令有关,中断信号来源于CPU内部
分类
陷阱、陷入(trap)
应用程序故意引发的
故障(fault)
由错误条件引起
如:缺页故障
终止(abort)
由致命错误引起
如:整数除0、非法使用特权指令
例子1:试图在用户态下执行特权指令
例子2:执行除法指令时发现除数为0
例子3:应用程序想请求系统内核的服务时 执行陷入指令
外中断
与当前执行的指令无关,中断信号来源于CPU外部
分类
时钟中断
I/O中断请求
例子1:时钟中断一一由时钟部件发来的中断信号
例子2:I/O中断一一由输入/输出设备发来的中断信号
中断机制的基本原理
检查中断信号
找到相应的中断处理程序
系统调用
系统调用与库函数的区别
为什么系统调用是必须的?
解决方法:由操作系统内核对共享资源进行统一的管理,并向上提供 “系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统 调用向操作系统内核发出请求。内核会对各个请求进行协调处理
什么功能要用系统调用实现?
设备管理 完成设备的请求/释放/启动等功能
文件管理 完成文件的 读/写/创建/删除 等功能
进程控制 完成进程的 创建/撒销/阻塞/唤醒 等功能
进程通信 完成进程之间的 消息传递/信号传递 等功能
内存管理 完成内存的分配/回收 等功能
系统调用的过程
注意
1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
体系结构
大内核(又名:宏内核/单内核)
优点:高性能
缺点:内核代码庞大,结构混乱,难以维护
微内核
优点:内核功能少,结构清晰,方便维护
缺点:需要频繁地在核心态和用户态之间切换,性能低
分层结构
最底层是硬件,最高层是用户接口,每层可调用更低一层
模块化
外核
操作系统引导
开机过程
1、CPU从一个特定主存地址开始取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
2、将磁盘的第一块----主引导记录 读入内存,执行磁盘引导程序,扫描分区表
3、从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
4、从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作
虚拟机
第一类VMM
直接运行在硬件上
第二类VMM
运行在宿主操作系统上
线程 & 进程
进程
概念
程序和进程
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合
进程(Process):是动态的,是程序的一次执行过程,同一个程序多次执行会对应多个进程
组成
PCB是给操作系统用的,程序段、数据段是给进程自己用的,与进程自身的运行逻辑有关
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程控制块:(PCB)
PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会回收其PCB
包括
进程描述信息
进程标识符PID
用户标识符UID
进程控制和管理信息
CPU、磁盘、网络流量使用情况统计... ...
进程当前状态:就绪态/阻塞态/运行态... ...
资源分配清单
正在使用哪些文件
正在使用哪些内存区域
正在使用哪些 I/O 设备
处理机相关信息
如PSW、PC等等各种寄存器的值(用于实现进程切换)
程序段
程序的代码(指令序列)
数据段
运行过程中产生的各种数据(如:程序中定义的变量)
特征
动态性
进程是程序的一次执行过程,是动态地产生、变化和消亡的
进程的最基本的特性
并发性
内存中有多个进程实体,各进程可并发执行
独立性
进程是能独立运行、独立获得资源、独立接受调度的基本单位
异步性
各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制"来解决异步问题
结构性
每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成
状态
创建状态
在这个阶段操作系统会为进程分配资源、初始化PCB
就绪状态
处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行
运行状态
进程此时在CPU上运行
阻塞状态
请求等待某个事件的发生,在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”
基本状态
终止状态
操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB
状态转换
组织方式
对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来
两种方式
链式
索引
进程控制
如何实现
用“原语”实现
原语的执行具有“原子性”,一气呵成,期间不允许被中断
如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作
可以用 “关中断指令”和“开中断指令”这两个特权指令实现原子性
关中断、开中断之间的这些指令序列是不可被中断的
相关的原语
进程的 创建
创建原语
申请空白PCB
为新进程分配所需资源
初始化PCB
将PCB插入就绪队列
引起进程创建的事件
用户登录
分时系统中,用户登录成功,系统会建立为其建立一个新的进程
作业调度
多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
提供服务
用户向操作系统提出某些请求时,会新建一个进程处理该请求
应用请求
由用户进程主动请求创建一个子进程
进程的 终止
撤销原语
从PCB集合中找到终止进程的PCB
若进程正在运行, 立即剥夺CPU,将CPU分配给其他进程
终止其所有子进程
将该进程拥有的所有资源归还给父进程或操作系统
删除PCB
引起进程终止的事件
正常结束
异常结束
外界干预
进程的 阻塞
阻塞原语
找到要阻塞的进程对应的PCB
保护进程运行现场,将PCB状态信息设置为“阻塞态",暂时停止进程运行
将PCB插入相应事件的等待队列
引起进程阻塞的事件
需要等待系统分配某种资源
需要等待相互合作的其他进程完成工作
进程的 唤醒
唤醒原语
在事件等待队列中找到PCB
将PCB从等待队列移除,设置进程为就绪态
将PCB插入就绪队列,等待被调度
引起进程唤醒的事件
等待的事件发生
成对使用
进程的 切换
切换原语
将运行环境信息(进程上下文(Context))存入PCB
PCB移入相应队列
选择另一个进程执行,并更新其PCB
根据PCB恢复新进程所需的运行环境
引起进程切换的事件
当前进程时间片到
有更高优先级的进程到达
当前进程主动阻塞
当前进程终止
无论哪个进程控制原语,要做的无非三类事情
1. 更新PCB中的信息
2. 将PCB插入合适的队列
3.分配/回收资源
进程间通信
共享存储
基于数据结构的共享
比如共享空间里只能放一个长度为10的数组
速度慢、限制多,是一种低级通信方式
基于存储区的共享
操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统
速度很快,是一种高级通信方式
消息传递
直接通信方式
消息发送进程要指明接收进程的ID
间接通信方式
通过“信箱”间接通信
管道通信
FIFO
“管道”是一个特殊的共享文件,又名pipe文件
其实就是在内存中开辟一个大小固定的内存缓冲区
只能采用半双工通信,要实现双向同时通信,则需要设置两个管道
各进程要互斥地访问管道(由操作系统实现)
当管道写满时,写进程将阻塞
当管道读空时,读进程将阻塞
线程
引入线程机制后,有什么变化?
资源分配、调度
传统进程机制中,进程是资源分配、调度的基本单位
引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
并发性
传统进程机制中,只能进程间并发
引入线程后,各线程间也能并发,提升了并发度
系统开销
传统的进程间并发,需要切换进程的运行环境,系统开销很大
线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
引入线程后,并发所带来的系统开销减小
属性
线程是处理机调度的单位
多CPU计算机中,各个线程可占用不同的CPU
每个线程都有一个线程ID、线程控制块(TCB)
线程也有就绪、阻塞、运行三种基本状态
线程几乎不拥有系统资源
同一进程的不同线程间共享进程的资源
由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
同一进程中的线程切换,不会引起进程切换
不同进程中的线程切换,会引起进程切换
切换同进程内的线程,系统开销很小
切换进程,系统开销较大
线程的实现方式
用户级线程
用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
线程切换可以在用户态下即可完成,无需操作系统干预
操作系统内核意识不到线程的存在
优缺点
优点
用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点
当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
内核级线程
线程的管理工作由操作系统内核完成
线程的切换在核心态完成
优缺点
优点
一个线程被阻塞后,别的线程还可以继续执行,并发能力强
缺点
一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大
多线程模型
一对一模型
多对一模型
类似用户级线程
多对多模型
n用户及线程映射到m 个内核级线程(n>=m)
克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞)
克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点
状态与转换
组织与控制
处理机调度
基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题
三个层次
高级调度(作业调度)
按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB
中级调度(内存调度)
按照某种策略决定将哪个处于挂起状态的进程重新调入内存
内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存
暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列
中级调度发生的频率要比高级调度更高
低级调度(进程调度)
按照某种策略从就绪队列中选取一个进程,将处理机分配给它
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度
进程调度的频率很高,一般几十毫秒一次
补充知识
进程的"挂起态"
暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)
挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态
七状态模型
挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中
进程调度
时机
什么时候需要进程调度?
当前运行的进程主动放弃处理机
进程正常终止
运行过程中发生异常而终止
进程主动请求阻塞(如等待I/O)
当前运行的进程被动放弃处理机
分给进程的时间片用完
有更紧急的事需要处理(如1/0中断)
有更高优先级的进程进入就绪队列
什么时候不能进行进程调度?
在处理中断的过程中
进程在操作系统内核程序临界区中
临界资源
一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源
临界区
访问临界资源的那段代码
内核程序临界区
一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
在原子操作过程中(原语)。原子操作不可中断,要一气呵成
切换与过程
“狭义的调度”与“切换”的区别
狭义的进程调度
从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)
进程切换
指一个进程让出处理机,由另一个进程占用处理机的过程
广义的进程调度
包含了选择一个进程和进程切换两个步骤
进程切换的过程需要做什么?
1. 对原来运行进程各种数据的保存
2. 对新的进程各种数据的恢复
方式
非剥夺调度方式(非抢占式)
只允许进程主动放弃处理机
实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
剥夺调度方式(抢占式)
如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程
可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统
调度程序 & 闲逛进程
调度程序
②、③由调度程序引起
调度程序决定
让谁运行?一一调度算法
运行多长时间?一一时间片大小
不支持内核级线程的操作系统,调度程序的处理对象是 进程
支持内核级线程的操作系统,调度程序的处理对象是 内核线程
闲逛进程
调度程序永远的备胎,没有其他就绪进程时,运行闲逛进程(idle)
特性
优先级最低
可以是0地址指令,占一个完整的指令周期(指令周期末尾例行检查中断)
能耗低
调度算法
评价指标
CPU利用率
系统吞吐量
周转时间
指从作业被提交给系统开始,到作业完成为止的这段时间间隔
对于用户来说,更关心自己的单个作业的周转时间
对于操作系统来说,更关心系统的整体表现,因此更关心所有作业周转时间的平均值
带权周转时间必然≥1
带权周转时间与周转时间都是越小越好
对于周转时间相同的两个作业
实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小,用户满意度更高
对于实际运行时间相同的两个作业
周转时间短的带权周转时间更小,用户满意度更高
等待时间
指进程/作业处于等待处理机状态时间之和
对于进程来说,等待时间就是指 进程建立后等待被服务的时间之和
在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间
对于作业来说,不仅要考虑 建立进程后的等待时间,还要 加上作业在外存后备队列中等待的时间
响应时间
从用户提交请求到首次产生响应所用的时间
举例
算法
先来先服务(FCFS)
算法思想
从“公平”的角度考虑
算法规则
按照作业/进程到达的先后顺序进行服务
用于 作业调度 还是 进程调度?
用于作业调度时,考虑的是哪个作业 先到达后备队列
用于进程调度时,考虑的是哪个进程 先到达就绪队列
抢占式?非抢占式?
非
优缺点
优点:公平、算法实现简单
缺点:对长作业有利,对短作业不利
是否会导致饥饿
否
短作业优先(SJF)
算法思想
追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
算法规则
最短的作业/进程优先得到服务
用于 作业调度 还是 进程调度?
都可
用于进程调度时称 “短进程优先(SPF, Shortest Process First)算法”
抢占式?非抢占式?
SJF 和 SPF 是非抢占式的算法。 但是也有抢占式的版本一一最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)
优缺点
优点 :“最短的”平均等待时间、平均周转时间
缺点:不公平。对短作业有利,对长作业不利
是否会导致饥饿
是
高响应比优先(HRRN)
算法思想
综合考虑作业/进程的 等待时间 和 要求服务的时间
算法规则
选择响应比最高的作业/进程为其服务
用于 作业调度 还是 进程调度?
都可
抢占式?非抢占式?
非
只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
优缺点
优点
等待时间相同时,要求服务时间短的优先(SJF 的优点)
要求服务时间相同时,等待时间长的优先(FCFS 的优点)
是否会导致饥饿
否
适用于早期的批处理系统
时间片轮转(RR)
算法思想
公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
算法规则
按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片
若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队
用于 作业调度 还是 进程调度?
进程调度
抢占式?非抢占式?
抢占
优缺点
优点:公平:响应快,适用于分时操作系统
缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度
是否会导致饥饿
否
优先级
算法思想
根据任务的紧急程度来决定处理顺序
算法规则
每个作业/进程有各自的优先级,调度时选择优先级最高的
用于 作业调度 还是 进程调度?
都可
抢占式?非抢占式?
都有
优缺点
优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度
缺点:若源源不断地有高优先级进程到来,则可能导致饥饿
是否会导致饥饿
是
多级反馈队列
算法思想
对其他调度算法的折中权衡
算法规则
1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时己经是在最下级的队列,则重新放回该队列队尾
3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
用于 作业调度 还是 进程调度?
进程调度
抢占式?非抢占式?
抢占
优缺点
公平(FCFS的优点)
每个新到达的进程都可以很快就得到响应(RR的优点)
短进程只用较少的时间就可完成(SPF的优点)
不必实现估计进程的运行时间(避免用户作假)
可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样1/0型进程就可以保持较高优先级)
是否会导致饥饿
会
适用于交互式系统
多级队列
进程同步 & 进程互斥
同步
读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据>读数据”的顺序来执行的。
如何解决这种异步问题,就是“进程同步”所讨论的内容
互斥
例如对临界资源的互斥访问
可以在逻辑上分为如下四个部分
临界区是进程中访问临界资源的代码段
进入区和退出区是负责实现互斥的代码段
进程互斥需要遵循以下原则
1. 空闲让进
2. 忙则等待
3. 有限等待
对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
4. 让权等待
当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
进程互斥的软件实现方法
单标志法
进程在访问完临界区后会把使用临界区的权限转交给另一个进程
每个进程进入临界区的权限只能被另一个进程赋予
双标志先检查
设置一个布尔型数组flag[ ],数组中各个元素用来标记各进程想进入临界区的意愿
若按照 ①⑤②⑥③⑦…的顺序执行(P0完成①但还没进入②就发生了切换),P0和P1将会同时访问临界区
违反“忙则等待”原则
先“检查”后“上锁”
双标志后检查
到先“上锁”后“检查”
若按照 ①⑤②⑥... 的顺序执行,P0和P1将都无法进入临界区
违背了“空闲让进”和“有限等待”
产生“饥饿”
Peterson 算法
结合双标志法、单标志法的思想
依然未遵循让权等待的原则
进程互斥的硬件实现方法
中断屏蔽方法
利用“开/关中断指令”实现
不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
TestAndSet(TS指令/TSL指令)
TSL执行的过程不允许被中断,只能一气呵成
若刚开始lock 是 true,则执行 TLS后old 返回的值为 true,while 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行“解锁”
若刚开始lock 是false,则TsL返回的old 值为false,while循环条件不满足,直接跳过循环,进入临界区
不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”
Swap指令(XCHG指令)
逻辑上 Swap 和 TSL 并无太大区别
互斥锁
特性
需忙等,进程时间片用完才下处理机,违反“让权等待”
优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
不太适用于单处理机系统,忙等的过程中不可能解
信号量机制
类型
整型信号量
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量
“检查”和“上锁”一气呵成,避免了并发、异步导致的问题
与普通整数变量的区别:
对信号量的操作只有三种,即 初始化、P操作【wait】、V操作【signal】(来自荷兰语 Proberen 和 Verhogen)
存在的问题:
不满足“让权等待”原则,会发生“忙等”
记录型信号量
block 原语 使得该机制遵循了“让权等待” 原则,不会出现“忙等”现象
P 操作中,一定是先 S.value--,之后可能需要执行 block 原语
V操作中,一定是先 S.value++,之后可能需要执行 wakeup 原语
可以用记录型信号量实现进程互斥、进程同步
功能
实现进程互斥
mutex 表示 “进入临界区的名额”
1.分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
2.设置互斥信号量mutex,初值为1
3.在进入区 P(mutex) ——申请资源
4.在退出区 V(mutex)——释放资源
实现进程同步
进程同步:要让各并发进程按要求有序地推进
信号量S代表“某种资源”,刚开始是没有这种资源的。P2需要使用这种资源,而又只能由P1产生这种资源
1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
2. 设置同步信号量S,初始为0
3. 在“前操作(代码2)”之后执行V(S)
4. 在“后操作(代码4)”之前执行P(S)
技巧口诀:前VP后
实现进程的前驱关系
每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作)
1. 要为每一对前驱关系各设置一个同步信号量
2. 在“前操作”之后对相应的同步信号量执行V操作
3. 在“后操作”之前对相应的同步信号量执行P操作
生产者-消费者 问题 (同步)
实现 互斥的P操作 一定要在实现 同步的P操作 之后
否则会发生死锁
V操作不会导致进程阻塞,因此相邻两个V操作顺序可以交换
多生产者-多消费者 问题
互斥关系:(mutex=1)
对缓冲区(盘子)的访问要互斥地进行
同步关系(一前一后)
1、父亲将苹果放入盘子后,女儿才能取苹果
2、母亲将橘子放入盘子后,儿子才能取橘子
3、只有盘子为空时,父亲或母亲才能放入水果
“盘子为空”这个事件可以由儿子或女儿触发,事件发生后才允许父亲或母亲放水果
即使不设置专门的互斥变量mutex,也不会出现多个进程同时访间盘子的现象
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate 三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区
吸烟者 问题
“可以生产多个产品的单生产者”问题
供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了
读者-写者 问题 (互斥)
① 允许多个读者可以同时对文件执行读操作; ② 只允许一个写者往文件中写信息; ③ 任一写者在完成写操作之前不允许其他读者或写者工作; ④ 写者执行写操作前,应让已有的读者和写者全部退出。
核心思想
设置了一个计数器count用来记录当前正在访问共享文件的读进程数。我们可以用count 的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理
哲学家进餐 问题
系统中有5个哲学家进程,5位哲学家与左右邻居对其中间筷子的访问是互斥关系
核心问题
每个进程都需要同时持有两个临界资源,因此就有“死锁”问题的隐患
死锁风险
如果5个哲学家并发地拿起了自己左手边的筷子
每位哲学家循环等待右边的人放下筷子(阻塞)
发生“死锁”
避免
①最多允许四个哲学家同时进餐
保证至少有一个哲学家是可以拿到左右两只筷子的
②要求奇数号哲学家先拿左边时筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反
保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这就避免了占有一支后再等待另一只的情况。
③各哲学家拿筷子这件事必须互斥的执行
保证了即使一个哲学家在拿筷子拿到一半时被阻塞,也不会有别的哲学家会继续尝试拿筷子
管程
为什么要引入管程
信号量机制存在的问题:编写程序困难、易出错
能不能设计一种机制,让程序员写程序时不需要再关注复杂的PV操作,让写代码更轻松呢
管程的定义和基本特征
组成
局部于管程的共享数据结构说明
对该数据结构进行操作的一组过程
对局部于管程的共享数据设置初始值的语句
管程有一个名字
基本特征
局部于管程的数据只能被局部于管程的过程所访问
一个进程只有通过调用管程内的过程才能进入管程访问共享数据
每次仅允许一个进程在管程内执行某个内部过程
这种互斥特性是由编译器负责实现的
可在管程中设置条件变量及等待/唤醒操作以解决同步问题
可以让一个进程或线程在条件变量上等待(此时,该进程应先释放管程的使用权,也就是让出“入口”)
可以通过唤醒操作将等待在条件变量上的进程或线程唤醒
用管程解决生产者消费者问题
死锁
什么是死锁
在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象
进程死锁、饥饿、死循环的区别
死锁产生的必要条件
1、互斥条件
只有对必须互斥使用的资源的争抢才会导致死锁
2、不剥夺条件
进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放
3、请求和保持条件
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放
4、循环等待条件
存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求
发生死锁时一定有循环等待,但是发生循环等待时未必死锁
循环等待是死锁的必要不充分条件
什么时候会发生死锁
1.对系统资源的竞争
2. 进程推进顺序非法
3.信号量的使用不当
如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁
死锁的处理策略
1. 预防死锁
破坏死锁产生的四个必要条件中的一个或几个
破坏互斥条件
sPOOLing 技术
把只能互斥使用的资源改造为允许共享使用
缺点
并不是所有的资源都可以改造成可共享使用的资源
破坏不剥夺条件
方案一
当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请
方案二
当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺
缺点
实现复杂
释放已获得的资源可能造成前一阶段工作的失效
因此这种方法一般只适用于易保存和恢复状态的资源,如CPU
反复地申请和释放资源:增加系统开销,降低系统吞吐量
破坏请求和保持条件
静态分配方法
进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,个让它投入运行
一旦投入运行后,这些资源就一直归它所有,该进程不会再请求别的任何资源
缺点
有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低
可能导致某些进程饥饿
破坏循环等待条件
顺序资源分配法
给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完
一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象
缺点
不方便增加新的设备,因为可能需要重新分配所有的编号
进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费
2. 避免死锁
用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
3. 死锁的检测和解除
允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁
内存管理
文件管理
I/O管理