操作系统(二)—— 进程管理

二、进程管理

1. 进程与线程

1)进程的概念与特征

​ ① 概念:进程(进程实体) = 程序段 + 数据段 + PCBPCB是进程存在的唯一标志

​ ② 定义:进程是程序的一次执行过程。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

​ ③ 特征:动态性、并发性、独立性、异步性、结构性

​ 【考点】进程是能独立运行、系统资源分配的最小单位

2) 进程的状态与转换

操作系统进程的状态

3) 进程控制

​ 对系统中的所有进程的管理——实现进程转换
进程控制

4) 进程的组织

​ ① 链接方式

​ ② 索引方式

5) 进程的通信

​ ① 概念:进程是相互独立的,一个进程不能直接访问另一个进程的地址空间,实现进程之间进行信息交换就是进程通信。

​ ② 通信方式:
进程的通信方式

6) 线程概念和多线程模型

​ ① 线程是什么? ——轻量级“进程”

​ ② 线程的属性:
线程的特点

​ ③ 线程的实现方式

​ 用户级线程:由应用程序管理,操作系统看不到

​ 内核级线程:由操作系统管理

​ 【注】内核级线程才是处理机分配的单位

​ ④ 多线程模型:

​ 多对一:多个用户级线程映射到一个内核级线程

​ 一对一:一个用户级 对应 一个内核级

​ 多对多:n个用户级 映射到 m个内核级

2. 处理机调度

1)基本概念

​ 进程数量往往大于处理机个数,为了更好地处理进程间的竞争,引入了处理机调度机制。

**2)三个层次

处理机调度的三个层次**

3)三层调度的联系和对比

​ 作业调度为进程活动做准备,内存调度将暂时不能运行的进程挂起,进程调度使进程正常活动起来。

4)进程调度的时机

​ ① 需要调度的时机:

​ a. 主动放弃处理机:进程正常终止、执行异常而终止、主动请求阻塞(I/O)

​ b. 被动放弃处理机:时间片用完,处理机资源被抢占

​ ② 不能进行调度:

​ a. 处理中断的过程中

​ b. 操作系统内核程序临界区

​ c. 原子操作期间

5)进程调度的切换

​ 【注】进程的切换和调度是有代价的

6)进程调度的方式

​ ① 非抢占式 —— 早期的批处理系统

​ ② 抢占式 —— 分时操作系统、实时操作系统

7)调度算法的评价指标

调度算法的评价指标

8)调度算法

适用于批处理操作系统:

​ ① 先来先服务(FCFS)

​ a. 算法思想:“公平”,排队

​ b. 算法规则:按照作业/进程的先后顺序服务

​ c. 用于作业/进程调度:都可以用

​ d. 是否可抢占:非抢占式

​ e. 优缺点:算法简单、公平,但是效率低;有利于长作业,不利于短作业;有利于CPU繁忙型作业,不利于IO繁忙型作业。

​ f. 是否会导致饥饿:不会

​ ② 短作业优先(SJF)

​ a. 算法思想:追求最少的平均等待时间、最少的平均周转时间、最少的平均带全周转时间

​ b. 算法规则:已到达的最短的作业/进程优先得到服务(服务时间最短)

​ c. 用于作业/进程调度:都可以用,用于进程时叫“短进程优先(SPF)”

​ d. 是否可抢占:SJF和SPF是非抢占式,但是也有抢占式版本的——最短剩余时间优先算法

​ e. 优缺点:优点:“最短的”平均等待时间、平均周转时间;缺点:不公平,对短作业有利,长作业不利,有可能饥饿现象;作业长短由用户确定,可能出现不准确。

​ f. 是否会导致饥饿:会,甚至饿死

​ ③ 高响应比优先(HRRN)

​ a. 算法思想:综合考虑作业/进程的等待时间和要求服务的时间

​ b. 算法规则:每次调度时,先计算各个作业或进程的响应比,选择响应比最高的作业/进程服务。 响应比 = (等待时间+要求服务时间) / 要求服务时间

​ c. 用于作业/进程调度:都可以

​ d. 是否可抢占:非抢占式

​ e. 优缺点:

​ i. 综合考虑了等待时间和运行时间(要求服务时间)

​ ii. 等待时间相同时,要求服务时间短的优先(SF 的优点)

​ iii. 要求服务时间相同时,等待时间长的优先(FCFS 的优点)

​ f. 是否会导致饥饿:不会

适用于交互式系统:

​ ④ 时间片轮转调度算法

​ a. 算法思想:公平的、轮流地为各个进程服务,时间片

​ b. 算法规则:分配时间片,用完了就重新进入队列

​ c. 用于作业/进程调度:用于进程调度

​ d. 是否可抢占:抢占式,由时钟中断来通知CPU时间片已结束

​ e. 优缺点:公平、响应快,适用于分时操作系统;高频率切换进程会有一定的开销;不区分任务紧急程度

​ f. 是否会导致饥饿:不会

​ ⑤ 优先级调度算法

​ a. 算法思想:很多场景需要根据任务的紧急程度来决定处理顺序,常用于实时操作系统

​ b. 算法规则:优先级高的先执行

​ c. 用于作业/进程调度:都可以,还可以用于I/O调度

​ d. 是否可抢占:抢占式、非抢占式都有

​ e. 优缺点:用优先级划分调度,适用于实时操作系统,可灵活调整任务的偏好程度;如果有很多的高优先级进来,可能导致饥饿。

​ f. 是否会导致饥饿:会的

​ ⑥ 多级反馈队列调度算法

​ a. 算法思想:对其他算法折中权衡

​ b. 算法规则:

​ c. 用于作业/进程调度:用于进程调度

​ d. 是否可抢占:抢占式

​ e. 优缺点:

​ f. 是否会导致饥饿:不会

3. 进程同步

1)概念

​ ① 同步:为完成某个任务而简历的两个或多个进程

​ ② 互斥:当一个进程访问临界资源时,另一个进程必须等待,当访问结束后,另一个才能访问。

​ ③ 临界资源:一次只能为一个进程服务的资源,如打印机、摄像头等同步与互斥

2)进程互斥的软件实现方法

​ ① 单标志法

​ a. 算法思想:两个进程访问临界资源结束后,会把使用临界区的权限转交给另一个进程。

​ b. 优点:可以实现“同一时刻最多只允许一个进程访问临界区”

​ c. 局限性:如果一个进程拿到锁,但是一直不进入,一直等待。违背“空闲让进”原则

​ ② 双标志先检查法

​ a. 算法思想:每个进程进入临界区之前先检查当前临界区有没有其他进程,用一个boolean数组存放每个进程的状态(锁标志)。

​ b. 优点:不会出现一直等待问题

​ c. 局限性:因为是并发执行,可能多个进程同时进入临界区。违背“忙则等待”原则。

​ ③ 双标志后检查法

​ a. 算法思想:在算法②的逻辑,改为先加锁,再检查。

​ b. 优点:解决了“忙则等待”问题。

​ c. 局限性:并发执行,可能会导致都进入不了,进程饿死了。违背了“空闲让进”、“有限等待”原则

​ ④ Peterson 算法

​ a. 算法思想:如果多个进程都想进入临界区,就让他们“孔融让梨”。

​ b. 优点:满足 空闲让进、忙则等待、有限等待。

​ c. 局限性:未遵循让权等待原则。

3)进程互斥的硬件实现方法

​ ① 中断屏蔽

​ a. 优点:简单高效

​ b. 局限性:不适用于多处理机、只适用于操作系统内核进程(因为开/关中断指令只能运行在内核态)

​ ② 硬件指令:

​ 指令:TestAndSet指令(TSL指令或TS指令)、Swap指令

4)信号量机制

信号量机制代码

信号量机制分类

4)信号量机制实现互斥、同步、前驱关系

信号量机制实现互斥、同步、前驱关系

5)生产者消费者问题(同步互斥问题)

​ ① 问题描述:生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区拿一个产品并使用,缓冲区满了不能再生产,缓冲区空了不能再拿。

​ 【注】这里的缓冲区应该是临界资源,各进程之间应该互斥访问,以保证缓冲区中的数据安全(避免覆盖、多拿问题)。

​ 【考点】实现互斥必须在实现同步的两个P操作之后,否则会死锁

6)吸烟者问题(互斥问题)

7)读者-写者(互斥问题)

​ ① 两个及以上的读进程 不需要互斥

​ ② 读 和 写进程需要互斥

​ ③ 两个及以上的写进程 需要互斥

8)哲学家进餐问题

9)管程

​ 类似于 Java中的 类,将执行过程封装到方法中了。

4. 死锁

1)死锁的概念

​ ① 什么是死锁?

​ 并发环境下,各个进程相互等待对方手里的资源,无法向前推进。

​ ② 进程死锁、饥饿、死循环的区别

​ 死锁:并发环境下,各个进程相互等待对方手里的资源,无法向前推进。

​ 饥饿:某个进程由于长期得不到想要的资源,进程无法推进。

​ 死循环:某进程执行过程中一直跳不出去某个循。
死锁、饥饿、死循环的区别

​ ③ 死锁产生的必要条件(四个)

​ a. 互斥条件:只有对必须互斥使用的资源的争抢才会出现死锁。

​ b. 不可剥夺条件:进程所获得的资源没使用完之前,不能由其他进程强行剥夺,只能由其主动释放。

​ c. 请求和保持条件:进程持有了至少一个资源的情况下又提出了新的资源请求,新的资源请求得不到满足,也不释放已有的资源。

​ d. 循环等待条件:存在一种进程资源等待链,链中的每一个进程已获得的资源被下一个进程所请求。

​ ④ 什么时候会产生死锁

​ a. 竞争不可剥夺的系统资源

​ b. 进程推荐顺序非法

​ c. 信号量的使用不当

​ ⑤ 死锁的处理策略

​ a. 预防死锁 —— 破坏死锁的四个必要条件之一

​ b. 避免死锁 —— 用某种方法防止系统进入不安全状态从而避免死锁,如银行家算法

​ c. 死锁的检测和解除 —— 允许死锁的发生,但是会检测处理并解除

2)死锁预防

​ ① 破坏互斥条件

​ 偶尔可以破坏,如SPOOLing技术解决打印机互斥问题,很多时候都不能破坏,甚至要保护。

​ ② 破坏不可剥夺条件

​ 方案一:进程请求新的资源得不到满足时,释放持有的资源

​ 方案二:某个进程需要一个被其他进程占用的资源时,由操作系统协助,强行剥夺

​ 缺点:实现复杂;增加系统开销;可能导致饥饿;仅适用于易保存/恢复状态的资源,如CPU

​ ③ 破坏请求和保持条件

​ 静态分配方法:进程运行前一次性申请所需要全部的资源

​ 缺点:资源利用率低(资源用得不多,但要一直保持),可能引起饥饿(有的资源一直不到位)。

​ ④ 破坏循环等待条件

​ 顺序资源分配法:规定每个进程必须按编号递增的顺序请求资源,同编号资源一次申请完。(先持有小编号—> 才能申请大编号的资源)

​ 缺点:不方便新增设备;进程实际使用资源与递增顺序不一样,资源浪费;必须按照顺序申请,编程麻烦。

3)死锁避免

​ 原理:每一次资源分配时,用银行家算法检测,保证系统处于安全状态。

​ ① 安全序列:如果系统按照一种序列分配资源,能保证每个进程都顺利完成,那么这个序列就是安全序列。

​ ② 安全状态:能找到任何一个安全序列,就是安全状态

​ 【注】安全状态一定不会发生死锁,非安全状态不一定会发生死锁。

​ ③ 银行家算法:资源分配之前判断这次分配是否会导致系统进入不安全状态,如果会进入,就让线程阻塞。

4)死锁检测和解除

① 检测死锁

​ 资源分配图,能消除所有的边,则称这个图是可完全简化的,此时一定没有发生死锁;不能全部消除,则此时一定发生了死锁,且连着边的节点就是发生死锁的进程。

② 死锁解除

​ a. 资源剥夺法

​ b. 撤销进程法(终止进程法)

​ c. 进程回退法

posted @ 2022-05-17 17:40  浪漫主义程序员  阅读(386)  评论(0编辑  收藏  举报