- 第一章(概述)
- 作为用户和计算机硬件之间的接口
- 提供的功能
- 命令接口
- 联机命令接口:说一句做一句
- 脱机命令接口:说一堆做一堆
- 程序接口:“系统调用”,用户通过程序间接使用
- GUI:图形化操作界面
- 命令接口
- 目标
- 方便用户使用
- 提供的功能
- 资源的管理者
- 处理机管理
- 存储器管理
- 文件管理
- 设备管理
- 操作系统的特征
- 并发:每一个小时换一个女朋友约会 (宏观同时,微观交替)单核并发 操作系统最基础的特性
- 并行:和一号二号女朋友一起约会 多核并行
- 共享
- 互斥共享:一个时间段,只允许一个进程访问
- 同时共享:运行一个时间段内运行多个进程“同时(就像并发)”对它们访问
- 没有并发那么就没有共享,没有共享那么没有并发,互为存在条件
- 虚拟:
- 虚拟存储器基础:空分复用技术
- 虚拟处理器:时分复用技术
- 异步:资源有限,进程执行不是一贯到底,而是走走停停
- OS发展与分类
- 手工操作阶段:(纸带)用户独占全机,人机速度矛盾,资源利用率低
- 批处理阶段
- 单道批处理系统:脱机输入/输入技术(磁带),并监督程序(操作系统的雏形)负责控制作业输入、输出
- 像网络的报文交换
- 多道批处理系统(操作系统开始出现):计算机一次在磁带中读入多道程序,程序并发执行(没有人机交互功能)
- 像网络的分组交换
- 单道批处理系统:脱机输入/输入技术(磁带),并监督程序(操作系统的雏形)负责控制作业输入、输出
- 分时操作系统:不能优先处理一些紧急任务
- 实时操作系统
- 硬实时操作系统:必须在绝对严格规定时间内完成(发射导弹)
- 软实时操作系统:能接受偶尔违反时间规定(12306)
- OS的运行机制和体系结构
- 运行机制
- 两种指令
- 特权指令
- 非特权指令
- 两种处理器状态
- 核心态(可以特权and非特权指令)(管理员)
- 用户态(只能执行非特权指令)(普通用户)
- 两种程序
- 内核程序(可以执行特权and非特权指令在核心态)
- 应用程序(只能执行非特权指令在用户态)
- 两种指令
- 操作系统内核(内核是计算机配置的底层软件)
- 时钟管理
- 中断处理
- 原语
- 是一种特殊的程序
- 处于操作系统最底层,是最接近硬件的部分
- 这种程序的运行具有原子性——其运行只能一气呵成,不可中断
- 运行世界较短、调用频繁
- 对系统资源进行管理的功能
- 进程管理
- 存储器管理
- 设备管理
- 操作系统体系结构
- 大内核
- 将操作系统的主要功能模块都作为系统内核,运行在核心态
- 高性能
- 内核代码庞大,结构混乱,难以维护
- 微内核
- 只把最基本的功能保留在内核
- 内核功能少,结构清晰,方便维护
- 需要频繁地在核心态和用户态之间切换,性能低
- 大内核
- 运行机制
- 中断和异常
- 中断(广义)
- 中断发生时,CPU立即进入核心态 (因为只有核心态,操作系统才能使用特权指令)
- 用户态——>核心态,只能通过中断进行转换
- 陷入指令,仅能在用户态下进行,为的就是产生内中断从而进入核心态
- 核心态——>用户态只需要一个特权指令,将程序状态字地标志位改成“用户态”
- 内中断(异常,例外,(主动)陷入)
- 来源CPU内部
- 外中断(中断)
- 来源CPU外部
- 时钟中断&I/O中断请求
- 1、每条指令结束后,CPU检查是否有外部中断信号
- 2、若有则保护被中断地CPU环境
- 3、根据中断信号类型转入相应地中断处理程序
- 4、回复原进程地CPU环境并退出中断,返回原进程继续往下执行
- 中断(广义)
- 系统调用 分类
- 设备管理
- 文件管理
- 进程控制
- 进程通信
- 内存管理
- 作为用户和计算机硬件之间的接口
- 第二章(进程)
- 进程(动态的,进程实体的运行过程)
- 进程实体(静态的,进程是数据集合)
- PCB(进程控制块)是进程存在的唯一标志
- 操作系统通过PCB来管理进程,因此PCB中应该包含操作系统对其进行管理所需的各种信息
- 进程描述信息
- 进程标识符PID
- 用于区分不同的进程是唯一的
- 用户标识符UID
- 此进程所属的用户是谁
- 进程控制和管理信息
- 进程当前状态
- 进程优先级
- 资源分配清单
- 程序段指针
- 数据段指针
- 键盘
- 鼠标
- 处理机相关信息
- 各种寄存器的值
- 进程标识符PID
- 数据段
- 程序代码存入在此
- 程序段
- 运行时使用、产生的运算数据等等
- PCB(进程控制块)是进程存在的唯一标志
- 进程的组织方式
- 连接方式
- 按照进程状态将PCB分为多个队列
- 执行指针
- 就绪队列指针
- 阻塞队列指针
- 操作系统持有指向各个队列的指针
- 按照进程状态将PCB分为多个队列
- 索引方式
- 根据进程状态的不同,建立几张索引表
- 执行指针
- 就绪表指针
- 指向各个PCB
- 阻塞表指针
- 指向各个PCB
- 操作系统持有指向各个索引表的指针
- 根据进程状态的不同,建立几张索引表
- 连接方式
- 进程的特征
- 动态性
- 并发性
- 独立性
- 进程是能独立运行、独立获得资源、独立接受调度的基本单位(进程是资源分配接受调度的基本单位)
- 异步性
- 各进程以不可预知的速度向前推进,可能导致运行结果的不确定性
- 结构性
- 进程实体(静态的,进程是数据集合)
- 进程的……
- 状态
- 运行状态
- 其他所需资源:Yes
- CPU:Yes
- 占有CPU,并在CPU上运行
- 在单核处理机环境下,每一个时刻最多只有一个进程处于运行态
- 就绪状态
- 其他所需资源:Yes
- CPU:No
- 已经具备运行条件,但由于没有空闲CPU,而展示不能进行(万事俱备,只欠CPU)
- 阻塞状态
- 其他所需资源:No
- CPU:No
- 因等待某一事件而暂时不能运行(为了提高CPU利用率)
- 创建状态
- 进程正在被创建,操作系统为进程分配资源、初始化PCB
- 终止状态
- 进程正在从系统撤销,操作系统会回收进程拥有的资源、撤销PCB
- 运行状态
- 进行状态间的转换
- 创建态>>>就绪态
- 系统完成创建进程相关的工作
- 就绪态>>>运行态
- 进程被调度
- 运行态>>>就绪态
- 时间片到,或CPU被其他高优先级的进程抢占
- 运行态>>>阻塞态
- 是一种进程自身做出主动的行为,等待系统资源分配
- 阻塞态>>>就绪态
- 是一种被动行为,所需要的其他(除处理机之外)资源就绪后,等待事件发生
- 运行态>>>终止态
- 进程运行结束or运行过程中遇到不可修复的错误
- 创建态>>>就绪态
- 状态
- 进程控制
- 基本概念
- 什么是进程控制?
- 就是要实现进程状态的转换
- 如何实现进程控制
- 用“原语”实现
- 原语的特点!!!不允许被中断!!!
- 原语采用关中断and开中断的指令实现
- 原语所需要进行的事情
- 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
- 所有的进程控制原语一定都会修改进程的状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行的前必然要恢复其运行环境
- 将PCB插入合适队列
- 分配/回收资源
- 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
- 用“原语”实现
- 什么是进程控制?
- 进程控制相关的原语
- 进程的创建
- 创建原语
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列
- 引起进程创建的时间
- 用户登录
- 分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度
- 多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
- 提供服务
- 用户向操作系统提出某些请求时,会建立一个进程处理该请求
- 应用请求
- 由用户进程主动请求创建一个子进程
- 用户登录
- 创建原语
- 进程的终止
- 撤销原语
- 从PCB集合中找到终止进程的PCB
- 若程序正在运行,则立即剥夺CPU,将CPU分配给其他进程
- 终止其所有子进程
- 将该进程拥有的资源归还给父进程或操作系统
- 删除PCB
- 引起进程终止的事件
- 正常结束
- 异常结束
- 外界干预
- 撤销原语
- 进程的阻塞
- 阻塞原语
- 找到要阻塞的进程对于的PCB
- 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行
- 将PCB插入相应的等待序列
- 引起阻塞的事件
- 需要等待系统分配某种资源
- 需要等待相互合作的其他进程完成工作
- 阻塞原语
- 进程的唤醒
- 唤醒原语
- 在事件等待队列中找到PCB
- 将PCB从等待队列中移除,设置进程为就绪态
- 将PCB插入就绪队列
- 引起进程唤醒的事件
- 等待的事件发生
- 唤醒原语
- 进程的切换
- 切换原语
- 将运行环境信息存入PCB
- PCB移入相应的队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
- 引起进程切换的事件
- 当前进程时间片到
- 有更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程终止
- 切换原语
- 进程的创建
- 基本概念
- 进程通信:进程之间的信息交换
- 共享存储:申请共享存储区
- 基于数据结构的共享(低级通信方式)
- 基于存储区的共享(高级通信方式 )
- 消息传递:操作系统提供的“发送消息/接受消息”两个原语进行数据交换,类似于计网中的报文
- 直接通信方式
- 消息直接挂到接收方的消息队列里
- 间接通信方式
- 消息先发到中间体(信箱)
- 直接通信方式
- 管道通信
- 只能采用半双工通信,某一时间段内只能实现单向传输,如果要实现双向同时通信,则需要设置两个管道
- 各进程要互斥地访问管道
- 管道写满的时候,写进程write()系统调用将被阻塞。管道变空,此时读进程read()系统调用将被阻塞
- 如果没写满,就不允许读,如果没读空,就不允许写
- 数据一旦被读出,就会被管道丢弃,所以读进程最多只能有一个,否则会有读错数据的情况
- 共享存储:申请共享存储区
- 线程、多线程模型
- 什么是线程,为什么要引入线程?
- 轻量级进程
- 现在线程是基本的CPU执行单元也是程序执行流的最小单位
- 增加并发度
- 线程是程序执行流的最小单位
- 引入线程机制后,有什么变化?
- 资源分配、调度
- 传统进程机制中,进程是资源分配、调度的基本单位
- 引入线程后,进程是(打印机)资源分配的基本单位、而线程是调度的基本单位
- 并发性
- 传统进程机制中,只能进程并发
- 引入线程后,各线程间也能并发,提升了并发度
- 系统开销
- 传统的进程间并发,需要切换进程的运行环境,系统开销很大
- 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
- 总的来说,引入线程后,并发所带来的系统开销减少
- 资源分配、调度
- 线程有哪些重要的属性
- 线程是处理机调度的单位
- 多CPU中,各个线程可占用不同的CPU
- 每个线程都有一个线程ID、线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同进程间共享进程的资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中的线程切换,不会引起进程的切换
- 不同进程中的线程切换,会引起进程切换(废话0.0)
- 切换同进程内的线程,系统开销很小
- 切换进程,系统开销很大
- 线程的实现方式
- 用户级线程
- 线程管理工作都有应用程序负责,线程切换可以在用户态下完成
- 内核级线程
- 操作系统内核视角看到的线程
- 重点重点重点!!!!!
- 内核级线程次啊是处理机分配的单位,因为操作系统只“看得见”内核级线程
- 用户级线程
- 多线程模型
- 多对一模型
- 并发度低
- 优点:进程管理开销小
- 缺点:一个线程的阻塞会导致整个进程被阻塞
- 一对一模型
- 并发度高
- 优点:进程管理开销大
- 缺点:各个线程可分配到多核处理机并行执行,并发度高
- 多对多模型
- 集二者之所长
- 多对一模型
- 什么是线程,为什么要引入线程?
- 处理机调度
- 基本概念
- 按照一定的算法选择一个进程
- 三个层次
- 高级调度(作业调度)
- 外存>>>内存(面向作业)
- 作业调入内存
- 中级调度(内存调度)
- 外存>>>内存(面向进程)
- 暂时不能运行的进程会调至外存等待:挂起
- 挂起:PCB不会一起调到外存,而是会常驻内存,PCB会放到挂机队列中
- 低级调度(进程调度)
- 内存>>>CPU
- 就绪调度到执行状态
- 高级调度(作业调度)
- 三层调度的联系、对比
- 补充知识
- 进程的“挂起态”
- 七状态模型
- 添加了就绪挂起
- 添加了阻塞挂起
- 阻塞挂起可以转换到就绪挂起
- 挂起和阻塞的区别
- 两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像到外存去了,而阻塞状态下的进程映像还在内存中,但是PCB都全在内存中
- 基本概念
- 进程调度的……
- 时机
- 什么时候需要进程调度?
- 进程主动放弃处理机
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞
- 进程被动放弃处理机
- 分配给进程的时间片用完
- 有更紧急的事情要处理(如I/O中断)
- 有更高优先级的进程进入就绪队列
- 进程主动放弃处理机
- 什么时候不能进行进程调度?
- 不能进行进程调度与切换的状态的情况
- 在处理中断的过程中
- 在操作系统内核程序临界区中(仅仅是内核程序临界区不行,普通程序临界区,比如打印机就可以)
- 在原子操作过程中(原语)
- 不能进行进程调度与切换的状态的情况
- 什么时候需要进程调度?
- 切换与过程
- “狭义的调度”与“切换”的区别
- 狭义的调度
- 选中一个要运行的进程,这个进程可以是刚刚被暂停执行的进程(就比如中断后恢复),也可以是另一个进程(进程切换)
- 进程切换:一个进程让出处理机,另一个进程占用处理机(不属于侠义的调度)
- 广义进程调度
- 包含了选择一个进程和进程切换两个步骤
- 狭义的调度
- 进程切换的过程需要做什么?
- 对原来运行进程的各种数据进行保存
- 对新的进程各种数据恢复
- “狭义的调度”与“切换”的区别
- 方式
- 非剥夺调度方式(非抢占式)
- 只允许进程主动放弃处理机
- 剥夺调度方式(抢占式)
- 有一个更重要or更紧迫的进程需要使用处理机,则立即暂停正在执行的程序,将处理机分配给更重要的那个进程
- 非剥夺调度方式(非抢占式)
- 时机
- 调度算法的评价指标
- CPU利用率
- 利用率=(忙碌时间/总时间)
- 系统吞吐量
- 单位时间内完成作业的数量
- 系统吞吐量=(总共完成了多少道作业/总共花了多少时间)
- 周转时间
- 周转时间、平均周转时间
- 周转时间=作业完成时间-作业提交时间
- 平均周转时间=各个作业的周转时间之和/作业数
- 带权周转时间、评价带权周转时间
- 带权周转时间=作业周转时间/作业实际运行的时间=(作业完成时间-作业提交时间)/作业实际运行的时间
- 必然>=1,并且数值越小越好
- 各个作业的带权周转时间之和/作业数
- 带权周转时间=作业周转时间/作业实际运行的时间=(作业完成时间-作业提交时间)/作业实际运行的时间
- 周转时间、平均周转时间
- 等待时间
- 处于等待处理机状态时间之和
- 对于进程来说,等待时间就是进程建立后等待被服务(等待I/O设备也是在被服务的,所以不算入等待时间)的时间之和
- 对于作业来说,等待时间就是建立进程后的等待时间,还要加上作业在外存后备队列中的等待时间
- 响应时间
- 提出请求到首次响应的时间
- CPU利用率
- 调度算法一(早期批处理)
- 用于早期的批处理系统,不适合用于交互性系统的算法
- 饥饿状态
- 某进程/作业长期得不到服务
- 先来先服务(FCFS)(First Come First Serve)
- 按照作业/进程到达的先后顺序进行服务
- 非抢占式的算法
- 优点:公平、算法实现非常简单
- 缺点:对长作业有利、对短作业不利
- 不会导致饥饿
- 没有考虑作业的运行时间,所以对短作业不友好
- 短作业优先(SJF Short Job First)
- 最短的作业/进程优先得到服务
- 非抢占式(SJF、STF),也有抢占式版本(最短剩余时间优先算法SRTN Shortest Remaining Time Next)
- 非抢占式,就判断就绪队列,谁所用的时间少就服务谁
- 抢占式,当一个作业到达就要判断,谁剩余的时间少就服务谁
- 优点:“最短的”平均等待时间。平均周转时间
- 缺点:不公平,对短作业有利,对长作业不利
- 会导致(长作业)饥饿
- 没有考虑等待时间,所以对长作业不友好
- 高响应比优先(HRRN Highest Response Ratio Next)
- 综合考虑作业/进程的等待时间和要求服务的时间
- 在每次调度时先计算各个作业/进程的响应比,现在相应比最高的作业/进程为其服务
- 相应比=(等待时间+要求服务时间)/ 要求服务时间
- 是非抢占式的算法
- 优点:综合了考虑等待时间和运行时间
- 不会饥饿
- 调度算法二(交互式系统)
- 适用于交互式系统
- 时间片轮转调度算法(RR Round-Robin)
- 按照各个进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。
- 用于进程调度
- 抢占式算法(由时钟中断来通知CPU时间片已到)
- 时间片不能大,否则就变成了先来先服务,不能太小,否则切换进程的时间开销过大
- 优点:公平,响应快,适用于分时操作系统
- 缺点:由于高频率的进程切换,因而有一定的开销,不区分任务的紧急程度
- 不会导致饥饿
- 优先级调度算法
- 调度时选择优先级最高的作业/进程
- 有非抢占式和抢占式
- 非抢占式:进程运行完,才判断调度,若优先级相同,先来先服务
- 抢占式:就绪队列发生改变就要判断优先级,优先级高的抢占优先级低的处理机,若优先级相同,先来先服务
- 优先级
- 系统进程优先级 高于 用户进程
- 前台进程优先级 高于 后台进程
- 操作系统更偏好于I/O进程
- I/O设备和CPU可以并行工作,如果让I/O繁忙型进程优先运行的花,则越有可能让I/O设备尽早地投入工作
- 优点:可灵活挑战对各种作业/进程地偏好程度
- 缺点:若源源不断地有高优先级进程到来,可能会饥饿
- 会导致饥饿
- 多级反馈队列调度算法
- 对其他调度算法的折中权衡
- 是抢占式的算法
- 算法(2.2_4_FCFS、SJF、HRRN调度算法_哔哩哔哩_bilibili 32分钟的位置,看例子)
- 设置多级就绪队列,各个队列的优先级从高到低,时间片从大到小
- 新进程到达时,先进入第一级队列,,按FCFS原则排队等待被分配的时间片,若时间片用完,进程还未结束,则进入下一级队列的队尾,如果此时是最下级的队列了,则重新返回最下级队列队尾。
- 只有k级队列为空,才会为k+1级队头的进程分配时间片,突然出现高优先级的,会直接抢占
- 被抢占处理机的进程会放回原级队列队尾
- 优点:FCFS的优点+RR的优点+SJF(已修改,短作业优先的优点)的优点+(避免进程更改自己的实际服务时间作假)
- 会导致饥饿
- 同步、互斥问题
- 什么是进程同步
- 同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要子啊某些位置上协调他们的工作次序而产生的制约的关系。进程间的直接制约关系就是源于他们直接的相互合作
- 什么是进程互斥
- 把一个时间段内只允许一个进程使用的资源成为临界资源
- 对于临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系,进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。
- 临界区是进程中访问临界资源的代码段。
- 进入区和退出区是负责实现互斥的代码段。
- 临界区也可称为“临界段”
- 实现进程互斥的原则
- 空闲让进
- 忙着等待
- 有限等待(防止饥饿)
- 让权等待(放弃处理机,防止进程忙等待)
- 什么是进程同步
- 进程互斥的软件实现方法
- 单标志法
- 标志(int turn)表示当前运行进入临界区的进程号
- 再由运行完的进程在退出区去将turn值修改使得第另一个 进程能进入
- 单标志法
- 进程(动态的,进程实体的运行过程)
-
-
-
- 违背了空闲让进原则,比如临界区空闲,但是P0没访问前P1不允许访问
- 双标志先检查
-
-
-
-
-
- 因为两个程序是并行的 所以很可能 1语句执行完就执行5语句而不是2语句导致冲突
- 违背了忙则等待
- 双标志后检查
-
-
-
-
-
- 违背了空闲让进、有限等待
- 进程的异步性去查看是否可能出现问题 即手动操作尝试
- Peterson算法
- 如果双方都争着想进入临界区,那可以让进程“孔融让梨”,主动让对方先使用临界区
-
-
-
-
-
- 比较前两个算法算是最好的,但是依然不够好,未遵循让权等待,并且while循环会一直进行。
-
- 进程互斥的硬件实现方法
- 中断屏蔽方法
- 关中断
- 临界区
- 开中断
- 优点:简单、高效
- 缺点:不适用于多处理机(容易出现两个处理机上的两个进程同时访问临界区);只适用于内核进程,不适用于用户进程。
- TestAndSet(TS指令/TSL指令)
- TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
- 中断屏蔽方法
-
-
-
-
- 保证检查and上锁可以一气呵成不被打断
- 优点:实现简单,无需像软件实现方法那样严格检查是否由逻辑漏洞;;适用于多处理及环境
- 缺点:不满足“让权等待”,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”
- Swap指令(XCHG指令)
- 也是用硬件实现的
-
-
-
-
-
- 逻辑上和TSL没有很大的区别
- 所以优点和缺点见TSL一样的
- 我个人理解:Swap指令和TSL指令逻辑上都是,不管Lock有没有被锁,先上锁了,再判断刚刚的Lock是不是被锁着。即先上锁,再检查。(不知道对不对)
-
- 信号量机制(巨TM重要!!!!!!!)
- 之前的实现方法,都无法实现“让权等待”
- 信号量
- 信号量其实就是一个变量(可以是一个整数,也可也是更复杂的记录型变量),来表示系统中某种资源的数量
- 原语,执行只能一气呵成不能被中断
- 一对原语:wait(S)原语和signal(S)原语
- wait、signal原语通常称为P、V操作(来自荷兰语0.0),做题长把wait(S)、signal(S)写成P(S)、V(S)
- 整型信号量
- 用整数表示系统资源数量(只能进行三种操作)
- 初始化
- P操作 “--”
- V操作 “++”
- 用整数表示系统资源数量(只能进行三种操作)
-
-
-
-
- 存在的问题:还是不满足“让权等待”
- 记录型信号量(2.3_3_进程互斥的硬件实现方法_哔哩哔哩_bilibili 18分钟的时候)
-
-
-
-
-
- 多了一个主动阻塞的语句block,从而进入阻塞队列,释放处理机,等待着被唤醒,所以实现了让权等待
-
- 信号量机制实现
- 信号量机制实现进程互斥(信号量为1)
- 可以这么去理解
- 临界区资源就只有一个,例如仅有一个打印机资源
- 互斥信号量mutex,初值设置为1
- 就类似于,资源只有一个
- 需要两对PV
- 可以这么去理解
- 信号量机制实现进程同步(信号量为0)
- 让本来异步并发的进程进行相互配合,有序前进
- 先V后P,V再前操作之后,P再后操作之前
- 仅需一对PV
- 信号量机制实现进程互斥(信号量为1)
-
-
- 进程同步互斥问题
- 生产者消费者问题
- 生产者消费者问题
- 进程同步互斥问题
-
-
-
- 实现互斥和实现同步的两个P操作的先后顺序,实现互斥的操作一定要在实现同步操作之后,否则会死锁
- 多生产者多消费者问题(多:多类)
- (2.3_6_生产者-消费者问题_哔哩哔哩_bilibili)
- 无法总结,看视频。。。
-
-
-
-
-
- 要以事件为单位而不是以进程为单位!
- 吸烟者问题
- 读者-写者问题
- 读-写互斥
- 写-写互斥
- 读-读不互斥
- 重点在于在读读不互斥的前提下怎么进行解锁,怎么进行加锁,如果是第一个读程序则加锁,读完了是最后一个读程序则解锁
- 还有一个重点,count和count的变量检查和赋值无法一气呵成会导致还是无法读进程同时进行,所以需要一个互斥信号来保证对count的访问时互斥的
- 还要考虑写者不能被饿死
- 核心思想在于设置了一个计数器,而且这个计数器需要一个互斥信号量保证对计数器的访问需要互斥
- 哲学家问题
-
- 管程
- 为什么要引入管程
- 为了程序员写程序时不需要再关注复杂的PV操作
- 管程的定义和基本特征
- 基本特征
- 各外部进程/线程只能通过管程提供的特定“入口”才能访问共享数据
- 每次仅允许一个进程再管程内执行某个内部的过程
- 基本特征
- 拓展1:用管程解决生产者消费者问题
- 拓展2:Java中类似于管程的机制 synchronized
- 为什么要引入管程
- 死锁
- 死锁的概念
- 什么是死锁
- 在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的想想
- 进程死锁、饥饿、死循环的区别
- 饥饿:长期得不到想要的资源
- 死循环:某种进程执行过程中一直调不出来某个循环现象
- 共同点,都无法向前推进
- 不同点
- 死锁:至少有两个or两个以上的进程同时发生死锁(肯定不是运行态)
- 饥饿:可能只有一个进程发生饥饿(肯定不是运行态)
- 死循环:死循环是被管理者的问题,而前面两者是管理者(操作系统)的问题(可以是运行态)
- 死锁产生的必要条件
- 互斥条件:只有对必须互斥使用的资源的争夺才会死锁
- 不剥夺条件:不能由其他进程强行夺走
- 请求和保持条件:保持着某些资源不放的同时,不可强行剥夺
- 循环等待条件:存在资源的循环等待连(是死锁的必要不充分条件,即循环等待未必死锁,死锁一定有循环等待)
- 什么时候会发生死锁
- 对不可剥夺资源的不可理分配,可能导致死锁
- 死锁的处理策略
- 预防:破坏四个必要条件中的一个or几个
- 避免:银行家算法
- 死锁的检测与解除,不过操作系统会负责检测出死锁的发生再进行解除
- 什么是死锁
- 死锁的处理
- 不允许死锁的发生
- 静态策略:预防死锁
- 破坏互斥条件
- SPOOLing技术
- 但是为了系统安全,必须保证有些条件是互斥的
- 缺点:可行性不高,很多时候无法破坏互斥条件
- 破坏不剥夺条件
- 缺点:实现发杂;剥夺资源可能导致部分工作失效;反复申请和释放导致系统开销大;可能导致饥饿
- 可剥夺也容易导致饥饿
- 破坏请求和保持条件
- 采用静态分配方法
- 资源未满足,就不能投入运行,一旦投入运行,这些资源就一直归他所有
- 缺点
- 资源利用率低,因为一旦运行,资源就一直归他所有,其次,可能导致某些进程饥饿
- 采用静态分配方法
- 破坏循环等待条件
- 顺序资源分配法
- 必须按编号递增的顺序请求资源
- 缺点
- 不方便增加新设备
- 实际使用资源顺序和编号不一致会导致资源浪费(占着茅坑不拉屎)
- 编程麻烦
- 顺序资源分配法
- 破坏互斥条件
- 动态策略:避免死锁
- 什么是安全序列
- 什么是系统的不安全状态,与死锁有何联系
- 系统处于不安全状态未必死锁,但死锁一定处于不安全状态
- 如何避免系统进入不安全状态——银行家算法
- 静态策略:预防死锁
- 允许死锁的发生
- 死锁的检测和解除
- 死锁的检测(与数据结构的联合!)
- 两种结点
- 进程节点:对应一个进程
- 资源节点:对应一个资源,一类资源可能有多个
- 两种边
- 进程节点>>>资源节点:表示进程想申请几个资源(每条边代表一个)
- 资源节点>>>进程节点:表示已经为进程分配了几个资源(每条边代表一个)
- 可以消除所有边==可以完全简化的==没有发生死锁==可以找到一个安全序列
- 两种结点
- 死锁的解除
- 资源剥夺法
- 挂起死锁进程,抢占其资源
- 但是要防止被挂起的资源不会饥饿
- 撤销进程法
- 强制撤销部分、甚至全部死锁进程,优点简单
- 但是付出代价很大,进程运行很长时间但是功亏一篑
- 进程回退法
- 回退到避免死锁的地步
- 但是这要求系统记录进程的历史信息
- 资源剥夺法
- 死锁的检测(与数据结构的联合!)
- 死锁的检测和解除
- 不允许死锁的发生
- 死锁的概念
-