操作系统
第二章:进程管理
进程与线程
-
进程的基本概念
-
功能: 为了描述并发执行程序的动态特性,引进的新的概念
-
程序的顺序执行及其特征
- 单批道处理系统的执行方式,按照前趋图的顺序执行
- 顺序性、封闭性、可再现性
-
程序的并发执行及其特征
-
指若干个程序同时在系统中运行,在执行时间上是重叠的
-
重叠是指运行程序的长度有重叠
-
特征
-
间断性
-
失去封闭性:共享性
-
不可再现性
-
-
-
进程的特征与状态
-
特征
-
结构性:进程实体由程序段、数据段及进程控制块组成,又称为进程映像
-
动态性
- 数据
- 代码
- 控制信息
-
并发性
- 多个进程实体同存于内存中中
-
独立性
- 地址空间相互独立
-
异步性
- 互相制约
-
-
进程实体
- 程序段+数据段+PCB
- 线程是操作系统进行运行调度的最小单位
- 包含在进程之中,是进程中实际运行工作的单位
- 一个进程可以并发多个线程,每个线程执行不同的任务
-
-
-
状态
- 基本状态 - 就绪:进程已获得除处理机以外的所有资源,一旦分配了处理机就可以立即执行,此时进程所处的状态为就绪状态 - 执行:进程在处理机上运行 - 阻塞:等待资源 - 图解 - 挂起 - 优先级的引入 - 把进程从内存转到外存 - 优点 - 提高处理机的效率 - 为运行的进程提供足够的内存 - 用于调试 - 请求种类 - 终端用户的请求 - 父进程请求 - 负荷调剂的需要 - 操作系统的需要 - 种类 - 就绪挂起 - 阻塞挂起 - 运行到就绪挂起 - 抢占式 - 激活 - 进程从外存转到内存 - 种类 - 就绪激活 - 阻塞激活 - 收容 - 收容一个新进程 - 进入就绪状态/就绪挂起 - 图解
-
进程控制块
-
用于描述和管理进程的数据结构,是进程实体的一部分,进程和PCB是一一对应的,可以参照UNIX中的进程控制块
-
进程标识信息
- 进程标识符、进程名、用户标识符、父进程标识符和子进程标识符
-
处理机状态信息
- 用来保存现场 - 通用寄存器、指令计数器、程序状态字(含执行结果状态、中断屏蔽码)、栈指针(每个进程都有与之相关的栈,保存过程和系统调用的地址和参数)
-
进程调度和状态信息
- 进程状态、进程优先级、进程调度的其他信息、等待事件(进程处于等待状态的原因)
-
进程控制信息
- 程序和数据地址、进程同步及通讯机制、资源清单、链接指针(处于同一状态的进程组成一个队列),链接指针指向队首
-
组织方式
- 链接方式 - 将处于同一状态的所有进程控制块链接在一起,这样的数据结构称为进程队列 - 索引方式 - 系统根据进程状态建立几张索引表,登记具有相应状态的PCB地址
-
-
-
线程
-
引入目的
- 减少程序并发执行所付出的时空开销,使操作系统具有更好的并发性
- 提高资源的利用率 和系统吞吐量 增加并发程度
-
线程的基本概念
-
是进程内的一个执行单元
-
资源分配的实体还是进程
-
线程是调度和分派的基本单位
-
将进程的两个属性分开
-
属性
-
轻型实体
-
独立调度和分派的基本单位
-
可并发执行
-
共享进程资源
-
状态
- 执行
- 阻塞
- 就绪
-
-
线程控制块
- 寄存器
- 堆栈
- 线程运行状态
- 优先级
- 线程专有存储器
- 信号屏蔽
-
-
线程和进程关系
- 一个线程必须有一个父进程
- 一个进程可以有多个线程
-
线程间的同步与通信
- 互斥锁
- 条件变量
- 信号量机制
-
线程的实现方式
-
内核支持线程
-
用户级线程
-
两者结合的办法
-
用户级线程和内核支持线程比较
- 线程的调度和切换速度
- 系统调用
- 线程执行时间
- 适应性
-
-
线程的实现
-
内核支持线程
-
用户级线程
-
运行在中间系统之上
- 运行时系统
- 内核控制线程
-
-
-
-
可以和内核支持线程相互关联
-
进程通信
-
进程通信的类型
-
共享存储器系统
-
共享数据结构
-
共享存储区
- 建立
- 附接
- 断接
-
-
管道通信系统
- 互斥
- 同步
- 确定对方是否存在
-
消息传递系统
- 直接通信方式
- 间接通信方式
-
客户机-服务器系统
-
套接字
- 基于文件型
- 基于网络型
-
远程过程调用
-
远程方法调用
-
-
-
消息传递通信的实现方式
-
直接消息传递系统
-
发送原语
-
接受原语
-
过程
- 在自己的工作区设置一个发送区
- 适用发送原语发送给接收进程,将其挂在接收进程的消息队列上
- 调用接收原语从自己的消息队列中摘下第一个消息,将内容复制到自己的消息接收区
-
消息缓冲区
-
增加的数据结构
-
对称寻址方式
-
-
信箱通信
-
私用邮箱
- 用户进程创建、其余进程只可发送
-
公用邮箱
- 操作系统创建
-
共享邮箱
- 用户创建,可共享
-
非对称寻址方式
-
结构
- 信箱头
- 信箱体
-
信箱原语
- 创建和撤销
- 消息的发送和接收
-
-
管道通信
- 以管道方式
-
-
-
进程控制
-
前置概念
-
原语
- 原子操作,有若干条机器指令构成,用以完成特定的功能,是不可分割的
-
-
进程的创建
-
引起事件
- 用户登录、
作业调度、
OS服务、
应用需求
- 用户登录、
-
创建原语
- 创建一个空闲PCB结构
- 为新进程分配资源
- 初始化新的PCB结构
- 将PCB结构插入相应的队列
-
进程图
- 描述进程家族关系的一棵有向树
-
-
进程的终止
-
引起事件
- 中断-正常结束
- 异常结束
- 外界干预:父进程可以请求终止子进程
-
终止原语
- 根据进程标识符,找到相应的PCB,读取状态
- 如果正处于进行状态,则停止进程的执行
- 如果有子进程,终止子进程
- 归还资源到父进程或者系统
- 撤销PCB
-
-
进程的阻塞与唤醒
-
引起事件
-
造成阻塞
- 请求系统服务(如请求分配资源但没有资源分配)
- 启动某种操作(进程必须在某种操作执行之后才能继续执行)
- 新数据未到达
- 无新工作可做
-
在满足条件之后就会唤醒
-
-
阻塞原语
- 根据当前执行进程的标识符找到PCB
- 停止执行进程,改状态为阻塞
- 保存进程的现场到PCB结构
- 将该进程PCB插入等待队列
- 转进程调度程序
- block 原语
-
唤醒原语
- 从等待队列中取出相应进程
- 改程序状态为就绪,将进程插入就绪队列
- 转进程调度或返回
- wakeup原语
-
-
进程的挂起与激活
-
挂起引起事件
- 用户进程请求将自己挂起
- 父进程请求将自己的某个子进程挂起
-
挂起原语
-
根据被挂起进程的标识符,找到PCB
-
取PCB的状态
- 运行状态
- 就绪状态
- 等待状态
-
suspend 原语
-
-
激活原语
- 系统将外存上被挂起的进程换入内存
- 将进程状态由挂起改为激活后的状态
- 有需要转进程调度
- active原语
-
-
处理机调度
-
处理机调度的层次
-
高级调度
- 决定后备队列中调入主存的作业
- 多少作业:取决于多道程序度
- 接纳哪些作业:取决于调度算法
-
中级调度
-
闪存中把暂时不运行的换出外存
-
决定那些进程被允许参与竞争CPU
-
处于挂起状态
-
引入原因
-
换出
- 紧缩:是空闲区间和占用区间分开到两端
- 内存空间紧张
- 就绪队列进程太多
- 等待I/O可能要一段时间
- 便于紧缩
-
换入
- 内存中有足够的空间
- 外存中进程的优先级高于内存中进程
-
-
-
低级调度
-
进程调度
-
方式
-
抢占式
-
原则
- 优先权
- 短作业优先
- 时间片
-
-
非抢占式
- 简单、系统开销小、无法处理紧急情况
-
-
-
就绪队列中分配处理机
-
-
作业状态
-
提交状态
- 用户作业由输入设备向系统外存输入时作业所处的状态
-
后备状态
-
执行状态
-
完成状态
-
-
只有低级调度是必须的
-
-
调度队列模型和调度准则
-
调度队列模型
- 一级
- 二级
- 三级
-
选择调度方式和调度算法的若干准则
-
面向系统的准则
- 系统吞吐量
- CPU利用率
- 各类资源的平衡利用
-
面向用户的准则
-
周转时间短
- 等待时间和运行时间之和
- 带权周转时间:和实际时间的比值
-
相应时间快
-
截止时间的保证
-
-
算法的性能准则
- 易于实现
- 执行开销比
- 稳定性
-
-
-
调度算法
-
先来先服务和短作业(进程)优先调度算法
- 短作业优先是当前时刻的短时间
- 多个作业同时到达时,短作业优先调度算法的平均周转时间最小
-
最短剩余时间优先调度算法
-
即当一个新进程进入就绪队列时,若其需要的运行时间比当前运行进程的剩余时间短,则它将抢占CPU
-
缺点
- 对长作业不利 并且长作业容易出现饥饿现象
- 未考虑紧迫程度
- 只是根据用户的估计运行时间 容易造假
-
-
高优先权优先调度算法
-
抢占式
-
非抢占式
-
优先权
- 静态优先权 开销小但是不准确
- 动态优先权
-
-
最高相应比优先调度算法
- 响应比 = (等待时间+要求服务时间 )/ 要求服务时间
-
基于时间片的轮转调度算法
-
最开始的在队首,执行完时间片到队尾
-
时间片过大 太大退化为先来先服务,会让队尾的进程等待过久
-
时间片过小 进程切换过于频繁,系统的开销过大
-
多级反馈队列调度算法
- 设置多个队列
- 优先级越高,执行时间越短
- 在第一个队列执行完以后再执行第二个队列
- 执行过的进程放到最后一个队列的末尾
-
-
-
实时调度
-
实现实时调度的基本条件
- 提供必要的信息
- 系统处理能力强
- 采用抢占式调度机制
- 具有快速切换机制
-
实时调度算法的分类
-
非抢占式调度算法
- 非抢占式轮状调度算法
- 非抢占式优先调度算法
-
抢占式调度算法
- 基于时钟中断的抢占式优先权调度算法
- 立即抢占的优先权调度算法
-
-
常用的几种实时调度算法
-
最早截止时间优先
-
最低松弛度优先
- 松弛度
- 抢占式的
-
-
进程同步
-
进程同步的基本概念
-
进程制约关系
- 相互协作关系
- 资源共享关系
-
临界资源与互斥
-
临界资源
- 一段时间内仅允许一个进程使用的资源
-
互斥
-
临界区
-
访问临界资源的那段代码称为临界区
- entry section 进入区
- critical section 临界区
- exit section 退出区
-
-
同类临界区
- 所有与同一临界资源相关联的临界区
-
-
互斥与同步
-
互斥
- 解决进程间竞争关系的手段
-
同步
- 解决进程间协作关系的手段
-
-
同步原则
- 空闲让进:资源无占用,允许使用
- 忙则等待:资源有占用,请求进程等待
- 有限等待:保证有限等待时间能够使用资源
- 让权等待:等待时,进程需要让出CPU
-
临界区互斥
-
基本方法
-
软件方法
-
单标志法
- 违背 空闲让进
-
双标志先检查法
- 违背 忙则等待
-
双标志法后检查
- 会导致 饥饿
-
皮特森算法
- 单标志法和双标志后检查法的结合
-
-
硬件方法
-
中断屏蔽法
- 进区关中断
- 出区开中断
-
硬件指令法
-
设置立原子操作指令
- 测试与设置指令TS test and set
- swap 指令
-
-
-
信号量
-
一种有效的进程同步机制
-
整型信号量
-
Wait(S) P操作 信号量减一(仅仅对信号量大于0有效 小于0的时候不做操作)
-
signal(S) V操作 信号量加一
-
缺点
- 在信号量小于等于0的时候会不停的测试
- 没有做到“让权等待的原则”
-
-
记录型信号量
- 增加记录资源数目的整型变量value值
- 增加一个进程链表指针L 链接所有等待进程
- signal和wait原语操作
- 记录型数据结构包含value值和链表L
-
AND型信号量集
- 全部分配或全不分配
- 适合同时需要多种资源,且每种占用一个时的情况
-
信号量集
-
和AND型信号量集一样
-
加判断条件后全分配或全不分配
-
适合于同时需要多种资源,且每种占用的数目不同,且可分配的资源还存在临界值
-
特殊应用
- Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
- Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
- Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
-
-
-
-
-
-
经典进程的同步问题
-
生产者--消费者问题
-
用记录型信号量解决
-
用empty和full分别表示空缓冲区的数量和满缓冲区的数量
- empty初值为n
- full初值为0
-
临界资源mutex 初值为1
-
过程
-
生产一个产品:
- 看到先要求一个空缓冲区然后要求临界资源
- 生产完成以后,释放临界资源,生成一个满缓冲区
-
取出产品:
- 需要一个满缓冲区和临界资源
- 取出后,释放临界资源并生成一个空缓冲区
-
-
-
用AND信号量解决
- 可以将2步wait和signal合成一个,可以避免出现wait顺序颠倒的情况
-
-
哲学家进餐问题
-
算法描述
-
存在问题
- 当五个哲学家同时感觉饥饿,并同时拿起自己左边的筷子,则会出现死锁
-
尝试解决
- 至多允许四个哲学家同时进餐 还是有可能存在死锁的问题
- 同时使用左右筷子 采用AND信号量解决问题
- 奇数号哲学家先拿左边筷子再拿右边筷子,偶数号哲学家相反
-
-
读者--写者问题
-
共享整型变量 readcount 记录当前正在读数据的读者数量
- 初值为0
-
wmutex 用于写者与写者、写者与读者之间的互斥
- 初值为1
-
rmutex 用于读者互斥地访问共享变量readcount
- 初值为1
-
算法描述
- 读者描述
- 写者描述
-
使用信号量集解决
- 至多允许RN个读者同时读
- 引入信号量L 初值为RN
- 信号量mx 初值为1
-
-
-
信号量的应用
-
实现互斥
- wait(mutex)
- 临界区
- signal(mutex)
-
实现前趋关系
- S1
- signal(S)
- wait(S)
- S2
-
-
管程机制
-
管程
- 管程名字
- 局部于管程的共享数据结构(变量)
- 对共享数据结构进行的一组操作(函数)
- 对局部于管程的数据设置初始值的语句
-
基本特性
- 共享变量仅能由管程内定义函数访问
- 一个进程只有通过调用管程内函数才能访问共享变量
- 管程互斥进入
- 由编译程序在编译时自动添加上
-
入口等待队列
-
紧急等待队列
- x.wait
- x.signal
-
条件变量
-
说明
-
同步原语
- x.wait
- x.signal
-
condition x
-
-
作用
-
-
生产者、消费者
-
进程死锁
-
死锁
-
多个进程因竞争系统资源而造成的一种僵局,如果没有外力作用,这些进程永远不能向前推进
- 死锁: 缺资源不缺CPU
- 饥 饿 : 缺资源 不缺CPU
-
-
产生死锁的原因
-
竞争资源
- 可剥夺资源与不可剥夺
- 永久性和临时性
- 不可剥夺、永久性和临时性资源可造成死锁
-
进程推进顺序不当
-
产生死锁的必要条件
- 互斥条件
- 请求和保持条件
- 不可剥夺条件
- 环路等待条件
-
-
处理死锁的基本方法
-
预防死锁
-
预防死锁的方法
-
破坏 互斥条件
- 是设备本身固有的属性
- 不可修改
-
破坏“不可剥夺”
- 已有该资源的进程要求释放资源
- 只可用于状态可以保存和恢复的资源
-
破坏 请求和保持条件
- 静态资源分配法
- 一次分配所用的全部资源
- 资源利用率低,进程延迟
-
破坏“环路等待”
-
有序资源分配
- 进程申请一个资源的时候,必须释放其占有序号大于该资源的其他资源
-
资源利用率提高(还是存在浪费)
-
限制了用户编程
-
限制了设备的增加
-
-
-
-
避免死锁
-
系统安全状态
- 只要系统始终都处于安全状态便可避免死锁的发生
-
利用银行家算法避免死锁
-
- 通过对资源分配进行分析
-
- 如果有任何一个进程的资源需求满足现有资源储备量,则可分配,并释放占用的资源 重复1
- 如果所有进程可全部被释放,则处于安全状态
-
-
-
检测死锁和解除
-
死锁的检测
-
资源分配图
- 用圆圈代表进程
- 方框表示一类资源
- 方框中一个点代表一类资源的一个实例
- 从进程到资源表示进程请求一个该类资源
- 从资源指向进程表示有一个资源分配给该进程
-
检测
- 不可完全简化即死锁
- 完全简化即形成孤立结点
- 可以获取到想要的资源则移除请求边和分配边
-
-
死锁的解除
- 资源剥夺法
- 撤销进程法
-
-