版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第三章 进程管理 主讲主讲 廖俊廖俊 2 第三章 进程管理 n进程的定义与控制 n进程调度 n进程间的相互作用 n进程通信 n线程 nUNIX和Windows的进程和线程模型 3 3.1 进程的引入 n在早期计算机系统中,多道程序设计还 未出现之前,程序是顺序执行的。多道 程序设计出现后,操作系统可以实现多 个进程的并发执行。 n进程(process)一词在20世纪60年代初 首先出现的MIT的MULTICS系统中。 n进程是程序的一次执行,多个进程可以 并发执行。 4 3.1 进程的引入 n程序的顺序执行和并发执行 程序的执行有两种方式:顺序执行和并发 执行。顺序执行是单道批处理系统的执
2、行方式, 也用于简单的单片机系统;现在的操作系统多 为并发执行,具有许多新的特征。引入并发执 行的目的是为了提高资源利用率。 n程序顺序执行:程序在计算机上严格按 照写入的顺序执行。 5 3.1 进程的引入 n顺序执行的特征 顺序性:CPU严格按照程序结构所指定的次 序执行,程序的每一步都必须在上一步执行 后才能开始。 封闭性:独占全部资源,资源的状态只能由 该程序本身改变,不受其它程序和外界因素 影响。 可再现性:如果程序执行环境和初始条件相 同,则其执行的结果相同。 6 3.1 进程的引入 n多道程序设计:把一个以上的程序放入内存中,并 且同时处于运行状态,这些程序共享CPU和其它资源。
3、特点如下: 多道:内存中有多道程序,它们在任一时刻必须处 于就绪、运行、阻塞三种状态。 宏观上并行:从宏观上看,它们在同时执行。 微观上串行:从微观上看,它们在交替、穿插执行。 7 3.1 进程的引入 n多道程序设计优点: CPU利用率高。 设备利用率高。 系统吞吐量大。 P1 P2 t I/O CPU 两个进程执行示意图 8 3.1 进程的引入 n并发执行的特征: 失去封闭性:共享资源,程序之间互相制约。 出现相互制约关系:虽然每个程序还是一个相对独立的实体, 单由于程序的并发执行,使得一个程序的顺序执行要依赖于 其他程序的执行结果,这样就形成了相互制约的关系。 间断性:程序之间的制约关系致
4、使程序执行时间不连贯。 不可再现性:失去封闭性,也就失去了可再现性,程序执行 的结果随速度、环境的不同而不同。 程序于计算的不一致 可见,并发和并行是不同的概念:并行是并发的特例, 并发是并行的拓展。 9 T1 begin 按乘客需要查找到Hi; R1:Hi; if R1=1 then begin R1:=R1-1; Hi:=R1; 售出一张票; end else 提示票已售 完; end T2 begin 按乘客需要查找到Hi; R2:Hi; if R2=1 then begin R2:=R2-1; Hi:=R2; 售出一张票; end else 提示票已售 完; end 初始Hi=1时不同
5、执行序列,结果各不相同 执行序列12 程序 Hi:=R1 T2 R1:=R1-1 T2 结果 T1:售出一张票 T2:票已售完 Hi0 T2:售出一张票 T1:售出一张票 Hi1 例子:观察者与报告者 10 3.1 进程的引入 综上所述,由于程序的并发执行破 坏了程序的封闭性和可再现性,使得程 序和程序的执行不再一一对应,因此, 程序这个静态的概念已经不能切实反映 程序执行的各种特征。 于是,引入“进程”,能够反映程序 执行的独立性、并发性和动态性等特征。 11 3.2 进程定义与控制 n进程定义 进程是程序的一次执行 进程是可以和别的计算并发执行的计算 进程是定义在一个数据结构上并能在其上进
6、 行操作的一个程序 进程是程序在一个数据集合上运行的过程, 它是系统进行资源分配和调度的一个独立单 位 12 3.2 进程定义与控制 n进程与程序的区别 进程是动态的,程序是静态的:程序是有序代码的 集合,属于静态的文本概念;进程是程序的一次执行。 进程是并发的,会相互制约,程序是顺序的。 进程是暂时的,程序的永久的:进程是一个状态变 化的过程,程序可长久保存。 进程与程序的组成不同:进程的组成包括程序、数 据和进程控制块(即进程状态信息)。 进程与程序的对应关系:通过多次执行,一个程序 可对应多个进程;通过调用关系,一个进程可包括 多个程序。 13 3.2 进程定义与控制 进程:是程序的一次
7、执行,该程序 可与其它程序并发执行;它是一个动态 实体,在传统的操作系统设计中,进程 既是基本的分配单位,也是基本的执行 单位。 14 3.2 进程定义与控制 n进程组成:有程序段、数据段和进程控 制块(PCB)组成。 程序和数据是进程存在的物理基础,是进程 的实体 进程控制块是进程的灵魂,是进程存在的唯 一标志 操作系统为进程创建进程控制块和分配地址 空间的过程就是进程创建的过程 15 3.2 进程定义与控制 n进程控制块:是操作系统用来记录进程 详细状态和相关信息的基本数据结构, 包括进程的标识信息、状态信息和控制 信息。 标识信息:唯一的标识一个进程,主要有进 程标识、用户标识和父进程标
8、识。 状态信息:与CPU有关的各种现场信息,包 括寄存器状态、堆栈指针。以便该进程重新 占用CPU后能够继续执行。 16 3.2 进程定义与控制 控制信息:操作系统对进程进行调度管理时 用到的信息。主要有进程状态、调度信息、 队列指针、资源占有使用信息等。 n进程控制块的组织方式 PCB在内存中是以表的形式存在的PCB表。 还可以将相同性质的进程组织在一张表中, 形成多个索引表。 有些操作系统将PCB分为常驻内存和非常驻 内存两部分,如UNIX。 17 3.2 进程定义与控制 n进程基本状态 运行态(Running):进程已经获得所需资 源,并占有CPU 就绪态(Ready):已经获得所需资源
9、,只 等待CPU 阻塞态(Blocked):也称为等待态、挂起 态或睡眠态等,进程等待某个事件,如等待 I/O完成,等待某个资源 此外,还可以有新建态、终止态。 18 3.2 进程定义与控制 n进程状态的转换 新建终止 就绪阻塞 运行 创建完毕 时间片用完 结束执行 选中 等待事件 等待结束 19 七状态进程模型七状态进程模型 活动活动 挂起挂起 事件事件 发生发生 事件事件 发生发生 等待等待 事件事件 挂起挂起 调度调度 超时超时 释放释放 活动活动 挂起挂起 20 21 PCB1 PCB2 PCB3 PCB4 PCB5 PCB6 PCB7 PCBn . 空空 PCBPCB 运行态运行态
10、就绪态就绪态 等待等待1 1 等待等待2 2 6 7 5 10 15 进程控制块进程控制块(Process Control Block) 22 3.2 进程定义与控制 n进程控制创建和撤销进程以及实现进程的状 态转换。通过原语(Primitive)操作实现 原语是指由机器指令构成的可完成特定功能的程序段。它是 一个机器指令的集合,在执行时不能被中断。多采用屏蔽中 断方法实现。随着计算机技术的发展,还可以将原语固化。 进程控制原语有: v进程创建原语(create primitive) v进程撤消原语(destroy primitive) v进程阻塞原语(block primitive) v进程
11、唤醒原语(wakeup primitive) v进程挂起原语(suspend primitive) v进程激活原语(active primitive) 23 3.2 进程定义与控制 n进程关系的树型结构 A A22A21A11 A2 A1 24 3.2 进程定义与控制 n进程关系的树型结构 主要优点 v资源分配严格:子进程仅能分配到父进程所拥有 的资源,用完后归还。 v进程控制灵活:可根据需要给进程以不同的控制 权限。 v进程结构清楚,关系明确。 25 3.2 进程定义与控制 n进程特征 动态性:“执行”、“计算”、“运行过程” 都强调动态性,进程的最基本特征。 并发性:进程的重要特征,同时也
12、是操作系 统的重要特征。 异步性:进程按各自独立的不可预知的速度 向前推进,即进程按异步方式进行,这导致 了进程执行的不可再现性,因此,操作系统 必须采用某些措施来限制各进程推进序列以 保证各程序间正常协调运行。 26 3.2 进程定义与控制 n进程特征 独立性:进程是一个独立运行的基本单位, 即是一个独立获得资源和独立调度的单位。 制约性:一个进程的执行可能依赖其他进程 的执行结果。 结构性:每个进程有固定结构,包括程序、 数据和PCB三部分。 27 3.3 进程调度 n进程调度属于低级调度,就是从就绪队列中, 按照一定的算法选择某个进程占用CPU。 n进程调度时机 现运行进程或者因任务完成
13、而正常结束,或者因错 误而异常结束 现运行进程因某种原因,比如I/O请求,从运行态进 入阻塞状态 现运行进程执行某种原语操作,如P操作、阻塞原 语等,进入阻塞状态 一个具有更高优先数的进程要求CPU,即已进入就 绪队列 分配给该进程运行的时间片已用完 28 3.3 进程调度 n确定调度算法的原则: 面向系统性能 v公平性:每个进程都有机会执行 v较大的吞吐量:单位时间处理的进程数最多 面向用户性能 v及时性:及时相应用户请求 v较短的周转时间:从提交到完成需要的周转时间 最短 29 3.3 进程调度 n进程调度算法 先来先服务进程调度算法(FCFS) 基于优先数的进程调度算法:数值大的优先级高
14、, 分为 v静态优先数法:进程创建时就规定好优先数 v动态优先数法:优先数在执行过程中根据情况改变,例如 UNIX 时间片轮转进程调度算法:系统规定一定的时间长 度作为进程运行的时间,如果进程在这段时间内执 行不完,就得让出CPU v固定时间片 v可变时间片 v时间片的选取:考虑系统响应时间,就绪进程数和CPU计 算能力 多级队列轮转调度算法 30 多级队列轮转调度算法 最高优先级队列 次高优先级队列 低优先级队列 CPU 进 程 进 入 运行结束 撤消 降低优先级 就绪进程 31 3.3 进程调度 n进程调度方式: 当一个进程正在CPU上运行时,若有一 个更为紧迫或更为重要的进程需要进行 处
15、理,或者说,如果有更高优先数的进 程进入就绪队列时,如何分配CPU。通 常有两种方式: 不可剥夺方式(不可抢占方式,non- preemptive) 可剥夺方式(可抢占方式,preemptive) 32 3.4 进程间的相互作用 n同步:相互协作的进程共同完成一个任务时, 一个进程的某个操作与协作进程的某个操作之 间在时序上有一定的关系。如果协作进程的某 个操作没有完成,那么该进程就要等待这个操 作完成才能继续下去,这种需要相互合作、协 同工作的进程之间的相互关系称为进程的同步。 n临界资源(独占资源):指在一段时间内只允 许一个进程访问的资源。 n互斥:当两个或两个以上进程竞争同一临界资 源
16、时,进程间的制约关系称为进程的互斥。 33 3.4 进程间的相互作用 n进程间的同步 司机和售票员的同步 正常行驶 开车 到站停车 关车门 开车门 售票员 售票 司机 34 3.4 进程间的相互作用 又如,有用户作业程序,其形式为: Z=fun1(x)*fun2(y) 其中,fun1(x)和fun2(y)均是一个复杂函数, 为了加快本题的计算速度,可用两个进程P1、 P2各计算一个函数。进程P2计算fun2(y),进程 P1计算完fun1(x)之后,与进程P2的计算结果相 乘,以获得最终结果Z。 35 3.4 进程间的相互作用 结束 置计算完标志 P2 计算fun2(y) N 计算fun1(x
17、) 取用P2计算结果 P1 P2算完fun2(y) Y 36 3.4 进程间的相互作用 n进程的互斥 互斥使用资源 进程A (阻塞) 请求资源R 进程B 释放资源R 请求资源R (使用R) 释放资源R R 分配拒绝 唤醒 37 进程间的制约进程间的制约 n进程间的联系 n进程间同步:相互协作的进程要共同完成一 个任务,它们之间要相互配合,需要在一些 动作间进行同步,即一个进程的某个动作与 协作进程的某些动作之间在时序上有一定的 关系。 n进程间互斥:当两个或两个以上的进程竞争 同时只能被一个进程使用的资源时,例如竞 争使用打印机,需要互斥使用该资源。 进程的同步、互斥机制进程的同步、互斥机制信
18、号量及信号量及P.VP.V操作操作 38 由于各进程要求共享资源,而有些资源需要互斥使 用,因此各进程间竞争使用这些资源,进程的这种 关系为进程的互斥. 临界资源:critical resource 系统中某些资源一次只允许一个进程使用,称这 样的资源为临界资源或互斥资源或共享变量 临界资源可以是一些硬件设备(如打印机、磁带 机或绘图仪等),也可以是进程共享变量、数据、 队列、或使用权限等“有形”或“无形”的资源。 进程的互斥(间接制约)进程的互斥(间接制约)mutual exclusionmutual exclusion 39 n临界区(互斥区):critical section n一个程序
19、片段的集合,这些程序片段分散在 不同的进程中,对某个共享的数据结构(共 享资源)进行操作. n在进程中涉及到临界资源的程序段叫临界区. n多个进程的临界区称为相关临界区. 临界区(互斥区):临界区(互斥区):critical sectioncritical section 40 临界区临界区( critical sectioncritical section ) 进程的互斥进程的互斥 (间接作用)(间接作用) 41 与时间有关的错误与时间有关的错误 n 由于现在操作系统中的进程是并发执行的,各 进程以自己的速度向前推进,所以,运行的顺序可能 是: n n P1:R1 = count; n P2
20、:R2 = count; n P1:R1 = R1 + 1; n P1:count = R1; n P2:R2 = R2 +1; n P2:count = R2; 错误:错误:P1,P2 P1,P2 执行的结果执行的结果countcount只加了只加了1 1 42 程 序 段1程 序 段2程 序 段n 共 享 变 量 临界区临界区 43 使用互斥区的原则使用互斥区的原则 n(1)当有若干个进程要求进入临界区时,应 使一个进程进入临界区,它们不应相互等 待而使谁都不能进入,即进程不能无限地 停留在等待临界资源的状态。 n(2)一次只允许一个进程进入临界区中,即 各进程互斥访问临界资源。 n(3)
21、各进程使用临界资源的时间是有限的, 即任何一个进程都必须在有限的时间内释 放所占资源。 44 解决进程互斥的方法解决进程互斥的方法 n解决进程互斥的方法有硬件方法和软件方法。软件方法中比较 著名的有Dekker算法和Peterson算法。 nDekker算法 设置一个整型变量turn,指示允许进入临界区的进程标识。 假设现有两个进程P1和P2,当turn的值为1时,P1被允许进入; 当turn的值为2时,P2被允许进入。进程退出临界区时,要把 turn的值改为对方的标识符,就等于允许对方的进入。缺点: 不考虑进程的需要,强制进入临界区。 nPeterson算法 它除设置整型变量turn外,还为
22、每一个进程设置一个标志,指 示该进程是否要求进入临界区。假设还是两个进程,都在等待 进入临界区。先检查对方的标志,如果不在临界区,则检查 turn的值,以确定是否可以进入。 软件方法的缺点:反复测 试共享变量的值,浪费时间和资源,产生“忙等待”。 45 解决进程互斥的方法解决进程互斥的方法 n“开关中断”指令,也称硬件锁。进入临界 区前执行“关中断”。进程结束执行“开中 断”。 n“交换”指令。为每个共享变量定义一个全 局变量,为每个进程定义一个局部变量,进 入临界区时,二者都为1,退出时都置0。 n“测试与设置”指令。设置一个布尔变量称 为“锁”。当一个进程进入临界区时,先测 试该变量的值,
23、以确定是否可以进入,退出 时,修改该变量的值。 46 3.4 进程间的相互作用 n信号量(semaphore)与P、V操作 Edsgar Wybe Dijkstra(埃德斯加狄克斯 特拉) v1972年ACM图灵奖(ACM Turing Award) 获得者 v“一个程序的易读性和易理解性同其中所 包含的无条件转移控制的个数成反比关 系。” v提出结构化程序设计思想 47 3.4 进程间的相互作用 48 信号量及信号量及P.VP.V操作操作 n信号量(Semaphore)是表示资源的实体,是 一个与队列有关的整型变量,其值仅能由P、V 操作改变。 n信号量分为:公用信号量和私用信号量。 n公用
24、信号量:用于实现进程间的互斥,初值通 常设为1,它所联系的一组并行进程均可对它 实施P、V操作; n私用信号量用于实现进程间的同步,初始值通 常设为0或n,允许拥有它的进程对其实施P操 作。 49 信号量:信号量:semaphoresemaphore n信号量数据结构定义如下: struct semaphore int value; pointer_PCB queue; n信号量说明: semaphore s; 50 P P、V V操作操作 P(s) s.value = s.value - 1; if (s.value 0) 该进程状态置为等待状态; 将该进程的PCB插入相应的等待队列末尾 s
25、.queue; 51 P P、V V操作操作 V(s) s.value = s.value + 1; if (s.value = 0时,其值表示还有可用的 资源数; ns.value 0 时,其绝对值表示有多少 个进程因申请该信号量表示的资源,得 不到而进入阻塞态; 53 用用P P、V V操作解决进程间互斥问题操作解决进程间互斥问题 P(S) V(S) P1P2P3 互斥区互斥区 P(S) P(S) V(S) V(S) 设信号量设信号量:s=1;:s=1; 申请进入申请进入 临界区临界区 退出退出临临 界区界区 54 进程互斥进程互斥 执行序列:执行序列:P2P2 55 执行序列:执行序列:
26、P2P2(就绪)(就绪)-P1-P1(阻塞)(阻塞)- - 进程互斥进程互斥 56 进程互斥进程互斥 执行序列:执行序列:P2P2(就绪)(就绪)-P1-P1(阻塞)(阻塞)- - P3(阻塞)(阻塞) 57 进程互斥进程互斥 执行序列:执行序列:P2P2(就绪)(就绪)-P1-P1(阻塞)(阻塞)- - P3(阻塞)(阻塞)- P2 58 执行序列:执行序列:P2P2(就绪)(就绪)-P1-P1(阻塞)(阻塞)- - P3(阻塞)(阻塞)- P2-P1 进程互斥进程互斥 59 进程互斥进程互斥 执行序列:执行序列:P2P2(就绪)(就绪)-P1-P1(阻塞)(阻塞)- - P3(阻塞)(阻塞
27、)- P2-P1-P3 信号量变化范围:信号量变化范围:, , , , 即(即(-n-n) 60 进程互斥举例(进程互斥举例(1 1) 例2,上述的“飞机订票系统”。一个飞机订票系 统可以有多个订票处的n个订票终端。现假设n=2, 公共数据区为Hi(i=1,2,,m),分别存放各次 班机的现存票数, Pi(i=1,2,n)表示售票终端 的进程。 61 进程互斥举例(进程互斥举例(2 2) semaphore S; nS = 1; / 公用信号量 ncobegin n n process Pi (i=1,2,n) n n int temp; n 按照定票要求找到单元Hi; n P(S); n t
28、emp = Hi ; if temp 1 temp =temp -1; Hi = temp; V(S); 输出一张票 else V(S); 输出提示“票已售完”; coned 62 3.4 进程间的相互作用 生产者-消费者问题 生产者消费者 一次只能放或取一个产品 放产品取产品 63 3.4 进程间的相互作用 同步问题: vP进程(生产者)不能往“满”的缓 冲区放产品 vQ进程(消费者)不能从“空”的缓 冲区取产品 64 3.4 进程间的相互作用 单缓冲区、一个生产者和一个消费者:设置 私用信号量为S1,S2,初值为1,0 生产者进程P while(true) 生产一件产品; P(S1);/*
29、申请一个空缓冲区*/ 放入一件产品; V(S2); /*释放缓冲区*/ 消费者进程Q while(true) P(S2); /*申请一个满缓冲区*/ 拿出一件产品; V(S1); 消费产品; 65 3.4 进程间的相互作用 n个缓冲区、一个生产者和一个消费者:设 置私用信号量为S1,S2,初值为n,0 生产者进程P while(true) 生产一件产品; P(S1);/*申请一个空缓冲区*/ 放入一件产品; V(S2); /*释放缓冲区*/ 消费者进程Q while(true) P(S2); /*申请一个满缓冲区*/ 拿出一件产品; V(S1); 消费产品; 66 3.4 进程间的相互作用 n
30、个缓冲区、k个生产者和m个消费者:增加互斥信 号量mutex,初值为1,并设S1,S2,初值分别为n 和0。 生产者进程P while(true) 生产一件产品; P(S1);/*申请一个空缓冲区*/ P(mutex); 放入一件产品; V(mutex); V(S2); /*释放缓冲区*/ 消费者进程Q while(true) P(S2); /*申请一个满缓冲区*/ P(mutex); 拿出一件产品; V(mutex); V(S1); 消费产品; 两个P操作交换? 67 3.4 进程间的相互作用 n用P,V操作实现司机售票员同步:设置信号 量S1,S2,初值均为0 司机进程 while(tru
31、e) 正常行驶; 到站停车; V(S2); P(S1); 离站开车; 售票员进程 while(true) 售票; P(S2); 开车门; 关车门; V(S1); 68 3.4 进程间的相互作用 n用P,V操作实现进程同步的模型 P1 . P(S) . P2 . V(S) . 69 3.4 进程间的相互作用 n对P,V操作的使用应注意: P,V操作都是成对出现的:互斥操作时,它们在同 一进程中;同步操作时,它们处于不同的进程。 在进程中,P操作的位置和次序至关重要。一般情 况下,对互斥信号量的P操作在后。而V操作没有特 别的限制。 nP,V操作的优点是:原语完备,表达能力 强,可以解决任何同步和
32、互斥问题;缺点是 不够安全,实现复杂。 70 3.4 进程间的相互作用 n读者、写者问题 多个读进程可以同时共享资源,但不能和 写进程共享;写进程之间互斥,访问时必须独 占资源。需设置一个全局变量对读进程进行计 数,当第一个读进程开始进行访问时执行P操 作,当最后一个读进程结束访问时执行V操作。 现假设读者优先。使用readnum对读者计 数,初值为0;mutex是对readnum进行互斥操 作的信号量,初值为1;write是写信号量,初 值为1。 71 3.4 进程间的相互作用 读者进程 begin P(mutex); readnum=readnum+1; if (readnum=1) P(
33、write); V(mutex); read file; P(mutex); readnum=readnum1; if (readnum=0) V(write); V(mutex); end 写者进程 begin P(write); write file; V(write); end 第一个读者来执行P操作 最后一个读者来执行V操作 72 3.4 进程间的相互作用 前面程序中,写者会出现“饥饿” 现象,可以设计另一种算法,使写者优 先,即当有进程读文件时,如果有写进 程请求写,那么新的读进程被拒绝,待 现有读进程读完后,立即让写进程开始 运行,当无写进程运行时才让读进程运 行。 设置信号量S实
34、现读者与写者或写者 之间的互斥,初值为1;用信号量Sn限制 系统中最多n个进程,初值为n。 73 3.4 进程间的相互作用 读者进程Pi(i=1,2,.,n) begin P(S); P(Sn); V(S); read file; V(Sn); end 写者进程Pj (j=1,2,.,n) begin P(S); for i=1 to n do P(Sn); write file; for i=1 to n do V(Sn); V(S); end 74 3.4 进程间的相互作用 n理发师问题: 理发店里有一个理发师、一把理发椅、n把 供等候理发的顾客坐的椅子。如果没有顾客, 则理发师便在理发椅
35、上睡觉。当一个顾客到来 时,他必须先叫醒理发师,进行理发。如果理 发师在理发时又有顾客到来,则如果有空椅子 可坐,他就坐下来等,如果没有空椅子,他就 离开。为理发师和顾客各编写一段程序描述他 们的行为,要求不能带有竞争条件。 75 3.4 进程间的相互作用 n设三个信号量:customers,用来记录等待理发 师的顾客数(不包括正在理发的顾客),初值 为0;barbers,记录正在等候顾客的理发师数, 初值为0;mutex,用于互斥,初值为1。还需 一个变量waiting,初值为0,也用于记录等候 的顾客数,实际上是customers的一个副本。之 所以使用waiting是因为无法读取信号量的
36、当前 值。在该解法中,进入理发店的顾客必须先看 等待的 顾客数,如果少于椅子数,他留下来等, 否则他就离开。 76 3.4 进程间的相互作用 理发师进程 while(true) P(customers);/如果顾客为0,睡觉 P(mutex);/要求进程等候 waiting=waiting-1;/等候顾客数减1 V(barbers);/一个理发师开始理发 V(mutex);/释放等候 cuthair();/理发 顾客进程 P(mutex);/进入临界区 if(waitingCHAIRS) waiting=waiting+1;/等候顾客数加1 V(customers);/如果必要,唤醒理发师 V
37、(mutex);/释放访问等候 P(barbers);/如果barbers为0,就睡觉 get_haircut();/坐下等候服务 else/没空椅子,就离开 V(mutex); n具有同步关系的一组并发进程称为合作进程, 合作进程间互相发送的信号称为消息或事件。 n如果对一个消息或事件赋以唯一的消息名, 则可用过程 wait(消息名)表示进程等待合作进程发来的消息, 而用过程 signal(消息名)表示向合作进程发送消息。利用 过程wait和signal 77 (1) 设消息名Bufempty表示Buf空,消息名 Buffull表示Buf中装满了数据。 (2) 初始化Bufempty=tru
38、e,Buffull=false 。 (3) 描述: PC: A:wait(Bufempty) 计算 Buf 计算结果 Bufempty false signal(Buffull) GotoA78 PP: B:wait(Buffull) 打印Buf中的数据 清除Buf中的数据 Buffull false signal(Bufempty) GotoB 过程wait的功能是等待到消息名为true的进 程继续执行,而signal的功能则是向合作 进程发送合作进程所需要的消息名,并 将其值置为true。 79 80 3.4 进程间的相互作用 81 3.4 进程间的相互作用 82 3.4 进程间的相互作用
39、 管程:dining enum status eating, hungry,thinking, fork_state free,used ; status stateN; /哲学家状态 condition selfN; /条件变量阻塞和唤醒进程 fork_state forkN; /当前各个叉子的状态 public: pickup(int i) if(forki=used) selfi.waiting; forki=used; ; putdown(int i) forki=free; selfi.signal; ; test(int i) if(forki=used) return false
40、 else forki=used; return true; ; 83 3.4 进程间的相互作用 philosopher(int i) bool with_two_forks; while (true) statei=thinking; with_two_forks=false; while(!with_two_forks) statei=hungry; dining.pickup(i); if(dining.test(i+1) mod N) with_two_forks=true; else dining.putdown(i); statei=eating; dining.putdown(i
41、); dining.putdown(i+1) mod 5); 84 3.7 进程通信 使用信号量进行进程通信,程序难于 理解且易于死锁。而且只能传递信号, 不能传递大批量的数据,显然不能满足 某些通信需求。于是引入高级通信机制。 85 3.7 进程通信 n分类: 低级通信和高级通信:根据交换信息量的多 少和效率的高低,如P、V操作属于低级通 信;高级通信包括管道通信和信箱通信。 低级通信只传递状态和整数值,信息量小, 效率低,传递较多信息需要多次通信,编程 复杂,不易理解。 高级通信能够传递大批量数据,减轻程序编 制的复杂度。包括共享内存模式、消息传递 模式和共享文件模式(管道)。 86 3.
42、7 进程通信 n分类: 直接通信:信息由发送方直接传递给接收方, 如管道。 间接通信:将收发双方进程之外的共享数据 结构作为通信中转,如消息队列。 87 3.7 进程通信 n共享内存模式:一种最快捷高效的方式, 在UNIX系统中被使用。 系统在内存中指定一个区域作为共享存储 区,建立一张段表进行管理,各进程可以申请 其中一个存储段,并在申请时提供关键字。若 申请的存储区已经被其它进程占有,系统会向 申请进程返回关键字,该存储区就链接到了进 程的逻辑地址空间,此后进程就可以直接存取 共享存储区中的数据了。 88 3.7 进程通信 n共享内存模式:一种最快捷高效的方式, 在UNIX系统中被使用。
43、若申请的存储段尚未分配,系统会按照申 请者的要求分配存储段,并在段表中加入该进 程的信息。 使用共享存储区进行通信时,进程间的互 斥或同步要靠其它的机构来实现。 89 3.7 进程通信 n消息传递方式: 消息由发送方形成,通过一定的机制传递 给接收方。长度可以固定,也可以变化。 每个消息都由消息头和消息体组成,其主 要结构包含: v指向发送进程的指针:Sptr v指向下一消息缓冲区的指针:Nptr v消息长度:Size v消息正文:Text 90 3.7 进程通信 n消息传递方式: 基本工作原理:把消息缓冲区作为进程通 信的一个基本单位,借助系统的发送原语 Send(A)和接收原语Receiv
44、e(B),实现进程间的 通信。每当发送进程要发送消息时,发送进程 用Send(A)原语把消息从发送区复制到消息缓 冲区,并把它挂在接收进程的消息队列末尾。 如果该进程因等待消息而处于阻塞状态,则将 其唤醒。每当接收进程要读取消息时,用接收 原语Receive(B)从消息队列头取走一个消息放 到自己的接收区。 n设公用信号量mutex 为控制对缓冲区访问 的互斥信号量,其初值为1 。设SM为接 收进程的私用信号量,表示等待接收的 消息个数,其初值为0 。设发送进程调用 过程send(m)将消息m 送往缓冲区,接收 进程调用过程Receive(m)将消息m从缓冲 区读往自己的数据区,则Send(m
45、)和 Receive(n)可分别描述为: 91 Send(m): begin 向系统申请一个消息缓冲区 (mutex) 将发送区消息m送入新申请的消息缓冲区 把消息缓冲区挂入接收进程的消息队列 (mutex) (SM) end Receive(n): begin (SM) (mutex) 摘下消息队列中的消息n 将消息n从缓冲区复制到接收区 释放缓冲区 (mutex) end 92 93 PCBPCB . Send(R, M)Send(R, M) . SIZE:SIZE:消息长度消息长度 TEXT:TEXT:消息正文消息正文 . 消息链指针消息链指针 . . Receive(pid, N)Re
46、ceive(pid, N) . SIZE:SIZE:消息长度消息长度 TEXT:TEXT:消息正文消息正文 . M:M: N:N: 接受进程接受进程 R R 发送进程发送进程 S S 消息消息 消息消息 消息消息 . 消息缓冲区结构:消息缓冲区结构: 消息长度消息长度 消息正文消息正文 发送者发送者 消息队列指针消息队列指针 94 3.7 进程通信 n消息传递方式: 消息队列要看作临界资源,需要互斥访问, 在PCB中设置了一个用于互斥的信号量。 类似于生产者-消费者问题。 直接通信方式: Send(P,message):发送消息message到进程P Receive(P,message):从进
47、程P接收消息message 间接通信方式:利用信箱作为媒介进行消息 传递。 95 3.7.3 邮箱通信 信箱是一个用来对一定数量的消息进行缓存 的地方。是一段存储区,每一个信箱用标识 符加以区分,由信箱头和信箱体两部分组成。 信箱头存放控制信息,信箱体存放消息内容。 一个信箱可以被多个进程共享,就实现了消 息的广播发送。 图3.18 邮箱通信结构 对于只有一发送进程和一接收进程使用的邮箱, 则进程间通信应满足如下条件: 发送进程发送消息时,邮箱中至少要有一个空 格能存放该消息。 接收进程接收消息时,邮箱中至少要有一个消 息存在。 96 设发送进程调用过程 deposit(m)将消息发送到邮箱,
48、接收 进程调用过程remove(m)将消息m 从邮箱中取出。另外, 为了记录邮箱中空格个数和消息个数,信号量fromnum 为发送进程的私用信号量,信号量mesnum为接收进程 的私用信号量。fromnum 的初值为信箱的空格数 n, mesnum 的初值为 0。则 deposit(m)和remove(m)可描述 如下: deposit(m): begin local x (fromnum) 选择空格x 将消息m放入空格x中 置格x的标志为满 (mesnum) end 97 remove(m): begin local x (mesnum) 选择满格x 把满格x中的消息取出放m中 置格x标志为
49、空 (fromnum) end 显然,调用过程deposit(m)的进程与调用过程remove(m)的 进程之间存在着同步制约关系而不是互斥制约关系。 另外,在许多时侯,存在着多个发送进程和多个接收进 程共享邮箱的情况。这时需要对过程deposit(m)和 remove(m)作相应的改动。 98 99 3.7.5 进程通信的实例管道 n管道(pipe):是一种共享文件模式,基于文件 系统,连接于两个进程之间,以先进先出的方 式实现消息的单向传送。 在UNIX系统中,管道的创建用函数pipe()实现。该 函数返回用于读、写操作的文件描述符fd0,fd1。 读管道时调用read()函数,利用参数f
50、d0从管道中读 取字节。写管道时调用write()函数,利用参数fd1 向管道写信息。 100 3.7.5 进程通信的实例管道 n管道(pipe):是一种共享文件模式,基于文件 系统,连接于两个进程之间,以先进先出的方 式实现消息的单向传送。 注意: v通过系统调用write()和read()进行管道的读写。 v进程间要进行双向通信,通常需要定义两个管道。 v只适用于父子进程之间的通信。管道能够把信息 从一个进程的地址空间拷贝到另一个进程的地址 空间。 2. 示例 例1: 用C语言编写一个程序,建立一个pipe,同时父进 程生成一个子进程,子进程向pipe中写入一字符串,父 进程从pipe中读
51、出该字符串。 解: 程序如下: #include stdio.h main() intx,fd2; char buf30,s30; pipe(fd);/*创建管道*/ while(x=fork()=-1);/*创建子进程失败时,循环*/ if(x=0) 101 sprintf(buf,This is an examplen); write(fd1,buf,30);/*把buf中字符写入管道*/ exit(0); else/*父进程返回*/ wait(0); read(fd0,s,30);/*父进程读管道中字符*/ printf(%s,s); 102 例2: 编写一程序,建立一个管道。同时,父进
52、程生成子 进程P1,P2,这两个子进程分别向管道中写入各自的 字符串,父进程读出它们(如图3.22)。 图3.22 父进程和子进程P1,P2通信例子 解:程序框图如图3.23所示,源程序如下: 103 104 #include stdio.h main() inti,r,p1,p2,fd2; char buf50,s50; pipe(fd);/*父进程建立管道*/ while(p1=fork()=-1);/*创建子进程P1,失败时循环*/ if(p1=0)/*由子进程P1返回,执行子进程P1*/ lockf(fd1,1,0);/*加锁锁定写入端*/ sprintf(buf,child proc
53、ess P1 is sending messages!n); printf(child processP1!n); write(fd1,buf,50);/*把buf中的50个字符写入管道*/ sleep(5);/*睡眠5秒,让父进程读*/ lockf(fd1,0,0);/*释放管道写入端*/ exit(0);/*关闭P1*/ else/*从父进程返回,执行父进程*/ while(p2=fork()=-1);/*创建子进程P2,失败时循环*/ if(p2=0)/*从子进程P2返回,执行P2*/ 105 lockf(fd1,1,0);/*锁定写入端*/ sprintf(buf,child proc
54、ess P2 is sending messagesn); printf(child process P2 ! n); write(fd1,buf,50);/*把buf中字符写入管道*/ sleep(5);/*睡眠等待*/ lockf(fd1,0,0);/*释放管道写入端*/ exit(0);/*关闭P2*/ wait(0); if(r=read(fd0,s,50)=-1) printf(cant read pipen); else printf(%sn,s); wait(0); if(r=read(fd0,s,50)=-1) printf(cant read pipen); else pri
55、ntf(%sn,s); exit(0); 其中,lockf为保证进程互斥使用管道的系统调用,sleep为保证当前进程睡眠,转让处 理机的系统调用。 106 107 3.9 线程 n进程作为调度基本单位的问题: 进程的并发执行使得进程调度工作量增大, 耗费系统资源进行进程调度和内存分配。 进程间通信延迟大,频率高的通信过程效率 低下。 没有达到理想的并行度。 108 3.9 线程 n线程(thread):也叫轻型进程,是可执 行的实体单元,可代替以往的进程,是 处理机调度的基本单位。 多线程:单个进程中执行多个线程。典型操 作系统有Windows NT、Solaris、Mach和 OS/2。 在多线程环境中,进程被定义为保护单位和 资源分配单位,在一个进程内部可以有多个 线程。 109 3.9 线程 n线程的特征: 执行状态包括创建、就绪、运行、阻塞等 当不处于执行状态时,要保存线程上下文环 境 一个执行栈 进程中的所有线程共享所属进程内的主存和 其它资源。 110 3.9 线程 n不同结构中,进程和线程的区别: 单进程单线程:没有线程概念,进程就是线 程,线程就是进程。 单进程多线程:一个进程中包括多个线程, 共享该进程的资源。当一个线程修改了数据, 其它线程将读出修改后的数据。 多进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年华北电力大学马克思主义基本原理概论期末考试真题汇编
- 2025年西安翻译学院马克思主义基本原理概论期末考试笔试题库
- 2024年保定学院马克思主义基本原理概论期末考试真题汇编
- 2025年南阳农业职业学院马克思主义基本原理概论期末考试真题汇编
- 2024年贵州医科大学神奇民族医药学院马克思主义基本原理概论期末考试真题汇编
- 2025年广州华南商贸职业学院马克思主义基本原理概论期末考试笔试题库
- 2025年南昌钢铁有限责任公司职工大学马克思主义基本原理概论期末考试笔试题库
- 2024年湘潭科技职业学院马克思主义基本原理概论期末考试真题汇编
- 2025年长江职业学院马克思主义基本原理概论期末考试笔试真题汇编
- 2025年江西管理职业学院马克思主义基本原理概论期末考试真题汇编
- 光疗课件教学课件
- 北师大版二上《参加欢乐购物活动》(课件)
- 基坑土方开挖专项施工方案(完整版)
- 招标人主体责任履行指引
- 健康管理师考试题库及答案题库大全
- 雨课堂学堂云在线《中国传统艺术-篆刻、书法、水墨画体验与欣赏(哈工 )》单元测试考核答案
- 公墓骨灰安葬协议书
- 2025国家粮食储备局考试真题与答案
- 2025年汽车后市场汽车维修行业技术更新换代趋势可行性研究报告
- 2024年一建网络图案例专题
- 2025深圳生物会考试卷及答案
评论
0/150
提交评论