进程及进程管理 第4章 进程及进程管理
进程及进程管理——主要内容 进程的引入 进程概念 进程控制 进程的相互制约关系 进程同步机构 进程互斥与同步的实现 1
进程及进程管理——进程的引入 进程引入
1. 顺序程序及特点 进程及进程管理——进程的引入 (1) 计算 所组成。 (2) 程序的顺序执行 行,这类计算过程就是程序的顺序执行过程。 1. 顺序程序及特点 (1) 计算 程序的一次执行过程称为一个计算,它由许多简单操作 所组成。 (2) 程序的顺序执行 一个计算的若干操作必须按照严格的先后次序顺序地执 行,这类计算过程就是程序的顺序执行过程。 2
首先输入用户的程序和数据;然后进行计算;最后打印计 算结果,即有三个顺序执行的操作。 进程及进程管理——进程的引入 (3) 顺序程序的特点 ① 单道系统的工作情况 对用户作业的处理 —— 首先输入用户的程序和数据;然后进行计算;最后打印计 算结果,即有三个顺序执行的操作。 I:输入操作 C:计算操作 P:输出操作 P2 C2 I2 P1 C1 I1 作业1 作业2 单用户系统中操作的先后次序图 3
顺序性 —— 处理机的操作严格按照程序所规定的顺序执行。 进程及进程管理——进程的引入 ② 顺序程序的特点 顺序性 —— 处理机的操作严格按照程序所规定的顺序执行。 封闭性 —— 程序一旦开始执行,其计算结果不受外界因素的影响。 可再现性 —— 程序执行的结果与它的执行速度无关 (即与时间无关),而只与初始条件有关。 4
2. 并发程序 (1) 多道系统的工作情况 进程及进程管理——进程的引入 哪些程序段的执行必须是顺 序的?为什么? 哪些程序段的执行是并行 2. 并发程序 (1) 多道系统的工作情况 I1 I2 I3 I4 C1 C3 C2 P1 P2 对n个用户作业的处理 —— 作业1: I1 C1 P1 作业2: I2 C2 P2 作业n: In Cn Pn 哪些程序段的执行必须是顺 序的?为什么? 哪些程序段的执行是并行 的?为什么? 多用户系统中操作的先后次序图 5
(2) 什么是程序的并发执行 进程及进程管理——进程的引入 ① 定义 若干个程序段同时在系统中运行,这些程序段的执行在时间上是重叠 的,一个程序段的执行尚未结束,另一个程序段的执行已经开始,即 使这种重叠是很小的一部分,也称这几个程序段是并发执行的。 ② 三个并发执行的程序段 ③ 并行语句记号 cobegin S1;S2; ;Sn ; coend P Q R 三个并发进程 6
(3) 并发程序的特点 进程及进程管理——进程的引入 ① 失去程序的封闭性和可再现性 若一个程序的执行可以改变另一个程序的变量,那么,后 (3) 并发程序的特点 ① 失去程序的封闭性和可再现性 若一个程序的执行可以改变另一个程序的变量,那么,后 者的输出就可能有赖于各程序执行的相对速度,即失去了 程序的封闭性特点。 ⅰ 例: 讨论共享公共变量的两个程 序,执行时可能产生的不同 结果。程序A执行时对n做加 1的操作;程序B打印出n值, 并将它重新置为零。 程序A n := n+1; 程序B print(n); n := 0; 共享变量的两个程序 7
进程及进程管理——进程的引入 ⅱ 失去程序的封闭性和可再现性的讨论 程序A的n :=n+1与 程序B的两个语句 的关系 n的赋值 打印的结果 n := n+1; 程序B print(n); n := 0; 共享变量的两个程序 程序A的n :=n+1与 程序B的两个语句 的关系 n的赋值 打印的结果 n的最终赋值 之前 10 11 之后 10 1 之间 10 8
进程及进程管理——进程的引入 ② 程序与计算不再一一对应 一个程序可以对应多个计算。 ③ 程序并发执行的相互制约 例1: I1 输入程序段 I2 In 例2: 编译1 C编译程序 编译2 编译n 一个程序对应多个计算的例子 ③ 程序并发执行的相互制约 间接的相互制约关系 —— 资源共享 直接的相互制约关系 —— 公共变量 9
3. 什么是与时间有关的错误 进程及进程管理——进程的引入 程序并发执行时,若共享了公共变量,其执行结果与各并发 3. 什么是与时间有关的错误 程序并发执行时,若共享了公共变量,其执行结果与各并发 程序的相对速度有关,即给定相同的初始条件,若不加以控 制,也可能得到不同的结果,此为与时间有关的错误。 10
进程及进程管理——进程概念 进程概念
1. 进程定义 (1) 什么是进程 (2) 进程与程序的区别 进程及进程管理——进程概念 所谓进程,就是一个程序在给定活动空间和初始环境下, 1. 进程定义 运行 暂停 运行 (1) 什么是进程 所谓进程,就是一个程序在给定活动空间和初始环境下, 在一个处理机上的执行过程。 (2) 进程与程序的区别 ① 程序是静态的概念,进程是动态的概念; ② 进程是一个独立运行的活动单位; ③ 进程是竞争系统资源的基本单位; ④ 一个程序可以对应多个进程,一个进程至少包含一个程序。 11
2. 进程的状态 (1) 进程的基本状态 进程及进程管理——进程概念 ① 运行状态(running) 2. 进程的状态 (1) 进程的基本状态 ① 运行状态(running) 该进程已获得运行所必需的资源,它的程序正在处理机上 执行。 ② 等待状态(wait) 进程正等待着某一事件的发生而暂时停止执行。这时, 即使给它CPU控制权,它也无法执行。 ③ 就绪状态(ready) 进程已获得除CPU之外的运行所必需的资源,一旦得到 CPU控制权,立即可以运行。 12
(2) 进程状态的变迁 进程及进程管理——进程概念 ① 进程状态可能的变迁 运 行 服务请求 (请求I/O等) 进程调度 × 时间片到 运 行 服务请求 (请求I/O等) 进程调度 × 时间片到 个别系统提供 就 绪 等 待 服务完成/ 事件来到 进程状态变迁图 13
进程及进程管理——进程概念 ② 具有进程基本状态的变迁图 运 行 服务请求 (请求I/O等) 服务完成/ 事件来到 进程调度 等 待 就 绪 运 行 服务请求 (请求I/O等) 服务完成/ 事件来到 进程调度 等 待 就 绪 进程状态变迁图 14
变迁1——> 变迁3,是否会发生?需要什么条件? 进程及进程管理——进程概念 ③ 讨论进程状态的变迁 运 行 1 2 3 4 等 待 就 绪 进程状态变迁的讨论 变迁1——> 变迁3,是否会发生?需要什么条件? 变迁4——> 变迁3,是否会发生?需要什么条件? 15
(3) 讨论在多进程操作系统环境下程序的执行 进程及进程管理——进程概念 (3) 讨论在多进程操作系统环境下程序的执行 ① 例1:讨论3个排序程序在不同的操作系统环境中执行结果 程序A:冒泡排序算法,在屏幕的左1/3处开设窗口显示其 排序过程; 程序B:堆排序算法,在屏幕的中1/3处开设窗口显示其排 序过程; 程序C:快速排序算法,在屏幕的右1/3处开设窗口显示其 排序过程。 讨论在不支持多进程的操作系统下运行和在支持多进程的 操作系统下运行的情况 16
ⅰ在不支持多进程的操作系统下运行 进程及进程管理——进程概念 依次运行程序A、程序B、程序C。 ⅱ 在支持多进程的操作系统下运行 建立进程A、B、C;对应的程序分别是程序A、B、C; 若系统采用时间片轮转的调度策略,则在屏幕上有3个窗口,同时显示3个排序过程。 实际上这3个程序在轮流地占用CPU时间,由于CPU的高速度,使我们看到的是这3个程序在同时执行。 17
② 例2:讨论2个程序在不同的操作系统环境中执行结果 进程及进程管理——进程概念 ② 例2:讨论2个程序在不同的操作系统环境中执行结果 程序C:打印工资报表的程序; 程序D:计算1000以内所有素数并显示最后结果。 讨论在不支持多进程的操作系统下运行和在支持多进程 的操作系统下运行。 18
ⅰ在不支持多进程的操作系统下运行 进程及进程管理——进程概念 依次运行程序C、程序D,可以看到,先是打印机不停 算,最后显示所计算的结果。 ⅱ 在支持多进程的操作系统下运行 建立进程C、D;对应的程序分别是程序C、D; 由于进程C是I/O量较大的进程,而进程D是计算量较大的进程,故在系统进程调度的控制下,两个进程并发执行。可以看到打印机不断打印工资报表;而处理机不停地计算,最后屏幕显示计算的结果。 19
3. 进程描述 (1) 什么是进程控制块 (2) 进程的组成 进程及进程管理——进程概念 同时期所处的状态的数据结构,称为进程控制块 3. 进程描述 (1) 什么是进程控制块 描述进程与其他进程、系统资源的关系以及进程在各个不 同时期所处的状态的数据结构,称为进程控制块 PCB (process control block)。 (2) 进程的组成 ① 程序与数据 描述进程本身所应完成的功能 ② PCB 进程的动态特征,该进程与其他进程和系统资源的关系。 进程 控制块 PCB 程序 与 数据 进程组成的示意图 20
(3) 进程控制块的主要内容 进程及进程管理——进程概念 ① 进程标识符 进程符号名或内部 id号 ② 进程当前状态 本进程目前处于何种状态 ② 进程当前状态 本进程目前处于何种状态 大量的进程如何组织? wait_lpt_q_start PCB3 PCB7 next 打印机等待队列结构 running PCB4 运行指针 ready_q_start PCB1 PCB2 PCB9 就绪队列结构 进程队列结构示例 21
该项登记了处于同一状态的下一个进程的 PCB地址。 ④ 进程优先级 反映了进程要求CPU的紧迫程度。 ⑤ CPU现场保护区 进程及进程管理——进程概念 ③ 当前队列指针next 该项登记了处于同一状态的下一个进程的 PCB地址。 ④ 进程优先级 反映了进程要求CPU的紧迫程度。 ⑤ CPU现场保护区 当进程由于某种原因释放处理机时,CPU现场信息被保存 在PCB的该区域中。 ⑥ 通信信息 进程间进行通信时所记录的有关信息。 ⑦ 家族联系 指明本进程与家族的联系 ⑧ 占有资源清单 22
进程及进程管理——进程控制 进程控制
1. 进程控制的概念 (1) 进程控制的职责 进程及进程管理——进程控制 ① 进程状态变化 ② 常用的进程控制原语 1. 进程控制的概念 (1) 进程控制的职责 对系统中的进程实施有效的管理,负责进程状态的改变。 ① 进程状态变化 创建 撤销 无 有 消亡 等待 运行 等待 唤醒 就绪 等待 ② 常用的进程控制原语 创建原语、撤消原语、阻塞原语、唤醒原语 23
(2) 进程创建 进程及进程管理——进程控制 ① 进程创建原语的形式 name为被创建进程的标识符 priority为进程优先级 (2) 进程创建 ① 进程创建原语的形式 create (name,priority) name为被创建进程的标识符 priority为进程优先级 ② 进程创建原语的功能 创建一个具有指定标识符的进程,建立进程的PCB结构。 24
进程及进程管理——进程控制 ③ 进程创建原语的实现 进程创建原语的实现框图 PCB池 PCB池示意图 入口 a 查PCB总链 将入口信息填入 有同名 ? 向系统申请一个空的PCB 结构 有空PCB ? 将入口信息填入 PCB相应项 将PCB入就绪队列 将PCB入总链队列 返回进 程pid 出错 Y N a b 1 PCB池示意图 进程创建原语流程图 25
(3) 进程撤销 进程及进程管理——进程控制 ① 进程撤销原语的形式 Kill (或exit) ② 进程撤销原语的功能 (3) 进程撤销 ① 进程撤销原语的形式 当进程完成任务后希望终止自己时使用进程撤消原语。 Kill (或exit) ② 进程撤销原语的功能 撤消当前运行的进程。将该进程的PCB结构归还到PCB资 源池,所占用的资源归还给父进程,从总链队列中摘除 它,然后转进程调度程序。 26
进程及进程管理——进程控制 ③ 进程撤销原语的实现 入口 由运行指针得当前进程的pid 释放本进程所占用的资源给父进程 该进程从总链队列中摘下 释放PCB结构 转进程调度 进程撤销原语流程图 27
(4) 进程等待 进程及进程管理——进程控制 ① 进程等待原语的形式 起自己。 susp(chan) 入口参数chan:进程等待的原因 (4) 进程等待 ① 进程等待原语的形式 当进程需要等待某一事件完成时,它可以调用等待原语挂 起自己。 susp(chan) 入口参数chan:进程等待的原因 ② 进程等待原语的功能 中止调用进程的执行,并加入到等待chan的等待队列中; 最后使控制转向进程调度。 28
进程及进程管理——进程控制 ③ 进程等待原语的实现 入口 保护进程的CPU现场到PCB结构中 置该进程为”等待”状态 转进程调度 进程等待原语流程图 29
(5) 进程唤醒 进程及进程管理——进程控制 ① 进程唤醒原语的形式 程使用唤醒原语叫唤醒它。 wakeup(chan) (5) 进程唤醒 ① 进程唤醒原语的形式 当处于等待状态的进程所期待的事件来到时,由发现者进 程使用唤醒原语叫唤醒它。 wakeup(chan) 入口参数chan:进程等待的原因。 ② 进程唤醒原语的功能 当进程等待的事件发生时,唤醒等待该事件的进程。 30
进程及进程管理——进程控制 ③ 进程唤醒原语的实现 入口 找到该等待队列 将队列首进程移出此等待队列 将该进程置为”就绪”状态, 并将PCB结构插入到就绪队列中 返回 进程唤醒原语流程图 31
进程及进程管理——进程之间的相互制约关系
1. 进程互斥的概念 (1) 临界资源 进程及进程管理——进程之间的相互制约关系 ① 例1:两个进程A、B共享一台打印机 1. 进程互斥的概念 (1) 临界资源 ① 例1:两个进程A、B共享一台打印机 设:x代表某航班机座号,p1和p2两个售票进程,售票工 作是对变量x加1。这两个进程在一个处理机C上并发执 行,分别具有内部寄存器r1和r2。 32
进程及进程管理——进程之间的相互制约关系 ② 例2:两个进程共享一个变量x 两个进程共享一个变量x时,两种可能的执行次序: A: p1: r1 := x;r1:= r1+1; x := r1 ; p2: r2:= x;r2 := r2+1; x := r2 ; B: p1: r1 := x; r1:= r1+1; x := r1 ; p2: r2:= x;r2 := r2+1; x := r2 ; 设x的初值为10,两种情况下的执行结果: 情况A: x = 10+2 情况B: x = 10+1 33
(2) 临界区 进程及进程管理——进程之间的相互制约关系 ③ 临界资源的定义 一次仅允许一个进程使用的资源称为临界资源。 硬件:如输入机、打印机、磁带机等 软件:如公用变量、数据、表格、队列等 (2) 临界区 临界区是进程中对公共变量 (或存储区)进行审查与修改的 程序段,称为相对于该公共变量的临界区。 x := x+1; csa { 进程A 进程B csb { 进程临界区示意图 34
(3) 互斥 进程及进程管理——进程之间的相互制约关系 在操作系统中,当某一进程正在访问某一存储区域时,就 不允许其他进程来读出或者修改存储区的内容,否则,就 会发生后果无法估计的错误。进程间的这种相互制约关系 称为互斥。 x := x+1; csa { 进程A 进程B csb { 进程临界区示意图 35
2. 进程同步的概念 (1) 什么是进程同步 (2) 进程同步的例 进程及进程管理——进程之间的相互制约关系 2. 进程同步的概念 (1) 什么是进程同步 并发进程在一些关键点上可能需要互相等待与互通消息, 这种相互制约的等待与互通消息称为进程同步。 (2) 进程同步的例 看病活动: 要病人去化验; 等化验结果; 继续诊病; 化验活动: 需要进行化验 ? 进行化验; 开出化验结果; ① 病员就诊 进程同步活动示意图 36
进程及进程管理——进程之间的相互制约关系 ② 共享缓冲区的计算进程与打印进程的同步 计算进程 cp和打印进程 iop公用一个单缓冲 缓冲区buf iop cp A D C B A B C D 两个进程共享一个缓冲区示意图 37
进程及进程管理——进程同步机构 进程同步机构
1. 锁和上锁、开锁操作 (1) 什么是锁 (2) 上锁操作和开锁操作 进程及进程管理——进程同步机构 检测w的值 (是0还是1); 1. 锁和上锁、开锁操作 (1) 什么是锁 用变量w代表某种资源的状态,w称为“锁” 。 (2) 上锁操作和开锁操作 检测w的值 (是0还是1); 如果w的值为1,继续检测; 如果w的值为0,将锁位置1 (表示占用资源),进入临界区执行。 (此为上锁操作) 临界资源使用完毕,将锁位置0。 (此为开锁操作) 38
(3) 进程使用临界资源的操作 进程及进程管理——进程同步机构 1→W 进入临界区csa 0→W 进程A W=0 ? = 0 进入临界区csb 进程B 两个进程使用临界资源的操作 39
(4) 上锁原语和开锁原语 进程及进程管理——进程同步机构 ① 上锁原语 ② 开锁原语 算法 lock 输入:锁变量w 输出:无 { test: if (w为1) goto test; ∕* 测试锁位的值*∕ else w=1; ∕*上锁*∕ } ② 开锁原语 算法 unlock 输入:锁变量w 输出:无 { w=0;∕*开锁*∕ } 40
2. 信号灯和P、V操作 (1) 什么是信号灯 进程及进程管理——进程同步机构 信号灯是一个确定的二元组 (s,q),s是一个具有非负初值 用信号灯的状态对并发进程和共享资源进行控制和管理。 信号灯是整型变量。 变量值 ≥ 0 时,表示绿灯,进程执行; 变量值 0 时,表示红灯,进程停止执行。 注意:创建信号灯时,应准确说明信号灯 s 的意义和初值 (这个初值绝不能为负值)。 41
(2) P 操作 进程及进程管理——进程同步机构 ① P 操作的定义 ② P 操作的实现 对信号灯s的 p操作记为 p(s)。p(s)是一个不可分割的原语操作,即取 信号灯值减1,若相减结果为负,则调用p(s)的进程被阻,并插入到 该信号灯的等待队列中,否则可以继续执行。 入 口 S-1 → S S≥0 ? 转进程调度 返回 入信号灯等待队列 置“等待状态” ≥0 0 ② P 操作的实现 P 操作原语流程图 42
(3) V 操作 进程及进程管理——进程同步机构 ① V 操作的定义 ② V 操作的实现 对信号灯s的 v操作记为 v(s)。v(s)是一个不可分割的原语操作,即取 信号灯值加1,若相加结果大于零,进程继续执行,否则,要帮助唤 醒在信号灯等待队列上的一个进程。 入 口 S+1 → S 从信号灯的等待队列中取出首元素 入就绪队列 置“就绪状态” 返回 S≤0 ? >0 ② V 操作的实现 V 操作原语流程图 43
进程及进程管理——进程互斥与同步的实现 进程互斥与同步的实现
1. 用上锁原语和开锁原语实现进程互斥 (1) 框图描述 进程及进程管理——进程互斥与同步的实现 上锁原语 进入临界区csa 进程 pa 1. 用上锁原语和开锁原语实现进程互斥 (1) 框图描述 上锁原语 进入临界区csa 进程 pa 开锁原语 进入临界区csb 进程 pb 两个进程利用上锁、开锁原语实现互斥 44
(2) 程序描述 进程及进程管理——进程互斥与同步的实现 main( ) pa( ) pb( ) { { { } } } 程序 task1 main( ) pa( ) pb( ) { { { int w=1; ∕* 互斥锁 *∕ cobegin lock(w); lock(w); pa( ); csa ; csb ; pb( ); unlock(w); unlock(w); coend } } } 45
2. 用信号灯的P、V操作实现互斥 (1) 框图描述 设:mutex为互斥信号灯,初值为1。 (2) 程序描述 进程及进程管理——进程互斥与同步的实现 2. 用信号灯的P、V操作实现互斥 (1) 框图描述 设:mutex为互斥信号灯,初值为1。 p(mutex) 进入临界区csa 进程 pa v(mutex) 进入临界区csb 进程 pb 两个进程利用信号灯的P、V操作实现互斥 (2) 程序描述 46
(3) 信号灯可能的取值 进程及进程管理——进程互斥与同步的实现 程序 task2 两个并发进程,互斥信号灯的值仅取1、0和-1三个值。 main( ) { int mutex=1; ∕* 互斥信号灯 *∕ cobegin pa( ); pb( ); coend } pa( ) pb( ) { { p(mutex); p(mutex); csa ; csb ; v(mutex); v(mutex); } } (3) 信号灯可能的取值 两个并发进程,互斥信号灯的值仅取1、0和-1三个值。 mutex=1 表示没有进程进入临界区; mutex=0 表示有一个进程进入临界区; mutex=-1 表示一个进程进入临界区, 另一个进程等待进入。 47
(4) 例 进程及进程管理——进程互斥与同步的实现 x代表某航班机座号,pa和pb两个售票进程,售票工作是 对变量x加1。试用信号灯的P、V操作实现这两个进程的 互斥。 设:mutex为互斥信号灯,初值为1。 pa( ) pb( ) { { p(mutex); p(mutex); x:=x+1 ; x:=x+1 ; v(mutex); v(mutex); } } 48
3. 两类同步问题的解法 (1) 合作进程的执行次序 进程及进程管理——进程互斥与同步的实现 ① 进程流图 s p1 p8 p5 p2 p9 3. 两类同步问题的解法 (1) 合作进程的执行次序 ① 进程流图 p3 s f p5 p1 p2 p4 p6 p9 p10 p8 p7 进程流图示例 49
② 例:pa、pb、pc为一组合作进程,其进程流图如图所示, 试用信号灯的p、v操作实现这三个进程的同步。 进程及进程管理——进程互斥与同步的实现 ② 例:pa、pb、pc为一组合作进程,其进程流图如图所示, 试用信号灯的p、v操作实现这三个进程的同步。 ⅰ 分析任务的同步关系 任务启动后 pa先执行,当它结束后,pb、pc可以 开始 执行, pb、pc 都执行完毕后,任务终止。 pb pc pa f s ⅱ 信号灯设置 设两个同步信号灯sb、sc分别表示进程pb和pc能否开 始执行,其初值均为0。 3个合作进程 的进程流图 ⅲ 同步描述 pa pb pc p(sb ); p(sc ); v(sb ); v(sc ); 50
进程及进程管理——进程互斥与同步的实现 程序 task4 main( ) { int sb=0; ∕*表示pb进程能否开始执行*∕ s int sc=0; ∕*表示pc进程能否开始执行*∕ cobegin pa( ); pb( ); pc( ); coend } pa( ) pb( ) pc( ) { { { p(sb); p(sc); v(sb); v(sc); } } } pb pc pa f s 3个合作进程 的进程流图 51
(2) 共享缓冲区的合作进程的同步的解法 进程及进程管理——进程互斥与同步的实现 ① 两个进程的任务 计算进程 cp和打印进程 iop公用一个单缓冲,为了完成正确的计算与打印,试用信号灯的p、v操作实现这两个进程的同步。 缓冲区buf iop cp 共享缓冲区的合作进程的同步示意图 ① 两个进程的任务 计算进程cp经过计算,将计算结果送入buf; 打印进程iop把buf中的数据取出打印。 52
当iop进程把buf中的数据取出打印后,cp进程才能把下一个 计算结果数据送入buf中,否则必须等待。 进程及进程管理——进程互斥与同步的实现 ② 分析任务的同步关系 当cp进程把计算结果送入buf时,iop进程才能从buf中取出结 果去打印,否则必须等待。 当iop进程把buf中的数据取出打印后,cp进程才能把下一个 计算结果数据送入buf中,否则必须等待。 ③ 信号灯设置 sa:表示缓冲区中是否有可供打印的 计算结果,其初值为0。 sb:表示缓冲区有无空位置存放新的 信息,其初值为1。 缓冲区buf iop cp 共享缓冲区的合作进程 的同步示意图 53
进程及进程管理——进程互斥与同步的实现 ④ 同步描述 ⑤ 程序描述 cp: iop: p(sa); 产生一个数据; 从buf中取 数据; p(sb); v(sb); 将数据放入buf ; 打印; v(sa); ⑤ 程序描述 缓冲区buf iop cp 共享缓冲区的合作进程 的同步示意图 54
进程及进程管理——进程互斥与同步的实现 程序 task5 main( ) { int sa=0; ∕*表示buf中有无信息 *∕ int sb=1; ∕*表示buf中有无空位置*∕ cobegin cp( );iop( ); coend } cp( ) iop( ) { { while(计算未完成) while(打印工作未完成) { { 得到一个计算结果; p(sa); p(sb); 从缓冲区中取一数; 将数送到缓冲区中; v(sb); v(sa); 从打印机上输出; } } 缓冲区buf iop cp 共享缓冲区的合作进程 的同步示意图 55
4. 生产者——消费者问题 (1) 生产者——消费者问题的例 进程及进程管理——进程互斥与同步的实现 ① 计算进程和打印进程 4. 生产者——消费者问题 (1) 生产者——消费者问题的例 ① 计算进程和打印进程 计算进程 cp不断产生数据,是生产者; 打印进程 iop不断打印数据,是消费者。 ② 通信问题 发消息进程 send不断产生消息,是生产者; 收消息进程 receive不断接收消息,是消费者。 56
(2) 生产者——消费者问题的一般解答 进程及进程管理——进程互斥与同步的实现 ① 生产者——消费者问题图示 ② 生产者与消费者的同步关系 c1 p1 c2 c3 ck p2 p3 pm 生产者——消费者问题示意图 ② 生产者与消费者的同步关系 生产者:当有界缓冲区中无空位置时,要等待; 向有界缓冲区放入物品后,要发消息。 消费者:当有界缓冲区中无物品时,要等待; 从有界缓冲区取出物品后,要发消息。 57
sa : 表示满缓冲区 (即信息)的数目,初值 = 0 ⅱ 一个互斥信号灯—— mutex:表示有界缓冲区是否被占用,初值 = 1 进程及进程管理——进程互斥与同步的实现 c1 p1 c2 c3 ck p2 p3 pm 生产者——消费者问题示意图 ③ 信号灯设置 ⅰ 两个同步信号灯—— sb :表示空缓冲区的数目,初值 = n sa : 表示满缓冲区 (即信息)的数目,初值 = 0 ⅱ 一个互斥信号灯—— mutex:表示有界缓冲区是否被占用,初值 = 1 58
进程及进程管理——进程互斥与同步的实现 ④ 同步描述 生产者: 消费者: p(sa) p(sb); p(mutex); 生产者: 消费者: p(sa) p(sb); p(mutex); p(mutex); 从有界缓冲区中取数据; 将数据放入有界缓冲区; v(mutex); v(mutex); v(sb); v(sa); 消费; 59
进程及进程管理——进程互斥与同步的实现 ⑤ 程序描述 程序 prod_cons main( ) { int sa=0; ∕*满缓冲区的数目*∕ int sb=n; ∕*空缓冲区的数目*∕ int mutex=1; ∕*对有界缓冲区进行操作的互斥信号灯*∕ cobegin p1 ( ); p2 ( );… pm ( ); c1 ( ); c2 ( );… ck ( ); coend } 60
进程及进程管理——进程互斥与同步的实现 pi( ) cj( ) { { while(生产未完成) while(还要继续消费) { { while(生产未完成) while(还要继续消费) p(sa); 生产一个产品; p(mutex); p(sb); 从有界缓冲区中取产品; p(mutex); v(empty); 送一个产品到有界缓冲 v(sb); v(mutex); 消费一个产品; v(sa); } } 61
经典同步问题1:哲学家进餐问题
经典同步问题2:读者写者问题 读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。
问题分析(读者——写者问题) 进程及进程管理——进程互斥与同步的实现 (1)可以有任意多个读者同时读取数据区中的内容; (2)一次只有一个写者允许向数据区中写; (3)写者在向数据区中写时,不允许读者同时读取。 56
(1) 解法1 进程及进程管理——进程互斥与同步的实现 程序描述 main( ) { int readcount; ∕*读者计数*∕ semaphore x = 1,wsem = 1; /*wsem用于控制对文件的写操作,x用于实现对公共变量readcount的访问保护*/ cobegin reader ( ); writer ( ); coend } 57
思考:该解决方案存在何种问题? reader (){ while (true){ writer (){ while (true){ P (x); readcount++; if ( readcount == 1 ) P(wsem); V (x); READUNIT(); P(x); readcount--; if( readcount == 0 ) V(wsem); V(x); } writer (){ while (true){ P (wsem); WRITEUNIT(); V(wsem); } 思考:该解决方案存在何种问题?
进程及进程管理——进程互斥与同步的实现 (2) 解法2:写者优先 程序描述?-请同学们自己写。 57
进程及进程管理——进程通信 进程通信
1. 进程通信的概念 2. 进程通信方式 (1) 消息缓存通信 进程及进程管理——进程通信 1. 进程通信的概念 进程通信是指进程之间直接以较高的效率传递较多数据的信 息交互方式。 2. 进程通信方式 (1) 消息缓存通信 在消息通信中,接收方和发送方之间有明确的协议和消息格式 。 消息缓冲通信方式包括消息缓冲、发送原语和接收原语。 62
(2) 信箱通信 进程及进程管理——进程通信 在信箱通信中,需要定义信箱结构,还包括消息发送 和接收功能模块,提供发送原语和接收原语。 信箱通信中,所使用的信箱可以位于用户空间中,是 接收进程地址空间的一部分;也可以放置在操作系统 的空间中。 63
进程及进程管理——线程概念及特点 线程概念及特点
1. 什么是线程 (1) 线程定义 (2) 线程可以这样来描述 进程及进程管理——线程概念及特点 线程是比进程更小的活动单位,它是进程中的一个执行路 径。 (2) 线程可以这样来描述 进程中的一条执行路径; 它有自己私用的堆栈和处理机执行环境 ; 它与父进程共享分配给父进程的主存; 它是单个进程所创建的许多个同时存在的线程中的一个。 64
2. 线程的特点 进程及进程管理——线程概念及特点 线程是比进程更小的活动单位,它是进程中的一个执行路 径。 创建一个线程比创建一个进程开销要小得多。 实现线程间通信十分方便,因为一个进程创建的多个线程 可以共享地址区域和数据。 线程是一个动态的概念。 在进程内创建多线程,可以提高系统的并行处理能力,加 快进程的处理速度。。 65
进程及进程管理——线程概念及特点 3. 线程的状态变迁 运 行 终止 创建 就绪 等待 线程的状态变迁图 66
进程及进程管理——操作系统的并发机制实例
1. 创建进程及应用实例 (1) 调用形式 进程及进程管理——操作系统的并发机制实例 pid=fork(); 1. 创建进程及应用实例 (1) 调用形式 pid=fork(); 功能:创建一个子进程,被创建的子进程是父进程的进 程映像的一个副本 (除proc结构外),在UNIX系统中,除 了0#进程外,其它进程都是通过调用进程创建系统调用 创建的。 67
(2) 系统调用 fork 完成的操作 进程及进程管理——操作系统的并发机制实例 UNIX/Linux系统的核心为系统调用fork 完成下列操作: ① 为新进程分配一个新的pcb结构; ② 为子进程赋一个唯一的进程标识号 (PID); ③ 做一个父进程上下文的逻辑副本。由于进程的正文区 (代码段) 可被几个进程所共享,所以核心只要增加某个正文区的引用数即可,而不是真的将该区拷贝到一个新的内存物理区。这就意味着父子进程将执行相同的代码。数据段和堆栈段属于进程的私有数据,需要拷贝到新的内存区中。 ④ 增加与该进程相关联的文件表和索引节点表的引用数。这就意味着父进程打开的文件子进程可以继续使用。 ⑤ 对父进程返回子进程的进程号,对子进程返回零。 68
(3) 执行这个程序有两 种可能的结果 进程及进程管理——操作系统的并发机制实例 ① 从子进程返回 打印: “这是子进程的执行程序。” “这是父、子进程的共有执行程序” ② 从父进程返回 打印:“这是父进程执行程序。” 69
进程及进程管理——操作系统的并发机制实例 例: main() {int x; while((x=fork())= = - 1); if(x= =0) printf(“a”); else printf(“b”); printf(“c”); } 结果 ? abcc? bcac? acbc? cabc? 70
进程及进程管理——操作系统的并发机制实例 main() { int child, i=2; if((child=fork()) == –1) {printf("fork error. ");exit();} if(child==0) {i=i+3; printf(“i=%d\n”,i); } i=i+5; 1.fork error 2 . i=5 i=10 i=7 3. i=7 i=5 4. i=5 插入else呢? 71
进程及进程管理——操作系统的并发机制实例 父 子1 子2 父 子1 子2 main( ) { if(fork()==0) { 子1的代码段; {子2的代码段} else { 子1的代码段} } {父代码段} main( ) { if(fork()==0) { 子1的代码段} else {if(fork()==0) {子2的代码段} {父代码段} } 去掉这个else 谁执行这一段? 72
(4) exec-执行文件,启动新程序运行 acd? cad? adc? abdc? adbcc? 进程及进程管理——操作系统的并发机制实例 ① 更换进程执行代码,更换正文段,数据段 ② 调用格式:exec (文件名,参数表,环境变量表) ③ 例 execlp(“max”,15,18,10,0); execvp(“max”,argp) main() { if(fork()==0) { printf(“a”); execlp(“file1”,0); printf(“b”); } printf(“c”); file1: main() { printf(“d”); } acd? cad? adc? abdc? adbcc? 73
2. 创建线程及应用实例 (1) 调用形式 pid=fork(); 2. 创建线程及应用实例 (1) 调用形式 pid=fork(); pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 74
(3) 运行结果? 进程及进程管理——操作系统的并发机制实例 int main(void) { pthread_tid; (2) 程序范例 #include <stdio.h> #include <stdlib.h> #include <pthread.h> void thread(void) { int i; for(i=0;i<3;i++) printf("This is a pthread.\n"); } int main(void) { pthread_tid; int i,ret; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!\n"); exit (1); } for(i=0;i<3;i++) printf("This is the main process.\n"); pthread_join(id,NULL); return (0); (3) 运行结果? 75
3. 等待进程、线程的终止及其应用 (1) 等待进程终止 进程及进程管理——操作系统的并发机制实例 wait(); waitpid(); 3. 等待进程、线程的终止及其应用 (1) 等待进程终止 wait(); waitpid(); ① wait() 语法格式 pid=wait(stat_addr); wait()函数使父进程暂停执行,直到它的一个子进程结束为 止,该函数的返回值是终止运行的子进程的PID。参数status 所指向的变量存放子进程的退出码,即从子进程的main函 数返回的值或子进程中exit()函数的参数。如果status不是一 个空指针,状态信息将被写入它指向的变量。 76
进程及进程管理——操作系统的并发机制实例 ② waitpid() 语法格式 pid=wait(stat_addr); waitpid(pid_t pid,int * status,int options) 用来等待子进程的结束,但它用于等待某个特定进程结束。 参数pid指明要等待的子进程的PID,参数status的含义与 wait()函数中的status相同。 77
(2) wait--等待子进程结束 与 exit---终止进程的使用 方法 进程及进程管理——操作系统的并发机制实例 (2) wait--等待子进程结束 与 exit---终止进程的使用 方法 ① 例1 main( ) { int n; …. if(fork()==0) {printf(“a”); exit(0); } wait(&n); printf(“b”); printf(“c”); 78
进程及进程管理——操作系统的并发机制实例 ② 例2 ⅰ程序 main() { int p1,p2,p3,p4,p5,pp1,pp2; printf(“程序开始执行”); if ((p1=fork( )== 0) { printf(“进程proc1执行”); exit(1); } else if ((p2=fork() )== 0) { printf(“进程proc2执行”); } pp1=wait(&pp1); /* 等待,直到子进程终止 */ pp2=wait(&pp2); /* 等待,直到子进程终止 */ 79
if ((p3=fork())== 0){ 进程及进程管理——操作系统的并发机制实例 printf(“进程proc3执行”); } else exit(1); } printf(“整个程序终止“); exit(0); 80
进程及进程管理——操作系统的并发机制实例 ⅱ 试回答如下问题 a. 画出描述子进程执行先后次序的进程流图。(各进程 分别用其对应的函数名或包含其进程号的符号名标识)。 b. 这个程序执行时最多可能有几个进程同时存在?同时 存在的进程数最多时分别是哪几个进程? c. 程序执行时,“整个程序终止”被输出几次?分别是 哪些进程输出的? 81
进程及进程管理——操作系统的并发机制实例 ⅲ 问题答案 a. p3 p4 F p2 S p1 p5 子进程进程执行的流图图 b. 最多4个进程同时存在,分别是main、p3、p4、p5 。 c. 3次,main、p3、p4 。 82
进程及进程管理——操作系统的并发机制实例 ③ 应用实例1 #include <sys/types.h> #include <sys/wait.h> int main () { pid_t pid; int status; pid=fork(); if (pid==0) { p6();exit(); } else{ if (pid==0 ) { p5();exit(); } wait(&status); p7(); s f p5 p6 p7 3个合作进程 的进程流图 83
进程及进程管理——操作系统的并发机制实例 ④ 应用实例2 #include <stdio.h> #include <pthread.h> int A; void subp1() { printf("A in thread is %d\n",A); A = 10; } main() pthread_t p1; int pid; A = 0; 84
进程及进程管理——操作系统的并发机制实例 pid = fork(); if (pid==0) { printf("A in son process is %d\n",A); A=100; exit(0); } wait(); pthread_create(&p1,NULL,subp1,NULL); pthread_join(p1,NULL); printf("A in father process is %d\n",A); 运行结果? A in son process is0 A in thread is 0 A in father process is 10 85
进程及进程管理——操作系统的并发机制实例 4. 信号量及其使用方法 Linux信号量函数在通用的信号量数组上进行操作,而不是在一个单一的信号量上进行操作。这些系统调用主要包括:semget、semop和semctl。 (1) 信号量的创建 ① 功能 创建一个新的信号量或是获得一个已存在的信号量键值。 86
进程及进程管理——操作系统的并发机制实例 ② 原型 int semget(key_t key, int num_sems, int sem_flags)键值 ⅰ 参数key是一个用来允许多个进程访问相同信号量的整数值,它们通过相同的key值来调用semget。 ⅱ 参数num_sems参数是所需要的信号量数目。Semget创建的是一个信号量数组,数组元素的个数即为num_sems。 ⅲ sem_flags参数是一个标记集合,与open函数的标记十分类似。低九位是信号的权限,其作用与文件权限类似。另外,这些标记可以与 IPC_CREAT进行或操作来创建新的信号量。一般用:IPC_CREAT | 0666 87
(2) 信号量的控制 进程及进程管理——操作系统的并发机制实例 原型 int semctl(int sem_id, int sem_num, int command, ...) ⅰ 参数sem_id,是由semget所获得的信号量标识符。 ⅱ 参数sem_num参数是信号量数组元素的下标,即指定 对第几个信号量进行控制。 ⅲ command参数是要执行的动作,有多个不同的ommand 值可以用于semctl。常用的两个command值为: SETVAL: 用于为信号量赋初值,其值通过第四个参数指定。 IPC_RMID:当信号量不再需要时用于删除一个信号量标识。 88
(3) 信号量的操作 进程及进程管理——操作系统的并发机制实例 ⅳ 如果有第四个参数,则是union semun,该联合定义如 下: int val; struct semid_ds *buf; unsigned short *array; } (3) 信号量的操作 ① 原型 int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops) 89
进程及进程管理——操作系统的并发机制实例 ⅰ 参数sem_id,是由semget函数所返回的信号量标识符。 ⅱ 参数sem_ops是一个指向结构数组的指针,该结构定义如下: ⅲ num_sem_ops 操作次数,一般为1 struct sembuf { short sem_num; //数组下标 short sem_op; //操作,-1或+1 short sem_flg; //0 } 90
进程及进程管理——操作系统的并发机制实例 ② P操作 void P(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; //:操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1); //1:表示执行命令的个数 return; } 91
进程及进程管理——操作系统的并发机制实例 ③ V操作 void P(int semid,int index) void V(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); return; } 92
5. 共享内存 (1) 功能 进程及进程管理——操作系统的并发机制实例 共享内存允许两个或更多进程访问同一块内存,就如同 5. 共享内存 (1) 功能 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区 域的指针。当一个进程改变了这块地址中的内容的时候, 其它进程都会察觉到这个更改。 93
(2) 共享内存创建 进程及进程管理——操作系统的并发机制实例 int shmget(key_t key,int size,int shmflg) 其中: ① key: 键值,多个需要使用此共享内存的进程用相同的 key来创建 ② shmflg: IPC_CREAT|0666 94
(3) 共享内存绑定 进程及进程管理——操作系统的并发机制实例 int shmget(key_t key,int size,int shmflg) int shmat ( int shmid, char *shmaddr, int shmflg) 其中: ① shmid:共享内存句柄,shmget调用的返回值; ② shmaddr:一般用NUL; ③ shmflg: SHM_R|SHM_W S = (char *)shmat(shmid1,NULL,SHM_R|SHM_W) 一旦绑定,对共享内存的操作即转化为对局部变量S的操 作。 95
(4) 共享内存的释放 进程及进程管理——操作系统的并发机制实例 系统调用格式:int shmctl(shmid,cmd,buf); 其中: shmid:共享内存句柄,shmget调用的返回值; cmd:操作命令shmctl(shmid,IPC_RMID,0) 96
进程及进程管理——进程调度 进程调度
1. 调度 ∕ 分派结构 (1) 调度 (2) 分派 进程及进程管理——进程调度 在众多处于就绪状态的进程中,按一定的原则选择一个 进程。 1. 调度 ∕ 分派结构 (1) 调度 在众多处于就绪状态的进程中,按一定的原则选择一个 进程。 (2) 分派 当处理机空闲时,移出就绪队列中第一个进程,并赋予 它使用处理机的权利。 97
(3) 调度分派结构图 进程及进程管理——进程调度 ready_q scheduler susp wakeup receive L pcb6 pcb4 pcb3 pcb2 pcb1 dispatcher CPU 调度/分派结构示意图 98
2. 进程调度的功能 (1) 进程管理的数据结构 (2) 决定调度策略 (3) 实施处理机的分配和回收 进程及进程管理——进程调度 2. 进程调度的功能 (1) 进程管理的数据结构 (2) 决定调度策略 ① 优先调度 就绪队列按进程优先级高低排序 ② 先来先服务 就绪队列按进程来到的先后次序排序 (3) 实施处理机的分配和回收 99
3. 进程调度的方式 (1) 什么是调度方式 (2) 非剥夺方式 (3) 剥夺方式 进程及进程管理——进程调度 3. 进程调度的方式 (1) 什么是调度方式 当一进程正在处理机上执行时,若有某个更为“重要而紧迫”的进程需要运行,系统如何分配处理机。 (2) 非剥夺方式 当“重要而紧迫”的进程来到时,让正在执行的进程继续执行,直到该进程完成或发生某事件而进入“完成”或“阻塞”状态时,才把处理机分配给“重要而紧迫”的进程。 (3) 剥夺方式 当“重要而紧迫”的进程来到时,便暂停正在执行的进程,立即把处理机分配给优先级更高的进程。 100
4. 进程调度算法 (1) 进程优先数调度算法 进程及进程管理——进程调度 ① 什么是进程优先数调度算法 4. 进程调度算法 (1) 进程优先数调度算法 ① 什么是进程优先数调度算法 预先确定各进程的优先数,系统把处理机的使用权赋予就 绪队列中具备最高优先权 (优先数和一定的优先级相对应) 的就绪进程。 ② 优先数的分类及确定 ⅰ 静态优先数 在进程被创建时确定,且一经确定后在整个进程运行 期间不再改变。 101
进程使用CPU超过一定数值时,降低优先数 进程I/O操作后,增加优先数 进程等待时间超过一定数值时,提高优先数 进程及进程管理——进程调度 ⅱ 静态优先数的确定 优先数根据进程所需使用的资源来计算 优先数基于程序运行时间的估计 优先数基于进程的类型 ⅲ 动态优先数 进程优先数在进程运行期间可以改变。 ⅳ 动态优先数的确定 进程使用CPU超过一定数值时,降低优先数 进程I/O操作后,增加优先数 进程等待时间超过一定数值时,提高优先数 102
(2) 循环轮转调度算法 进程及进程管理——进程调度 ① 什么是循环轮转调度算法 时间片用完时,该进程转为就绪态并进入就绪队列末端。 当CPU空闲时,选取就绪队列首元素,赋予一个时间片,当 时间片用完时,该进程转为就绪态并进入就绪队列末端。 该队列排序的原则是什么? pcb1 pcb2 pcbn CPU 完成 简单循环轮转调度算法示意图 103
进程及进程管理——进程调度 ② 简单循环轮转调度算法 就绪队列中的所有进程以等速度向前进展。 q = t/n ③ 循环轮转调度算法的发展 可变时间片轮转调度 多重时间片循环调度 104
5. 调度用的进程状态变迁图 (1) 一个调度用的进程状态变迁图的实例 进程及进程管理——进程调度 运行 时间片到 请求I/O 进程调度 5. 调度用的进程状态变迁图 (1) 一个调度用的进程状态变迁图的实例 运行 首先选择 100ms 因 I∕O 而等待 高优先 就绪 低优先 进程调度 时间片到 请求I/O I/O完成 其次选择 500ms 调度用的进程状态变迁图 105
(2) 调度用进程状态变迁图实例的分析 进程及进程管理——进程调度 ① 进程状态 运行状态 低优先就绪状态 高优先就绪状态 因I/O而等待状态 ② 队列结构 低优先就绪队列 高优先就绪队列 因I/O而等待队列 106
ⅰ 当CPU空闲时,若高优先就绪队列非空,则从高优先就 绪队列中选择一个进程运行,分配时间片为100ms。 进程及进程管理——进程调度 ③ 进程调度算法 优先调度与时间片调度相结合的调度算法 ⅰ 当CPU空闲时,若高优先就绪队列非空,则从高优先就 绪队列中选择一个进程运行,分配时间片为100ms。 ⅱ 当CPU空闲时,若高优先就绪队列为空,则从低优先就 绪队列中选择一个进程运行,分配时间片为500ms。 ④ 调度效果 优先照顾I∕O量大的进程;适当照顾计算量大的进程。 107
(3) 较复杂进程状态变迁的讨论 进程及进程管理——进程调度 变迁1 → 变迁3 变迁1 → 变迁4 变迁2 → 变迁3 运行 5 1 4 因 I∕O 而等待 高优先 就绪 低优先 3 4 5 1 2 进程状态变迁图 变迁1 → 变迁3 变迁1 → 变迁4 变迁2 → 变迁3 108
进程及进程管理——小结 第4章 进程及进程管理 小结
进程及进程管理——小结 进程概念 进程引入 程序的顺序执行 定义 特点 程序的并发执行 定义 特点 进程定义 定义 进程与程序的区别 程序的顺序执行 定义 特点 程序的并发执行 定义 特点 进程定义 定义 进程与程序的区别 进程状态 三个基本状态、状态变迁图 不同操作系统类型的进程状态变迁图 进程描述 PCB的定义与作用 进程的组成 线程定义 109
进程及进程管理——小结 进程控制 进程的相互制约关系 进程控制原语 基本进程控制原语 进程控制原语的执行与进程状态的变化 进程创建、进程撤销原语的功能 进程等待、进程唤醒原语的功能 进程的相互制约关系 进程互斥 临界资源 互斥 临界区 110
进程及进程管理——小结 进程同步机构 进程同步与互斥的实现 进程同步 进程同步的概念 进程同步的例 锁、上锁原语、 开锁原语 信号灯及P、V操作 进程同步与互斥的实现 用信号灯的P、V操作实现进程互斥 两类同步问题的解答 合作进程的执行次序 共享缓冲区的合作进程的同步 生产者——消费者问题及解答 111
进程及进程管理——小结 操作系统的并发控制机制 创建进程、创建线程及其使用 等待进程、线程的终止及其使用 信号量与使用方法 共享内存与使用方法 进程调度 进程调度的功能 调度方式 非剥夺方式 剥夺方式 常用的进程调度算法 调度用的进程状态变迁图的分析 112