当前位置:文档之家› pv经典例题详解

pv经典例题详解

pv经典例题详解

PV 操作是操作系统中的进程管理原语,用于进程调度和资源分配。PV 操作包括 P 和 V 两个原语,P 原语用于进程插入,将待调度进程插入到就绪队列中;V 原语用于进程删除,将已调度进程从就绪队列中删除。以下是 PV 经典例题的详解。

例题 1:

假设有一个操作系统,有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在需要对这两个进程进行调度,请问哪个进程应该先运行?

解答:

PV 操作是用于进程调度和资源分配的原语,其中 P 原语用于进程插入,将待调度进程插入到就绪队列中;V 原语用于进程删除,将已调度进程从就绪队列中删除。在这个问题中,进程 P1 的优先级比进程 P2 高,因此 P1 应该先运行。

例题 2:

假设有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在 P1 已经运行了一段时间后,需要将进程 P2 切换到执行,请问应该使用哪种原语?

解答:

在这个问题中,P1 已经运行了一段时间,因此它的进程状态可能已经被保存在内存中。如果想将进程 P2 切换到执行,可以使用 V 原语将 P2 从就绪队列中删除,然后将 P1 的优先级设置为 P2 的优

先级,即将 P1 的优先级提高到与 P2 相同。这样 P2 就会重新进入就绪队列,并执行。

例题 3:

假设有一个操作系统,有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在 P1 已经处于就绪队列的前端,并且 P2 正在运行。现在需要将 P2 暂停一段时间,请问应该使用哪种原语?

解答:

在这个问题中,P2 正在运行,因此不能使用 P 原语将 P2 插入到就绪队列中。如果想要暂停 P2 的进程,可以使用 V 原语将 P2 从就绪队列中删除,然后使用 S 原语将 P1 的进程状态保存在内存中,即将 P1 的优先级设置为 P2 的优先级,并将 P2 的进程状态设置为暂停状态。这样 P2 就会被暂停,直到 P1 再次执行。

pv问题例题解析

Pv问题例题解析 【例1】桌上有1空盘,允许存放1个水果。爸爸向盘中放苹果,也可以向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放1个水果供吃者取用。请用Wait()、Signal()原语实现爸爸、儿子、女儿三个并发进程的同步。 【南京大学2000】【分析】这是复杂情况的“生产者—消费者”问题,既有同步又有互斥。爸爸进程与儿子进程、女儿进程需要同步,儿子进程与女儿进程需要互斥。设置4个信号量S(盘子是否为空,初值为1)、So(盘中是否有桔子,初值为0)、Sa(盘中是否有苹果,初值为0)和mutex(用于对盘子的互斥访问,初值为1)。由于只有一个盘子(相当于只有一个buffer),对盘子的互斥访问发生在对盘子的存取操作上,S、So和Sa就可以保证对盘子的互斥操作了,故mutex也可以省略。 解:设三个信号量: S --- 盘子是否为空,初值为1; So --- 盘中是否有桔子,初值为0; Sa --- 盘中是否有苹果,初值为0; Semaphore S=1, So=0, Sa=0; Main() { Cobegin Father(); Son(); Daughter(); Coend } Father() { While(1) { Wait(S); 将水果放入盘中; If (放入的是桔子) Signal(So); Else Signal(Sa); } } Son() { While(1) { Wait(So); 从盘中取出桔子;Signal(S); 吃桔子; } } Daughter() { While(1) { Wait(Sa); 从盘中取出苹果;Signal(S); 吃苹果; } }

pv经典例题详解

pv经典例题详解 PV 操作是操作系统中的进程管理原语,用于进程调度和资源分配。PV 操作包括 P 和 V 两个原语,P 原语用于进程插入,将待调度进程插入到就绪队列中;V 原语用于进程删除,将已调度进程从就绪队列中删除。以下是 PV 经典例题的详解。 例题 1: 假设有一个操作系统,有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在需要对这两个进程进行调度,请问哪个进程应该先运行? 解答: PV 操作是用于进程调度和资源分配的原语,其中 P 原语用于进程插入,将待调度进程插入到就绪队列中;V 原语用于进程删除,将已调度进程从就绪队列中删除。在这个问题中,进程 P1 的优先级比进程 P2 高,因此 P1 应该先运行。 例题 2: 假设有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在 P1 已经运行了一段时间后,需要将进程 P2 切换到执行,请问应该使用哪种原语? 解答: 在这个问题中,P1 已经运行了一段时间,因此它的进程状态可能已经被保存在内存中。如果想将进程 P2 切换到执行,可以使用 V 原语将 P2 从就绪队列中删除,然后将 P1 的优先级设置为 P2 的优

先级,即将 P1 的优先级提高到与 P2 相同。这样 P2 就会重新进入就绪队列,并执行。 例题 3: 假设有一个操作系统,有两个进程 P1 和 P2,它们的优先级分别为 10 和 20。现在 P1 已经处于就绪队列的前端,并且 P2 正在运行。现在需要将 P2 暂停一段时间,请问应该使用哪种原语? 解答: 在这个问题中,P2 正在运行,因此不能使用 P 原语将 P2 插入到就绪队列中。如果想要暂停 P2 的进程,可以使用 V 原语将 P2 从就绪队列中删除,然后使用 S 原语将 P1 的进程状态保存在内存中,即将 P1 的优先级设置为 P2 的优先级,并将 P2 的进程状态设置为暂停状态。这样 P2 就会被暂停,直到 P1 再次执行。

P.V操作(典型例题)

有个寺庙,庙中有个小和尚和老和尚若干人,有一只水缸,由小和尚提水入缸给老和尚饮用。水缸可容10桶水,水取自同一口水井中。水井径窄,每次仅能容一只水桶取水,水桶总数为3个。若每次只能入缸一桶水和取缸中一桶水,而且还不可以同时进行。试用一种同步工具写出小和尚和老和尚入水、取水的活动过程。 4.答:本题为两个进程共享两个缓冲区的问题。首先考虑本题有几个进程:从井中取水后向缸中倒水此为连续动作,为一个进程;从缸中取水为另一个进程。 其次考虑信号量,有关互斥的有:水井和水缸。水井一次仅能一个水桶进出,水缸一次入、取水为一桶。分别设互斥信号量为:mutex1和mutex2控制互斥。有关同步问题为:三个水桶无论从井中取水还是入出水缸都是一次一个,应为它设信号量count,抢不到水桶的进程只好等待。水缸满时不可入水,设信号量为empty,控制水量,水缸空时不可出水,设信号量full,控制出水量。 设置信号量初值:mutex1:=mutex2:=1;count:=3;empty:=10;full:=0; Parbegin ﹛ 小和尚打水进程: Begin P(empty); P(count); P(mutex1); 从井中打水; V(mutex1); P(mutex2); 倒水入缸; V(mutex2); V(count); V(full); End 老和尚取水进程: Begin P(full); P(count); P(mutex2); 从缸中取水; V(mutex2); V(count); V(empty); End } Parend.

2. 假定一个阅览室可供50个人同时阅读。读者进入和离开阅览室时都必须在阅览室入口处的一个登记表上登记,阅览室有50个座位,规定每次只允许一个人登记或注销登记。要求:(1)用PV操作描述读者进程的实现算法(可用流程图表示,登记、注销可用自然语言描述); (2)指出算法中所用信号量的名称、作用及初值。 解 S1:阅览室可供使用的空座位,其初值为50 S: 是否可通过阅览室,其初值为1 Process READ_in(i=1…50) {到达阅览室入口处; P(S1);P(S); 在入口处登记座位号; V(s); 进入座位并阅读; } Process READ_out(j=1…50) {结束阅读到达阅览室入口处; P(S); 在入口处注销座位号; V(S1);V(S) 离开入口处; } ●N个并发进程公用一个公共变量Q,信号灯进程: main() { begin s=1; cobegin p1();p2();…pn(); coend } Pi() { P(s) … V(s) }

pv操作例题详细解释

pv操作例题详细解释 摘要: 一、前言 二、PV操作的定义和基本概念 1.进程和线程 2.同步和互斥 3.PV操作的定义 三、PV操作的实现和应用 1.信号量机制 2.PV操作的实现 3.PV操作在实际应用中的例子 四、PV操作的注意事项 1.避免死锁 2.合理设置超时时间 3.使用PV操作的局限性 五、总结 正文: 一、前言 PV操作是操作系统中进程同步和互斥的一种常用手段,通过对进程的执行进行控制,确保系统资源得到高效利用。本文将详细解释PV操作的原理、实现和应用,并给出在使用PV操作时需要注意的事项。

二、PV操作的定义和基本概念 1.进程和线程 进程是计算机中程序执行的基本单位,是资源分配的独立单位。线程是进程内部的一个执行流程,是调度的基本单位。一个进程可以包含多个线程,线程之间共享进程的资源。 2.同步和互斥 同步是指多个进程或线程在执行过程中,需要相互配合,使得它们能够顺序、有序地执行。互斥是指在同一时间,只允许一个进程或线程访问某个共享资源。 3.PV操作的定义 PV操作,即P操作(wait)和V操作(signal),是一种基于信号量的同步和互斥机制。P操作会使得信号量值减一,如果信号量值为零,则进程或线程会进入等待状态;V操作会使得信号量值加一,如果有进程或线程在等待,则唤醒其中一个。 三、PV操作的实现和应用 1.信号量机制 信号量是操作系统中用于表示资源数量或状态的变量。信号量有两种类型:二进制信号量(只有0和1两个值,用于实现互斥锁)和计数信号量(可以有大于1的值,用于表示可重入锁)。 2.PV操作的实现 P操作可以通过执行wait函数实现,V操作可以通过执行signal函数实现。wait函数会使信号量值减一,如果信号量值为零,则阻塞调用进程或线

pv操作例题

pv操作例题 (原创实用版) 目录 1.PV 操作概述 2.PV 操作的实例 3.PV 操作的解题技巧 4.总结 正文 一、PV 操作概述 PV 操作是计算机编程中的一种操作,主要用于处理并发读写问题。PV 操作是基于 C 语言的线程操作,通过 PV 操作,可以实现线程之间的同步和互斥。PV 操作主要包括 P 操作和 V 操作两个方面。P 操作用于线程申请资源,如果资源已经被其他线程占用,则线程需要等待。V 操作用于线程释放资源,当有其他线程正在等待该资源时,V 操作会唤醒等待的线程。 二、PV 操作的实例 下面通过一个简单的实例来介绍 PV 操作的使用方法。假设有两个线程,线程 A 负责生产产品,线程 B 负责消费产品。由于产品库存有限,需要通过 PV 操作来实现线程之间的同步和互斥。 1.定义一个 PV 结构体,包括 P 操作和 V 操作的 sem_t 结构体。 ```c typedef struct { sem_t p; sem_t v; } PV; ``` 2.初始化 PV 结构体。 ```c PV pv = {0}; ``` 3.线程 A 执行 P 操作申请资源。 ```c pv.p = sem_wait(&pv.p); ``` 4.线程 A 执行生产操作。 ```c // 生产产品操作 ``` 5.线程 A 执行 V 操作释放资源。 ```c sem_post(&pv.v); ``` 6.线程 B 执行 P 操作申请资源。 ```c pv.p = sem_wait(&pv.p);

``` 7.线程 B 执行消费操作。 ```c // 消费产品操作 ``` 8.线程 B 执行 V 操作释放资源。 ```c sem_post(&pv.v); ``` 三、PV 操作的解题技巧 在实际编程过程中,PV 操作的解题技巧主要包括以下几点: 1.根据实际需求,合理地设置 PV 操作的资源。 2.确保 PV 操作的同步和互斥性,避免死锁现象的发生。 3.在编写 PV 操作时,要注意线程之间的切换和调度。 4.根据实际需求,合理地使用 PV 操作,提高程序的执行效率。 四、总结 PV 操作是计算机编程中一种重要的线程操作,主要用于处理并发读写问题。通过 PV 操作,可以实现线程之间的同步和互斥,避免资源的浪费和死锁现象的发生。

pv操作例题详细解释

pv操作例题详细解释 PV操作是一种基于现金流量的财务分析方法,用于计算一项 投资在未来一段时期内的现值(Present Value)。PV操作可 以帮助决策者判断投资是否具有盈利性和可行性。下面是一个PV操作的例题及其详细解释。 假设某公司考虑购买一台新机器,价格为10,000美元。该机 器预计可在未来五年内创造每年2,000美元的现金流入。同时,公司的资本成本率(discount rate)为10%。现在需要计算该 投资的PV值。 解答步骤如下: 1. 确定现金流量的时间段。根据题目所给的信息,现金流量的时间段为未来五年。 2. 计算每年的现金流入的净现值(Net Present Value, NPV)。 净现值是指某一时间点的现金流入与现金流出之间的差额,用来衡量投资的收益。在这个例子中,每年的现金流入为2,000 美元,没有现金流出。因此,每年的净现值等于每年的现金流入。 3. 根据资本成本率计算每年的现值。资本成本率表示每一单位资金的折现率,也就是投资所需要的回报率。在这个例子中,资本成本率为10%。 第一年的现值 = 2,000 / (1+10%)^1 ≈ 1,818.18美元

第二年的现值= 2,000 / (1+10%)^2 ≈ 1,652.89美元 第三年的现值= 2,000 / (1+10%)^3 ≈ 1,502.63美元 第四年的现值= 2,000 / (1+10%)^4 ≈ 1,366.94美元 第五年的现值= 2,000 / (1+10%)^5 ≈ 1,244.49美元 4. 计算净现值。将每年的现值相加得到净现值。 NPV = 第一年的现值 + 第二年的现值 + 第三年的现值 + 第四年的现值 + 第五年的现值 ≈ 1,818.18 + 1,652.89 + 1,502.63 + 1,366.94 + 1,244.49 ≈ 7,584.13美元 根据计算得到的净现值,我们可以得出结论:该投资的PV值为7,584.13美元。由于PV值大于投资成本(10,000美元),说明这个投资具有盈利性,公司可以考虑购买这台机器。

pv操作例题详细解释

pv操作例题详细解释 【最新版】 目录 1.PV 操作简介 2.PV 操作例题 3.例题详细解释 正文 一、PV 操作简介 PV 操作,全称为过程 - 变量操作,是一种在计算机程序设计中用于处理过程和变量之间关系的操作方法。PV 操作广泛应用于各种编程语言中,如 C、C++、Java 等。通过 PV 操作,程序员可以实现对变量的读取、修改、锁定等操作,以确保程序在多线程环境下的正确性和可靠性。 二、PV 操作例题 假设有一个简单的程序,需要实现一个功能:当一个整数变量 x 的值在 0 到 100 之间时,输出“x 的值在 0 到 100 之间”。如果 x 的值小于 0 或大于 100,则输出“x 的值不在 0 到 100 之间”。请使用 PV 操作实现这个功能。 三、例题详细解释 为了实现这个功能,我们可以使用 C 语言中的 PV 操作。具体实现如下: ```c #include #include int x = 0;

int flag = 0; void thread_function() { pthread_mutex_lock(&mutex); // 加锁 if (x < 0 || x > 100) { // 判断 x 的值是否在 0 到 100 之间 flag = 1; // 设置标志位 } pthread_mutex_unlock(&mutex); // 解锁 } int main() { pthread_t thread; pthread_mutex_init(&mutex, NULL); // 初始化互斥锁 pthread_create(&thread, NULL, thread_function, NULL); // 创建线程 pthread_join(thread, NULL); // 等待线程结束 if (flag == 1) { printf("x 的值不在 0 到 100 之间 "); } else { printf("x 的值在 0 到 100 之间 ");

pv经典例题详解(一)

pv经典例题详解(一) PV经典例题 PV(Page Views)是衡量网站流量的指标之一。下面将介绍一些PV经典例题,帮助大家更好地理解和掌握PV的概念和计算方法。 例题1 一个网站在一天之内共有1000名用户访问,每个用户平均浏览了5页,那么该网站当天的PV是多少? 解析: PV = 访问次数× 平均浏览页数 访问次数 = 1000(题目中已经给定) 平均浏览页数 = 5(题目中已经给定) 因此,该网站当天的PV为: PV=1000×5=5000 例题2 一个月内有5000名用户访问了某个网站,其中75%的用户访问了该网站的首页,其余的用户平均浏览了20页。那么该网站这个月的PV 是多少?

解析: PV = 访问次数× 平均浏览页数 访问次数 = 首页访问次数 + 其他页面访问次数 首先,已知访问了首页的用户数量为5000 × 75% = 3750。 其他页面的平均浏览页数为20页,因此可计算出其他页面访问次数: 其他页面访问次数 = (5000 - 3750) × 20 = 25000 最后,求得PV: PV=访问次数×平均浏览页数=(3750+25000)×((3750×75例题3 某网站一天内的PV为20000,其中20%的访问来自搜索引擎,每个搜索引擎用户平均浏览了8页,其余的用户平均浏览了5页。那么该网站搜索引擎用户和非搜索引擎用户的数量分别是多少? 解析: PV = 搜索引擎用户访问次数×平均浏览页数+ 非搜索引擎用户访问次数×平均浏览页数 已知PV=20000,平均浏览页数分别为8页和5页,因此有: 搜索引擎用户访问次数×8 + 非搜索引擎用户访问次数×5 = 20000

PV操作例题

PV操作例题 问题1一个司机与售票员的例子 在公共汽车上,为保证乘客的安全,司机和售票员应协调工作: 停放后就可以进门,第一关车门后就可以行车。用pv操作方式去同时实现他们之间的协同。s1:与否容许司机启动汽车的变量s2:与否容许售票员进门的变量driver()//司机进程{ while(1)//不停地循环{ p(s1);//命令启动汽车启动汽车;正常行车;至东站停放; v(s2);//释放开门变量,相当于通知售票员可以开门}} busman()//售票员进程{ while(1){ 第一关车门; v(s1);//释放开车变量,相当于通知司机可以开车售票 p(s2);//命令进门驾车门;上下乘客;}} 注意:busman()driver()两个不停循环的函数 问题2图书馆存有100个座位,每位步入图书馆的读者必须在登记表上备案,选择退出时必须在登记表上冻结。必须几个程序?存有多少个进程?(请问:一个程序;为每个读者设立一个进程) (1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞)(2)当图书馆中没有座位时,后到的读者不等待,立即回家。 求解(1) 设信号量:s=100;mutex=1p(s) p(mutex)备案 v(mutex) 写作 p(mutex)注销

v(mutex)v(s)求解(2) 设整型变量count=100;信号量:mutex=1;p(mutex);if(count==0){v(mutex);return;} count=count-1;备案 v(mutex);阅读 p(mutex); count=count+1;v(mutex);return; 问题3存有一座东西方向的独木桥;用p,v操作方式同时实现:(1)每次只容许一 个人过桥; (2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。(3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向, 只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为 写者)。(1)解 设立信号量mutex=1p(mutex)过桥 v(mutex)(2)解 设立信号量:mutex=1(东西方不相容)md=1(东向西采用计数变量不相容)mx=1(西向东 采用计数变量不相容) 设整型变量:cd=0(东向西的已上桥人数)cx=0(西向东的已上桥人数) 从东向西:p(md)if(cd=0) {p(mutex)}cd=cd+1v(md)过桥p(md)cd=cd-1if(cd=0) {v(mutex)}v(md)从西向东:p(mx)if(cx=0) {p(mutex)}cx=cx+1v(mx)过桥p(mx)cx=cx-1if(cx=0) {v(mutex)}v(mx) (3)解:从东向西的,和(2)相同;从西向东的和(1)相同。 问题4存有一个俱乐部,存有甲乙两个服务员,当顾客存有命令时,甲负责管理送烟,乙负责管理海原,并无顾客命令时,服务员呼吸。顾客自己无法带烟和火,当顾客必须吸 烟时,可以命令服务员送烟和火,烟和火还未送至时,顾客必须等候。设立信号量: sy,sh,cy,ch:初值都为0 甲服务员repeatp(sy)送烟v(cy)

操作系统PV操作经典例题与答案

操作系统PV操作经典例题与答案 1. 推广例子中的消息缓冲问题。 消息缓冲区为k个,有1个发送进程,n个接收进程,每个接收进程对发送来的消息都必须取一次若有m个发送进程呢? Send: SB=k; //信号量,标记当前空余缓冲区资源。 i = 0; //标记存放消息的缓冲区位置 while (true) { P(SB); 往Buffer [i]放消息; V(SM); i = (i+1) % k; }; Receive: j = 0; //标记取产品的缓存区位置 SM=0;//信号量,标记初始没有消息 ReadCount=0;//读进程计数器 Mutex =1;//读进程互斥信号量 SW=0; //信号量,读进程在此信号量等待 while (true) { P(SM); 从Buffer[j]取消息; ReadCount++ If(ReadCount V(SM); P(SW) }else{ V(SB); j = (j+1) % k;

for(int g=1; g< ReadCount;g++) V(SW); ReadCount=0; } }; 2.第二类读者写者问题: 写者优先 条件: 1)多个读者可以同时进行读 2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) rc=0, //正在读者计数器 wc, //写计数器 rw, //读等计数器 R //等待读信号量 W //等待写信号量 读者: while (true) { P(mutex); if (wc >0){ rw++ P (R); } rc++; If(rw>0&&wc=0){ V(R) rw-- } V(mutex);

PV操作的例题

PV操作的例题 一、线程是进程的一个组成部分,一个进程可以有多个线程,而且至少有一个可执行线程。进程的多个线程都在进程的地址空间内活动。 资源是分给进程的,而不是分给线程的,线程需要资源时,系统从进程的资源配额中扣除并分配给它。处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。线程在执行过程中,需要同步。 二、在计算机操作系统中,PV操作是进程管理中的难点。 首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1; ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S):①将信号量S的值加1,即S=S+1; ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。 什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。 一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S?0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。 利用信号量和PV操作实现进程互斥的一般模型是: 进程P1 进程P2 ……进程Pn ……………… P(S);P(S);P(S); 临界区;临界区;临界区; V(S);V(S);V(S); …………………… 其中信号量S用于互斥,初值为1。 使用PV操作实现进程互斥时应该注意的是: (1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。 (2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。(3)互斥信号量的初值一般为1。 利用信号量和PV操作实现进程同步 PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。 使用PV操作实现进程同步时应该注意的是:

PV原语经典问题

例1:某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去。试用P、V操作正确实现顾客进程的同步互斥关系。 分析:把手推车视为某种资源,每个顾客为一个要互斥访问该资源的进程。因此这个例子为PV原语的第二种应用类型。 解:semaphore S_CartNum; // 空闲的手推车数量,初值为100 void consumer(void) // 顾客进程 { P(S_CartNum); 买东西; 结帐; V(S_CartNum); } 例2:桌子上有一个水果盘,每一次可以往里面放入一个水果。爸爸专向盘子中放苹果,儿子专等吃盘子中的苹果。把爸爸、儿子看作二个进程,试用P、V操作使这四个进程能正确地并发执行。 分析:爸爸和儿子两个进程相互制约,爸爸进程执行完即往盘中放入苹果后,儿子进程才能执行即吃苹果。因此该问题为进程间的同步问题。 解:semaphore S_PlateNum; // 盘子容量,初值为1 semaphore S_AppleNum; // 苹果数量,初值为0

void father( ) // 父亲进程 { while(1) { P(S_PlateNum); 往盘子中放入一个苹果; V(S_AppleNum); } } void son( ) // 儿子进程 { while(1) { P(S_AppleNum); 从盘中取出苹果; V(S_PlateNum); 吃苹果; } } 另附用PV原语解决进程同步与互斥问题的例子: 经典IPC问题如:生产者-消费者,读者-写者,哲学家就餐,睡着的理发师等可参考相关教材。

经典PV操作问题详解(最全面的PV资料)

经典P、V操作问题详解 lionxcat@https://www.doczj.com/doc/d319183876.html, 一、基本概念 1. 信号量 struct semaphore { int value; // 仅且必须附初值一次,初值非负 PCBtype* wait_queue; // 在此信号量上阻塞的进程队列 } S; // 信号量实例为S 2. P、V操作 P(S){ S := S-1; if (S<0) 调用进程自己阻塞自己,等待在S的等待队列末尾; } V(S){ S := S+1; if (S≤0) 从S等待队列头释放一进程就绪在就绪队列尾; 调用进程继续执行; } 3. 使用方法 (i). P、V操作成队出现,处理互斥时出现在同一进程中;处理同步时出现在不同进程中。(ii). 同步P先于互斥P调用,V的顺序无关。 4. 另类P、V操作导致的问题(或信号量的栈实现方法或漏斗法) [习题P174-23] 某系统如此定义P、V操作: P(S): S = S-1; 若S<0,本进程进入S信号量等待队列的末尾;否则,继续执行。 V(S): S=S+1; 若S≤0,释放等待队列中末尾的进程,否则继续运行。 (1)上面定义的P、V操作是否合理?有什么问题? (2)现有四个进程P1、P2、P3、P4竞争使用某一个互斥资源(每个进程可能反复使用多次),试用上面定义的P、V操作正确解决P1、P2、P3、P4对该互斥资源的使用问题。 答: (1)不合理:先进后出;可能“无限等待”,即等待队列头的进程得不到释放。 (2)思路:令每个信号量上的等待队列中始终只有一个进程。解决方案如下:(n个进程) n个进程至多有n-1个等待。设置n-1个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。用循环模拟队列。

相关主题
文本预览
相关文档 最新文档