pv操作的例子cobegin

发布时间:2019-02-27 04:41:52

pv操作的例子cobegin

【篇一:pv操作的例子cobegin

pv操作经典案例讲解bglg 11 在操作系统理论中有一个非常重要的概念叫做pv原语。在我们研究进程间的互 斥的时候经常会引入这个概念,将pv 作方法来解决进程间的互斥问题。pv 作应用范围很广,不但可以解决进程管理 当中的互斥问题,而且我们还可以利用此 方法解决进程同步与进程通信的问题。

信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号 量的值与相应资料的使用情况有关。当它的 值大于零时,表示当前可用资料的数量;当 它的值小于零时,其绝对值表示等待使用该 资源的进程个数。注意,信号量的值仅能有 pv操作来改变。

pv操作经典案例讲解 pv操作经典案例讲解 一般来说,信号量s>=0时,s表示可用资源的数量。执行一次p操作意味着请求分配 一个单位资源,因此,s的值减1;当spv操作经典案例讲解 2pv原语(利用信号量和pv操作实现进程同步 pv操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的 值为0时,表示期望的消息尚未产生;当信 号量的值不为0时,表示期望的消息已经存 在,用pv操作实现进程同步时,调用p 作测试消息是否到达,调用v操作发送消息。

pv操作经典案例讲解 p操作和v操作是不可中断的程序段,称为原语。

p,v原语中p是荷兰语的passeren,相当于英文的pass,v 是荷兰语的verhoog,相当于英文中的incremnet

p原语操作的动作是: 3)若s1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转 程调度。pv操作经典案例讲解 3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再 返回原进程继续执行或转进程调度。

使用pv操作实现进程同步时应该注意的问题是 1.分析进程间的制约干系,确定信号量的种类。在保持进程间有正确的同步关系情况下, 哪儿进程应先执行,哪些进程后执行,彼此间 通过什么信号量进行协调从而明确要设置哪些 信号量。

2.信号量的初值与相应资源的数量有关,也与pv操作在程序代码中出现的位置有关。

3.同一信号量的pv操作要成对出现,但他们分别在不同的进程代码中。

pv操作经典案例讲解 pv 独木桥问题。pv操作经典案例讲解 通过运用信号量和pv操作实现公共汽车问题中售票员和司机的协调操作。

掌握pv原语的概念以及pv操作在实际生活中的程序应用。

pv操作经典案例讲解 pv操作经典案例讲解 设在公共汽车上,为保证乘客的安全,司机和售票员应协调工作: 停车后才能开门,关车门后才能行车。(司机和售票员的活动分别为:司机的活动为 启动车辆,正常行车,到站停车;售票员的 活动为关车门,售票,开车门。)试问: 在汽车不断地到站、停车、行驶过程中,司机和售票员的活动是同步关系还是互 斥关系? 用信号量和pv操作实现他们间的 协调操作。

pv操作经典案例讲解 解析: 在这个问题中,司机与售票员间是并行操作的,司机和售票员本身的操作是顺序 进行的。因此司机是一个进程,售票员是 一个进程,它们之间是同步关系。

pv操作经典案例讲解 根据一般常识,司机和售票员在车上的操作规则如下: 1)售票员操作的规则是只有司机停车后,售票员才能开门让乘客上下车; 2)司机操作的规则是只有售票员关门后,司机才能启动开始行驶汽车。

pv操作经典案例讲解 可见,售票员关车门后,要向司机发开车信号,司机接到开车信号后才能 启动车辆。

在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车 门,让乘客上下车。因此司机启动车辆 的动作必须与售票员的动作取得同步; 售票员开车门的动作也必须同司机停车 取得同步。

pv操作经典案例讲解 1do while 关车门;设立车门已关标志; 售票; 是否停车?没停则等待; 开车门; 上下乘客; enddo pv操作经典案例讲解 2 do while 是否关门?没关则等待;启动车辆; 正常行车; 到站停车; 设立车停标志; enddo pv操作经典案例讲解 根据同步规则以及操作流程确定信号量的个数是2 个,s1 s2

s1 的含义是否关门; s2 的含义是否停车。

pv操作经典案例讲解 s1=0s2=1

pv操作经典案例讲解 司机操作中,是否关门?没关则等待,这是一个p 操作,p(s1) 司机操作中,设立停车标志,这是一个v 操作,v(s2) 售票员操作中,是否停车?没停则等待, 这是一个p 操作,p(s2) 售票员操作中,设立关门标志,这是一个 操作,v(s1)pv操作经典案例讲解 ints1=0; int s2=1; main( cobegindriver( dowhile p(s1);启动车辆; 正常行车; 到站停车; v(s2) dowhile 关车门;v(s1) 售票; p(s2) 开车门; 上下乘客;

【篇二:pv操作的例子cobegin

pv操作的例题

一、线程是进程的一个组成部分,一个进程可以有多个线程,而且至少有一个可执行线程。进程的多个线程都在进程的地址空间内活动。

资源是分给进程的,而不是分给线程的,线程需要资源时,系统从进程的资源配额中扣除并分配给它。处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。线程在执行过程中,需要同步。

二、在计算机操作系统中,pv操作是进程管理中的难点。

首先应弄清pv操作的含义:pv操作由p操作原语和v操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

ps):将信号量s的值减1,即s=s-1

如果s =0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

vs):将信号量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

…… …… ……

ps); ps); ps);

临界区; 临界区; 临界区;

vs); vs); vs);

…… …… …… ……

其中信号量s用于互斥,初值为1

使用pv操作实现进程互斥时应该注意的是:

1)每个程序中用户实现互斥的pv操作必须成对出现,先做p操作,进临界区,后做v操作,出临界区。若有多个分支,要认真检查其成对性。

2pv操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

3)互斥信号量的初值一般为1

利用信号量和pv操作实现进程同步

pv操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用pv操作实现进程同步时,调用p操作测试消息是否到达,调用v操作发送消息。

使用pv操作实现进程同步时应该注意的是:

1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

2)信号量的初值与相应资源的数量有关,也与pv操作在程序代码中出现的位置有关。

3)同一信号量的pv操作要成对出现,但它们分别在不同的进程代码中。

例题一:过桥问题

解:设信号量初值s=1

汽车进程pi(i=1,2,3,…)

到达桥头

p(s)

桥行驶

到达桥另一端

v(s)

例题二

若有一售票厅只能容纳300人,当少于300人时,可以进入。否则,需在外等候, 若将每一个购票者作为一个进程,请用pv操作编程。

解:信号量初值s=300

购票者进程pi(i=1,2,3,…)

p(s)

进入售票厅

购票

退出售票厅

v(s)

例题三

有一只铁笼子,每次只能放入一只动物,猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪,试用pv操作写出能同步执行的程序。

解:两个生产者和两个消费者共享了一个仅能存放一件产品的缓冲器,生产者各自生产不同的产品,消费者各自取自己需要的产品,pv操作编程为:

猎手进程 农民进程 动物园进程 饭店进程

p(s) p(s) p(s1) p(s2)

放入虎 放入猪 买老虎 买猪

v(s1) v(s2) v(s) v(s)

其中s初值=1s1=s2=0

例题四

桌上有一只盘子,每次只能放入一个水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,女儿专等吃盘中的苹果,儿子专等吃盘中的桔子。用pv操作写出它们能正确同步的程序。(同例六详解)

解:信号量初值s1=0s2=0s=1

爸爸进程 妈妈进程 女儿进程 儿子进程

repeat repeat repeat repeat

p(s) p(s) p(s1) p(s2)

放苹果 放桔子 取苹果 取桔子

v(s1) v(s2) v(s) v(s)

until false until false until false until false

例题五

设有两个优先级相同的进程p1p2如下,s1s2初值均为0,求:p1p2并发执行结束后,x,y,z分别是多少?

进程p1 进程p2

y:=1; x:=1;

y:=y+2; x:=x+1;

v(s1); p(s1);

z:=y+1; x:=x+y;

p(s2); v(s2)

y:=z+y; z:=x+z;

解:因为p1p2是并发进程,所以p1p2调度顺序不确定。假设p1先执行,当p1执行到p(s2)时,s2=-1p1阻塞,此时y=3,z=4;当调度程序调度到p2时,由于进程p1巳执行到了v(s1),p2在执行p(s1)时,不阻塞而继续执行,当执行到v(s2)时,将p1唤醒,然后执行到最后一个语句,此时x=5,z=9;p1再次被唤醒、调度时,继续执行p1的最后一处语句,此时y=12.所以最后结果是:x=5,y=12,z=9.如果p2先执行,结果同

【例题五】生产者-消费者问题

在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题,而生产者-消费者问题是其中一个有代表性的进程同步问题。下面我们给出了各种情况下的生产者-消费者问题,深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助。

1)一个生产者,一个消费者,公用一个缓冲区。

定义两个同步信号量:

empty——表示缓冲区是否为空,初值为1

full——表示缓冲区中是否为满,初值为0

生产者进程

while(true){

生产一个产品;

p(empty);

产品送往buffer;

v(full);

}

消费者进程

while(true){

p(full);

buffer取出一个产品;

v(empty);

消费该产品;

}

2)一个生产者,一个消费者,公用n个环形缓冲区。

定义两个同步信号量:

empty——表示缓冲区是否为空,初值为n

full——表示缓冲区中是否为满,初值为0

设缓冲区的编号为1n-1,定义两个指针inout,分别是生产者进程和消费者进程使用的指

,指向下一个可用的缓冲区。

生产者进程

while(true){

生产一个产品;

p(empty);

产品送往bufferin);

in=(in+1)mod n

v(full);

}

消费者进程

while(true){

p(full);

bufferout)中取出产品;

out=(out+1)mod n

v(empty);

消费该产品;

}

3)一组生产者,一组消费者,公用n个环形缓冲区

在这个问题中,不仅生产者与消费者之间要同步,而且各个生产者之间、各个消费者之间还必须互斥地访问缓冲区。

定义四个信号量:

empty——表示缓冲区是否为空,初值为n

full——表示缓冲区中是否为满,初值为0

mutex1——生产者之间的互斥信号量,初值为1

mutex2——消费者之间的互斥信号量,初值为1

设缓冲区的编号为1n-1,定义两个指针inout,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(true){

生产一个产品;

p(empty);

p(mutex1)

产品送往bufferin);

in=(in+1)mod n

v(mutex1);

v(full);

}

消费者进程

while(true){

p(full)

p(mutex2)

bufferout)中取出产品;

out=(out+1)mod n

vmutex2);

v(empty);

消费该产品;

}

需要注意的是无论在生产者进程中还是在消费者进程中,两个p操作的次序不能颠倒。应先执行同步信号量的p操作,然后再执行互斥信号量的p操作,否则可能造成进程死锁。

【例题六】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用pv原语实现爸爸、儿子、女儿三个并发进程的同步。

分析在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

解:在本题中,应设置三个信号量ssosa,信号量s表示盘子是否为空,其初值为l;信号量so表示盘中是否有桔子,其初值为0;信号sa表示盘中是否有苹果,其初值为0。同步描述如下:

int s1;

int sa0;

int so0;

main()

{

cobegin

father();

son();

daughter();

coend

father()

{

while(1)

{

p(s);

将水果放入盘中;

if(放入的是桔子)v(so);

else v(sa);

}

}

son()

{

【篇三:pv操作的例子cobegin

pv操作与信号灯的处理相关,p表示通过的意思,v表示释放的意思。

en的词头缩写。狄克斯特拉在the这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在the中首先提出并为以后的操作系统如unix等所采用的。

为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为 就绪 (ready) 运行 (running) 阻塞 (blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为 运行 进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于 就绪 状态。当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入 阻塞 状态,待造成其退出运行的条件解除,再进入 就绪 状态。而对系统中所有同时运行的进程,在一个进程访问共享数据时,另一个进程不访问该数据和互斥(mutually- exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的 信号灯 (semaphore或叫 信号量 )概念加以解决。

所谓信号灯,实际上就是用来控制进程状态的一个代表某一资源的存储单元。例如,p1p2是分别将数据送入缓冲b和从缓冲b读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫 pv操作 p操作和v操作是执行时不被打断的两个操作系统原语。执行p操作ps)时信号量s的值减1,若结果不为负则ps)执行完毕,否则执行p操作的进程暂停以等待释放。执行v操作vs)时,s的值加1,若结果不大于0则释放一个因执行ps)而等待的进程。对p1p2可定义两个信号量s1s2,初值分别为10。进程p1在向缓冲b送入数据前执行p操作ps1),在送入数据后执行v操作vs2)。进程p2在从缓冲b读取数据前先执行p操作ps2),在读出数据后执行v操作vs1)。当p1往缓冲b送入一数据后信号量s1之值变为0,在该数据读出后s1之值才又变为1,因此在前一数未读出前后一数不会送入,从而保证了p1p2之间的同步。我国读者常常不明白这一同步机制为什么叫pv操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgevenpv操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。

大学操作系统 中的经典例子:

p就是请求资源,v就是释放资源。

例如一个司机与售票员的例子

在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:

停车后才能开门,关车门后才能行车。用pv操作来实现他们之间的协调。

s1:是否允许司机启动汽车的变量

s2:是否允许售票员开门的变量

driver()//司机进程

{

while (1)//不停地循环

{

p(s1);//请求启动汽车

启动汽车;

正常行车;

到站停车;

v(s2); //释放开门变量,相当于通知售票员可以开门

}

}

busman()//售票员进程

{

while(1)

{

关车门;

v(s1)//释放开车变量,相当于通知司机可以开车

售票

p(s2)//请求开门

开车门;

上下乘客;

}

}

pv操作的例子cobegin

相关推荐