用信号量机制来解决进程的同步与互斥:PV操作

合集下载

信号量和PV操作

信号量和PV操作

(转)用信号量机制来实现多个进程对临界资源的互斥访问 & PV操作2009-11-30 10:14进程互斥定义:两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可互斥.在多道程序环境下,存在着临界资源,它是指多进程存在时必须互斥访问的资源。

也就是某一的访问。

我们把这些程序的片段称作临界区或临界段,它存在的目的是有效的防止竞争条件又能保有好的解决方案,才能防止出现以下情况:多个进程同时处于临界区,临界区外的进程阻塞其他的此以外,这些方案还不能对CPU的速度和数目做出任何的假设。

只有满足了这些条件,才是一个好访问临界资源的循环进程可以这样来描述:Repeatentry sectionCritical sections;exit sectionRemainder sectioni;Until false为实现进程互斥,可以利用软件的方法,也可以在系统中设置专门的同步机制来协调多个进程1.空闲让进当临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,从2.忙则等待已经有进程进入临界区时,意味着相应的临界资源正在被访问,所以其他准备进3.有限等待对要求访问临界资源的进程,应该保证该进程能在有效的时间内进入临界区,防4.让权等待当进程不能进入临界区,应该立即释放处理机,防止进程忙等待。

早期解决进程互斥问题有软件的方法和硬件的方法,如:严格轮换法,Peterson的解决方案不过它们都有一定的缺陷,这里就不一一详细说明,而后来Kijkstra提出的信号量机制则更好的信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。

以一个停车场的运作为例。

简单起见,假设停车场只有三个车位,一开始三个车位都是空的。

辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。

PV操作实现进程同步互斥问题的方法

PV操作实现进程同步互斥问题的方法

2o 0 9年 计 算 机 考 研专 业 基 础 课 首 次 全 国 统考 , 作 系 统 被 列 为考 研 科 目, P 操 而 V操 作 是 操 作 系 统 中 的关 键 问题 , 多 同学 在 应 很 用 P V操 作 解 题 是 常 常无 从 下 手 。为 使 学 生 更 好 的 理 解 P 操 作 的 实 质 , 高 解 题 能 力 , 者 提 出用 资 源 的 观 点 和 锁 机制 的观 点 分 V 提 笔
Ab ta t s r c :Th spa rd suse lknd fs l ton sng P & V rm iie nd s m a or r fe e n pr c s ync o iai n a u i pe ic s sAl i so u i su i o p i t sa e ph ea e o rd i o e ss hr n z to nd m — v t a xcu i u le lson , sd on t e fc h tt e sg lm e h ns nd PV pe ai n a c o di t hepr c s yn h onz fo ti a rpr v d Bae h a tt a h ina c a im a o rto c n o r naet o ess c r ie n, sp pe o i — i h
关键词 : 程 ; 进 同步 ; 互斥 ; 号 量 机 制 信 中图 分 类号 : 文 献 标 识码 : A 文章 编 号 :0 9 3 4 (0 0 2 — 9 0 0 1 0 — 0 42 1 )5 6 7 — 4
Ac i v u u lE cu i n a d S n h o ia in i o e swi V e a i n h e e M t a x l so n y c r n z t n Pr c s t P Op r t o h o

用信号量机制与pv操作解决进程同步互斥问题的方法

用信号量机制与pv操作解决进程同步互斥问题的方法

用信号量机制与pv操作解决进程同步互斥问题的方

使用信号量机制和PV操作可以解决进程同步互斥问题。

1、设定信号量:首先,内核设置一个或多个信号量变量,用来同步多个进程访问共享资源。

2、PV操作:当进程要进入临界区时,需要调用P(V)操作,先进行V(P)操作,使信号量变量的值加1或减1,如果当前的值大于0,则可以进入临界区,若当前值为0,则进程进入睡眠状态,直到信号量变量大于0才可进入临界区。

进程在临界区操作完成后,调用V(P)操作退出临界区,如果信号量变量的值小于等于0,则唤醒等待队列中的一个进程。

由此可以看出,在解决同步互斥问题的过程中,信号量机制和PV操作可以使进程安全地访问共享资源,而不会产生破坏性的冲突,这样可以保证系统的完整性,正确的运行。

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之⽣产者消费者问题:对信号量设置的理解及PV操作顺序分析问题描述系统中有⼀组⽣产者进程和⼀组消费者进程,⽣产者进程每次⽣产⼀个产品放⼊缓冲区,消费者进程每次从缓冲区取出⼀个产品并使⽤;缓冲区在同⼀时刻只能允许⼀个进程访问。

问题分析⽣产者、消费者共享⼀个初始为空、⼤⼩为n的缓冲区,我们把缓冲区中未存放数据的⼀个块,当作⼀个“空位”;把其中按块存放的数据当作“产品”。

同步关系:⽣产者与消费者只有缓冲区有空位时,⽣产者才能把产品放⼊缓冲区⽣产者把“空位”当作资源,缓冲区初始为空,即空位数量为n(n:空的缓冲区⼤⼩)所以可以设置信号量empty,初始nempty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty);empty<=0时,⽣产者⽆“空位”资源可⽤,便会挂起到阻塞队列等待。

只有缓冲区有产品时,消费者才能从缓冲区中取出产品消费者把“产品”当作资源,缓冲区初始为空,即产品数量为0所以可以设置信号量full,初始为0full<=0,消费者⽆“产品”这种资源可⽤,便会挂起到阻塞队列full>0,有产品,消费者可以消耗“产品”这种资源即P(full)进⼀步:empty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty)的同时:⽣产了“产品这种资源”,即V(full);full>0时,有产品,消费者可以消耗“产品”这种资源即P(full)的同时:⽣产了“空位”这种资源,即V(empty);互斥关系:所有进程之间缓冲区是临界资源,各个进程必须互斥地访问设置信号零mutex,初始为1在进⼊区P(mutex)申请资源在退出区V(mutex)释放资源设计typedef struct{int value;Struct process *L; //等待序列}semaphore;semaphore full;semaphore empty;semaphore mutex;//某进程需要使⽤资源时,通过wait原语申请:P操作void wait(semaphore S){S.value--;if(S.value < 0){block(S.L);//阻塞原语,将当前进程挂载到当前semaphore的阻塞队列}}//进程使⽤完资源后,通过signal原语释放:V操作void signal(semaphore S){S.value++;if(S.value <= 0){wakeup(S.L);//唤醒原语,将当前semaphore的阻塞队列中的第⼀个进程唤醒}}full.value=0; //缓冲区 “产品”资源数(初始为0),⽤于实现⽣产者与消费者进程的同步empty.value=n; //缓冲区 “空位”资源数(初始为n),⽤于实现⽣产者与消费者进程的同步mutex.value=1; //互斥信号量,⽤于实现所有进程之间互斥地访问缓冲区//⽣产者producer(){while(1){Produce(); //⽣产“产品”P(empty); //“空位”数-1P(mutex); //临界区上锁Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}对于各个操作顺序的理解:1. 对于⼀部分操作的顺序,我们很好理解,符合我们的认知://⽣产者Produce(); //⽣产产品P(empty); //“空位”数-1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是V(full)”后⾯,考虑⼀种情况:当空位数为0时,我们是不能摆放产品的,⽽这个操作正是在检查是否还有“空位”这种资源;所以它⼀定在Storage前⾯ Storage(); //摆放产品V(full); //“产品”数+1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是P(empty)”前⾯,考虑⼀种情况:当产品数为n时,我们是不能再摆放产品的,因为缓冲区已满,再向其中添加数据(执⾏Storage)是要出问题的;所 //消费者P(full); //“产品”数-1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是V(empty)”后⾯,考虑⼀种情况:当产品数为0时,我们是不能拿⾛产品的,⽽这个操作正是在检查是否还有“产品”这种资源;所以它⼀定 TakeOut(); //拿⾛产品V(empty); //“空位”数+1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是P(full)”前⾯,考虑⼀种情况:当空位数为n时,我们是不能拿⾛产品的,因为缓冲区已经空了,再拿⾛(执⾏TakeOut)拿⾛个寂寞 Use(); //使⽤“产品”2. 对于其他操作:实现同步的P操作⼀定要在实现互斥的P操作之前,为什么呢?反向分析:我们考虑若调换⽣产者上述两个P操作的顺序://⽣产者producer(){while(1){Produce(); //⽣产产品P(mutex); //临界区上锁P(empty); //“空位”数-1Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}若此时缓冲区已经放满产品,则empty=0,full=n⽣产者进程执⾏P(mutex),mutex变为0,由于empty为0即没有“空位”了,需要⽣产者进程阻塞,等待消费者拿⾛产品切换⾄消费者进程,消费者进程执⾏到P(mutex),由于mutex为0即⽣产者未释放临界资源,需要⽣产者释放临界资源,消费者进程阻塞互相等待,进⼊死锁结论:不要让因同步引起的进程阻塞(P操作可能产⽣结果)发⽣在为临界区上锁之后,因为:1. 临界区上锁,表⽰临界资源已被占⽤;若对临界区未解锁之前,发⽣了因同步引起的进程阻塞(上例中即需要⽣产者进程阻塞,等待消费者拿⾛产品)。

操作系统应用题

操作系统应用题

5.利用 P、V原语,形式化或非形式化地描述下列进程的动作序列。

(8 分)进程 P 使用缓冲区B 向m个进程Q1、Q2、…、Qm发送消息,要求每当P 向B 中发送一条消息,只有当所有的进程Q(=1,2,…,m,)都读取这条消息后,P 才向B中发送新的消息。

设s为缓冲区的用信号量,初值为s=1;设 s1表示缓冲区是否有空间存放消息,初值为s1=1;设一个信号量数组T[i](I=1,2,…m),初值为T[i]=0;(表示Qi是否有消息可读)设一个计数器R(初值为0)用来统计读取消息的进程数目3.假定磁盘块的大小为1K,对于480M 的硬盘,其文件分配表FAT 需要占用多少存储空间?该硬盘共有盘块:480M/1K=480K(个) 又256K〈480K〈512K故480个盘块号要用19位表示,即文件分配表的每个表目为2.5个字节。

FAT要占用的存储空间总数为:2.5*480K=1200K2.在采用页式存储管理的系统中,某作业J的的逻辑地址空间为4页(每页2048 字节),且已知该作业的页面映象表如下:试借助地址变换图(画出地址变换图)求出有效逻辑地址2086 所对应的物理地址。

(10 分)逻辑地址2086 的页号及页内位移为:页号: 2086/2048=1页内位移: 2086-2048*2=38通过页表得知物理块号为4,将物理块号与逻辑地址中的页内位移拼接,形成物理地址,即:4*2048+38=8230其地址变换过程如下:3、桌上有一只盘子,每次只能放入一个水果。

父亲专向盘子中放入苹果,母亲专向盘子中放入桔子。

一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。

试用P、V原语实现父母、儿女四个并发进程的同步。

答:设信号量empty表示盘子为空,初值empty=1;设信号量apple表示盘子中为苹果,初值apple=0;设信号量orange表示盘子中为桔子,初值orange=0;2、一个文件系统目录结构如下图,文件采用的物理结构是串联结构,文件F1 由500个逻辑记录组成,每个磁盘块可存放20个逻辑记录,现在欲读取F1 中的第406#记录,文件系统的根目录现已存放在内存,则最少需读多少个磁盘块,才能取出F1 的第406#记录?答:406#所在的磁盘块号为406/20+1=21 故至少应读取23 个磁盘1、用信号量和P、V操作解决下述进程之间的同步与互斥问题P1、P2 两个进程通过计算将产生的数据送到容量为200的缓冲区buff1中,P3 从buff1 取出数据经过格式处理后送到容量无限大的缓冲区buff2中,P4负责从buff2 中取出数据进行打印。

信号量 p、v操作,利用信号量实现互斥的方法-概述说明以及解释

信号量 p、v操作,利用信号量实现互斥的方法-概述说明以及解释

信号量p、v操作,利用信号量实现互斥的方法-概述说明以及解释1.引言1.1 概述信号量(Semaphore)是一种重要的同步工具,在并发编程中起到了关键的作用。

它是由荷兰计算机科学家艾兹赫尔·迪科斯彻兹于1965年提出的。

信号量可以用于控制对共享资源的访问,实现进程或线程之间的互斥和同步。

在计算机系统中,多个进程或线程可能需要同时访问某个共享资源,这时就会引发竞争条件(Race Condition)问题。

竞争条件会导致数据不一致性和程序错误,为了解决这个问题,需要引入互斥机制来保证共享资源在任意时刻只能被一个进程或线程访问。

信号量的引入能够有效地解决互斥问题。

它通过一个计数器来控制对共享资源的访问。

这个计数器被称为信号量的值,其可以是一个非负整数。

当信号量的值大于等于0时,表示共享资源可用,进程可以继续访问。

当信号量的值小于0时,表示共享资源不可用,进程需要等待其他进程释放该资源后才能继续访问。

信号量的实现依赖于两个操作:P(Proberen)和V(Verhogen)。

P操作用于申请共享资源,即进程想要对共享资源进行访问时,必须先进行P操作。

如果信号量的值大于等于1,即资源可用,那么P操作会将信号量的值减1,并允许进程继续访问共享资源。

如果信号量的值小于1,即资源不可用,那么进程就需要等待。

V操作用于释放共享资源,即进程访问完共享资源后,必须进行V操作,将信号量的值加1,以便其他进程可以访问该资源。

利用信号量实现互斥的方法,就是通过对共享资源进行P和V操作,来控制对资源的访问。

在访问共享资源之前,进程需要先执行P操作锁定资源,访问完毕后再执行V操作释放资源。

这样就能够保证在任意时刻只有一个进程能够访问共享资源,实现了互斥。

总结起来,信号量是一种重要的同步工具,通过P和V操作可以实现对共享资源的互斥访问。

利用信号量实现互斥的方法可以有效地解决竞争条件问题,保证数据的一致性和程序的正确性。

pv原语与信号量

pv原语与信号量

《操作系统》专题讨论及小结系别:学号:姓名:专业:成绩:讨论题目:利用信号量机制解决进程同步和互斥问题提示:可从以下几个方面着手1、先要明确一些重要概念(同步、互斥、直接制约、间接制约、临界区等);2、从系统和用户的角度阐述一下进程并发的重要性和必要性;3、非信号量机制存在的问题(要有例证和分析);4、信号量机制的原理阐述;5、解决同步与互斥问题的案例(最好是生活化的,要有分析);6、优点总结;7、信号量机制总结8、缺点和不足之处总结;注:以上内容涵盖到就可以,但条理要清晰,逻辑要合理,例证要浅显易懂(最好有注释)。

1.重要概念(1)直接制约:一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。

(2)进程的同步:把异步环境下的一组并发进程,因直接制约而互相发送消息而进行的相互合作、互相等待,使得各进程按一定速度执行的过程称为进程间的同步。

(3)间接制约:把由于共享某一公有资源而引起的在临界区内不允许进程的交叉执行的现象,称为有共享公有资源而造成的对并发进程执行速度的间接制约。

(4)进程的互斥:不允许两个以上的共享该资源的并发进程同时进入临界区。

(5)临界区:把不允许多个并发进程交叉的一段程序。

2.并发进程的重要性及互斥同步的联系进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。

通常的情况是两个或两个以上的进程需要同时访问某个共享变量。

两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。

解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。

互斥问题可以用硬件方法解决,我们不作展开;也可以用软件方法。

信号量是最早出现的用来解决进程同步与互斥问题的机制,包括一个称为信号量的变量及对它进行的两个原语操作,每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。

操作系统PV操作习题

操作系统PV操作习题

操作系统PV操作习题1. 问题描述在并发编程中,进程间的同步与互斥是非常重要的。

信号量机制(Semaphore)提供了一种有效地实现这些目标的方法。

本文档将介绍关于PV操作(P和V操作)相关概念,并给出一些习题以帮助读者更好地理解。

2. PV 操作简介2.1 P 操作:- 等待一个资源可用。

- 如果该资源不可用,则阻塞当前进程直到它变为可用状态。

- 当前进程获得该资源后,可以执行相应任务。

2.2 V 操作:- 发布或释放一个已经被占有的资源。

- 唤醒等待此资源而处于阻塞状态下的其他进程。

3. PV 示例及其分析假设我们有两个线程 A 和 B 需要访问共享数据 X:```// 共享数据 X 的初始值为 0int X = 0;Thread A:while (true) {// 进行 P(X) 操作来获取对共享数据X进行修改/使用权限 P(X);// 执行需要对共享数据X进行修改/使用处理// 完成后通过 V(X) 来释放控制权,使其他线城能够访问到公众区域.V(x);}Thread B:while (true) {// 进行 P(X) 操作来获取对共享数据X进行修改/使用权限 P(x);// 执行需要对共享数据X进行修改/使用处理V(x); 通过V操作释放控制权,使其他线程能够访问到公众区域.}```4. PV 操作习题问题1:假设在上述示例中,A 线程执行完一次循环后被 B 线程抢占了 CPU。

那么当 A 再次获得CPU时会发生什么?解答:- 当 A 获得 CPU 后,它将继续从之前的状态恢复运行。

- 因为 X 的值已经是非零(由于 B 已经完成过一轮),所以 A 不会阻塞并可以直接进入临界区。

问题2:如果我们不用信号量机制而只依赖互斥锁实现同步和互斥性质,在这个场景下可能出现哪些问题?请详细说明。

解答:- 如果只依赖互斥锁,则无法保证资源可用性检查与等待期间的原子性。

- 在某个线城判断资源是否可用,并尚未加锁时,另一个线城也同时判断该资源是否可用;- 结果两者都认为该资源是空闲的,并试图去申请锁;- 这样就会导致两个线程同时进入临界区,造成数据竞争和不一致性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用信号量机制来解决进程的同步与互斥:PV操作
首先确定进程间的关系,然后确定信号量及其值。

判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。

确定信号量的值是一个关键点,它代表了可用资源实体数。

举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等候。

进程间是同步时:是否存在合作关系,是否需要互通消息
首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。

举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门后,司机方可开车。

进程同步应用示例讲解:1
桌上有一个盘子,可以存放一个水果。

父亲总是把苹果放在盘子中,母亲总是把香蕉放在盘子中;一个儿子专等吃盘中的香蕉,一个女儿专等吃盘中的苹果。

1)系统要设几个进程来完成这个任务?各自的工作是什么?
2)这些进程间有什么样的相互制约关系?
3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

1)需要四个进程
进程描述:
Father:父亲放置苹果的进程;
Mother:母亲放置香蕉的进程;
Son:儿子吃香蕉的进程;
Daughter:女儿吃苹果的进程。

分析:
四人公用一个盘子;
盘子每次只能放一个水果,当盘子为空时,父母均可尝试放水果,但一次只能有一人成功;
盘中是香蕉,儿子吃,女儿等;
盘中是苹果,女儿吃,儿子等。

2)进程之间既有互斥又有同步关系。

Father进程和Mother进程要互斥的向盘中放水果,应设置一互斥信号量dish,初值为1,表示盘子为空;
Father进程要设置同步信号量apple,用于给Daughter进程传送消息,初值为0,表示还没有消息产生,即没有放苹果;相应Daughter进程也要向父、母进程传送盘子为空的消息。

Mother进程要设置同步信号量banana,用于给Son进程传送消息,初值为0,表示还没有消息产生,即没有放香蕉。

相应Son进程也要向父、母进程传送盘子为空的消息。

3)信号量设置:
dish:表示盘子是否为空,初值=1;
apple:表示盘中是否有苹果,初值=0;
banana:表示盘中是否有香蕉,初值=0。

Father:{ while( true)
P ( dish );//判断盘子是否空
将苹果放入盘中;
V ( apple );//传消息给女儿进程
}
Mather:{ while( true)
P ( dish );//判断盘子是否空
将香蕉放入盘中;
V ( banana );//传消息给儿子进程
}
Son::{ while( true)
P ( banana );//判断是否有香蕉
从盘中取出香蕉;
V ( dish );//传送盘空消息
吃香蕉;}
Daughter::{ while( true)
P ( apple );//判断是否有苹果
从盘中取出苹果;
V ( dish );//传送盘空消息
吃苹果;}
进程同步应用示例讲解:2
生产者与消费者共用一个有n个缓冲单元的缓冲区,生产者向缓冲区中放产品,消费者从缓冲区中取产品消费。

1)系统要设几个进程来完成这个任务?各自的工作是什么?
2)这些进程间有什么样的相互制约关系?
3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

1)系统需设两个进程
producer进程:生产产品并向缓冲区中放;
consumer进程:从缓冲区取产品并消费;
分析:
生产者与消费者共用一个缓冲区,但有n个缓冲单元;
对于缓冲区同一时刻只能有一个进程使用;
有空缓冲单元时,生产者可以放,否则等待;
有满缓冲单元时,消费者可以取,否则等待。

2)两进程间有互斥和同步的关系
producer进程和consumer进程要互斥的访问缓冲区,应设置一互斥信号量mutex,初值为1。

producer进程和consumer进程有同步的关系,当没有满缓冲单元时,consumer进程不能消费,当没有空缓冲单元时,producer进程不能向缓冲区放。

应为他们设置同步信号量empty=n和full=0,用于互传消息。

当empty=0时不能生产,当full=0时不能消费。

3)信号量设置
mutex:保证对缓冲区的互斥访问,初值=1;
empty:表示缓冲区中是否有空缓冲单元,初值=n;
full:表示缓冲区中是否有满缓冲单元,初值=0。

producer:
{ while(1)
生产一个成品;
P(empty);
P(mutex);
将产品存入缓冲区;
V(mutex);
V(full);} consumer:{ while(1)
P(full);
P(mutex);
将产品从缓冲区取出;V(mutex);
V(empty);
消费成品;}
进程同步应用示例讲解:3
设有进程A、B、C分别对单缓冲区S和T进行操作,其中A进程负责从卡片上读取数据并把数据块输入到缓冲区S,B进程负责从缓冲区S中提出数据块并将数据块送到缓冲区T中,C进程负责从缓冲区T中取出信息打印。

问题:
1)这些进程间有什么样的相互制约关系?
2)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

分析:两个阶段的生产者和消费者问题。

只有S为空时,A进程才能向S中放数据;只有S中有数据时,B进程才能取数据;
只有T为空时,B进程才能向T中放数据;只有T中有数据时,C进程才能取数据。

1)三进程间有互斥和同步的关系
A进程和B进程要互斥的访问缓冲区S,B进程和C进程要互斥的访问缓冲区T。

A进程和B进程有同步的关系,当缓冲区S空时,A进程才能向S中放数据,只有S中有数据时,B 进程才能取数据。

应为他们设置同步信号量emptyS=1和fullS=0,用于互传消息。

B进程和C进程有同步的关系,只有当缓冲区T空时,B进程才能向T中放数据,只有T中有数据时,C进程才能取数据。

应为他们设置同步信号量emptyT=1和fullT=0,用于互传消息。

3)信号量设置
emptyS :表示单缓冲区S是否为空,初值为1;
emptyT :表示单缓冲区T是否为空,初值为1;
fullS :表示单缓冲区S是否有数据可处理,其初值0
fullT :表示单缓冲区T是否有数据可处理,其初值0
A: B: { while(1)
读卡片
P(emptyS );
将数据送入S;
V(fullS ) ;
} { while(1)
P(fullS );
从S中取数据;
V(emptyS) ;
......
P(emptyT);
将数据送入T;
V(fullT ) ;
}
C:
{ while(1)
P(fullT);
从T中取数据;
V(emptyT) ;
打印数据;
}
进程同步应用示例讲解:4
售票员优先正确运行过程
While(True)
{
(售票员)关车门
(司机)启动公车;
分析:
》确定进程间的关系:司机到站停车后,售票员方可工作。

同样,售票员关车门后,司机才能工作。

所以司机与售票员之间是一种同步关系。

》信号量设置:
确定信号量及其值:由于司机与售票员之间要互通消息,司机进程设置一个私有信号量run,用于判断司机能否进行工作,初值为0。

售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0。

司机进程: { while(1)
p(run);
启动车辆;
正常行车;
到站停车;
v(stop);
} 售票员进程: { while(1) 关车门;v(run);
卖车票;p(stop);
开车门;}
司机进程While(True) {
启动公车;驾驶公车;停止公车;}
售票员进程While(True) {
关车门;
卖车票;
开车门;
}。

相关文档
最新文档