操作系统进程与线程思维导图
# *进程与线程*
## 进程(动态的)
### 组成
- 进程控制块(PCB)
- 进程存在的唯一标识
- 程序段
- 数据段
### 特征
- 动态性
- 并发性
- 独立性
- 进程事能够独立运行、独立获得资源、独立接受调度的基本单位
- 异步性
- 结构性
### 状态
- 运行态
- 就绪态
- 阻塞态
- 创建态
- 终止态
-
### 进程控制:原语实现
### 进程通信(PV)
- 共享存储(访问是互斥的)
- 基于数据结构
- 基于存储区
- 消息传递
- 直接通信
- 直接指明发送的进程ID
- 间接通信
- 指明发送的信箱(中间实体)
- 管道通信
- 设计一个管道(pipe文件)
- 单向(先进先出)
- 实现双向设置俩个管道
### 线程
- 比较
- 进程拥有资源和独立调度的基本单位,线程是独立调度的基本单位
- 有更好的并发性和独立性
- 无需操作系统的干扰,系统开销小
- 支持多处理系统
- 同一进程中的线程切换,不需要引起进程的切换。不同一进程中的线程切换,引起进程的切换
- 实现方式
- 用户级线程(ULT)
- 只在用户态完成
- 与操作系统无关
- 缺:当一个线程被阻塞时,所有进程都会被阻塞
- 内核级线程(KLT)
- 在内核态完成
- 有操作系统的支持,当一个线程被阻塞时,系统可运行其他进程的线程
- 缺:从用户态转换成核心态系统开销较大
- 组合方式(用户级线程和内核级线程结合)
- 多线程模型
- 一对一
- 优:并发高
- 缺,每一个线程都需要系统支持,开销大
- 一对多
- 优:开销小
- 缺:并发低
- 多对多
- 集二者之长
## CPU调度
### 层次
- 作业调度
- 内存与外存的调度--只调入一次,调出一次
- 内存调度
- 内存与外存的调度--暂时不运行的进程变为挂起态
- 进程调度
- 内存与CPU的调度
- 基本调度之一,调度频率最高
### 时机
- 可以调度
- 主动放弃
- 正常终止、主动阻塞、发生异常
- 被动放弃
- 有优先级更高的进程、更紧急的进程、时间片用完,
- 不可以调度
- 处理中断、原语(原子操作过程)
- 在操作系统内核程序临界区
### 切换
- 进程调度、切换有代价
### 方式
- 抢占式
- 非抢占式
### 目标
- CPU利用率
-
- 系统吞吐量
-
- 周转时间
-
- 等待时间
- 进程处于等待CPU的时间之和
- 响应时间
- 指从用户提交请求到首次产生响应所用的时间
### 调度程序
- 创建新进程、进程退出、运行进程阻塞、I/O中断
### 闲逛进程
- 没有就绪进程的时候运行闲逛进程
### 算法
- 先来先服务(FCFS)
- 按照作业/进程到达的先后顺序进行服务
- 非抢占式的算法、不会导致饥饿
- 优:公平、算法实现简单
缺:对长作业有利,对短作业不利
- 短作业优先(SJF)
- 最短的作业/进程优先得到服务
- 非抢占式、会导致饥饿
- 优:“最短的”平均等待时间、平均周转时间
缺:对短作业有利,对长作业不利。可能产生
饥饿现象
- 高响应比优先(HRRN)
- 在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
- 非抢占式、不会导致饥饿
- 等待时间相同时,要求服务时间短的优先
要求服务时间相同时,等待时间长的优先
- 时间片轮转(RR)
- 按照各进程到达就绪队列的顺序,轮流让各个进程执行一
个时间片
- 抢占式、不会导致饥饿
- 优点:公平;响应快,适用于分时操作系统;
缺点:由于高频率的进程切换,因此有一定开销;不区分
任务的紧急程度。
- 优先级调度
- 每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程
- 抢占式、非抢占式都有、会导致饥饿
- 优点:用优先级区分紧急程度、重要程度,适用于实时操
作系统。可灵活地调整对各种作业/进程的偏好程度。
缺点:若源源不断地有高优先级进程到来,则可能导致饥
饿
- 多级反馈队列
- 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
只有第 k 级队列为空时,才会为 k+1 级队头的进程分配时间片
- 抢占式、会导致饥饿
- 对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以很快就得到响应(RR的优点);短进程只用较少的时间就可完成(SPF的优点);不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)
## 同步与互斥
### 同步
### 进程互斥
- 四大部分
- 进入区、临界区、退出区、剩余区
- 四大原则
- 空闲让进、忙则等待、有限等待、让权等待
### 软件实现
- 单标志法
- 进入区只"检查" 不"上锁"
- 不遵循“空闲退让”
- 双标志先检查法
- 进入区先"检查" 后"上锁",退出区“解锁”
- 不遵循“忙则等待”
- 双标志后检查法
- 进入区先"加锁" 后"检查",退出区“解锁”
- 不遵循“空闲退让、有限等待”,可能导致饥饿
- Peterson算法
- 在进入区“主动争取-主动谦让-检查对方是否想进、己方是否谦让”
- 不遵循“让权等待”,会发生”忙等“
### 硬件实现
- 中断屏蔽方法
- 利用“开/关中断指令”实现
- 优:简单、高效
缺:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程
- TestAndSet(TS指令/TSL)
- 把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作
- 优:实现简单、适用于多处理机环境
缺:不满足“让权等待”原则、会导致“忙等”。
- Swap指令(XCHG)
- 把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作
- 优:实现简单、适用于多处理机环境
缺:不满足“让权等待”原则、会导致“忙等”。
### 锁
- 互斥锁
- 解决临界区最简单的工具
- 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
- 缺:不太适用于单处理机系统,忙等的过程中不可能解锁
### 信号量机制
- 整型信号量
- 用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。
- 缺陷是存在“忙等”问题
- wait(S)、signal(S) 也可以记为 P(S)、V(S)、这对原语可用于实现系统资源的“申请”和“释放
默认 S 为记录型信号量
- 记录型信号量
- P操作,先S.value--,之后可能需要执行block原语
V操作,先S.value++,之后可能需要执行wakeup原语
- 实现系统资源的“申请”和“释放”
实现进程互斥、进程同步
- 信号量机制(解决带权等待)
- P( S ) —— 申请一个资源S,如果资源不够就阻塞等待
V( S ) —— 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程
- 进程互斥
- 设置互斥信号量 mutex,初值为 1
、在进入区 P(mutex)——申请资源
、在退出区 V(mutex)——释放资源
- 进程同步
- 设置同步信号量 S, 初始为 0
、在“前操作”之后执行 V(S)
、在“后操作”之前执行 P(S)
- 实现前驱关系
- 原则:前V后P
### 管程
- 解决信号量机制编程麻烦、易出错
- 组成
- 共享数据结构
- 对数据结构初始化的语句
- 一组用来访问数据结构的过程
- 基本特征
- 各外部进程/线程只能通过管程提供的特点“入口”才能访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
## 死锁
### 区别
- 死锁
- 至少俩个进程一起死锁,死锁进程处于阻塞态
- 饥饿
- 可以只有一个进程饥饿,饥饿进程可能阻塞也可能就绪
### 必要条件
- 互斥条件
- 不剥夺条件
- 请求和保持条件
- 循环等待条件
- 循环等待未必死锁,死锁一定有循环等待
### 发生原因
- 对不可剥夺资源的不合理分配
- 请求和释放资源顺序不当
### 处理策略
- 预防死锁(静态)
- 破坏互斥条件
- SPOOLing技术-将资源改为共享资源
- 破坏不剥夺条件
- 剥夺调度,主动释放
- 破坏请求和保持条件
- 静态分配
- 破坏循环等待条件
- 顺序资源分配法
- 避免死锁
- 安全序列
- 按照这个序列执行,每一个进程都可以完成
- 银行家算法
- 银行家算法步骤:
①检查此次申请是否超过了之前声明的最大需求数
②检查此时系统剩余的可用资源是否还能满足这次请求
③试探着分配,更改各数据结构
④用安全性算法检查此次分配是否会导致系统进入不安全状态
- 安全性算法
- 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,
并把该进程持有的资源全部回收。
不断重复上述过程,看最终是否能让所有进程都加入安全序列
- 死锁的检测和解除
- 资源分配图
- 俩种节点
- 俩种边
- 死锁检测算法
- 依次消除与不阻塞进程相连的边,直到无边可消
注:所谓不阻塞进程是指其申请的资源数还足够的进程
- 死锁定理:若资源分配图是不可完全简化的,说明发生了死锁
- 解除方法
- 资源剥夺法
- 撤销进程法(终止进程法)
- 进程回退法
-

浙公网安备 33010602011771号