信号量与PV操作_第1页
信号量与PV操作_第2页
信号量与PV操作_第3页
信号量与PV操作_第4页
信号量与PV操作_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.3信号量与PV操作同步与同步机制记录型信号量与PV操作用记录型信号量实现互斥记录型信号量解决生产者-消费者问题记录型信号量解决读者-写者问题记录型信号量解决理发师问题3.3.1同步和同步机制著名的生产者--消费者问题是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统中,生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等。解决好生产者--消费者问题就解决好了一类并发进程的同步问题。生产者--消费者问题表述有界缓冲问题有n个生产者和m个消费者,连

接在一个有k个单位缓冲区的有界缓冲上。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。生产者-消费者问题算法描述(1)var

k:integer;nextp,nextc:

item;buffer:array[0..k-1]

of

item;in,out:integer:=0;coumter:integer:=0;生产者-消费者问题算法描述(2)process

producer/*

将一个产品放入缓冲区*//*指针推进*//*缓冲内产品数加1*/beginwhile(TRUE)

/*无限循环*/produce

an

item

in

nextp;/*生产一个产品*/if(counter==k)sleep();/*

缓冲满时,生产者睡眠*/buffer[in]:=nextp;in:=(in+1)

mod

k;counter:=counter+1;

if(counter==1)wakeup(consumer);/*

缓冲空了,加进一件产品并唤醒消费者*/end生产者-消费者问题算法描述(3)process

consumer/*取一个产品到nextc*//*指针推进*//*

取走一个产品,计数减1*/beginwhile(TRUE)

/*无限循环*/if(counter==0)sleep();/*

缓冲区空消费者睡眠*/nextc:=buffer[out];out:=(out+1)

mod

k;counter:=counter-1;

if(counter==k-1)wakeup(producer);/*

缓冲满了,取走一件产品并唤醒生产者*/consume

thr

item

in

nextc;/*消耗产品*/end生产者-消费者问题的算法描述(4)生产者和消费者进程对counter的交替执行会使其结果不唯一生产者和消费者进程的交替执行会导致进程永远等待记录型信号量与PV操作(1)

前节种种方法解决临界区调度问题的缺点:

1)对不能进入临界区的进程,采用忙式等待测试法,浪费CPU时间。2)将测试能否进入临界区的责任推给各个竞争的进程会削弱系统的可靠性,加重了用户编程负担。1965年E.W.Dijkstra提出了新的同步工具--信号量和P、V操作。记录型信号量与PV操作(2)信号量:一种软件资源原语:内核中执行时不可被中断的过程P操作原语和V操作原语一个进程在某一特殊点上被迫停止执行直到接收到一个对应的特殊变量值,这种特殊变量就是信号量(semaphore),复杂的进程合作需求都可以通过适当的信号结构得到满足。记录型信号量与PV操作(3)操作系统中,信号量表示物理资源的实体,它是一个与队列有关的整型变量。实现时,信号量是一种记录型数据结构,有两个分量:一个是信号量的值,另一

个是信号量队列的队列指针。信号量的值(-2)信号量队列指针信号量分类信号量按其用途分为公用信号量:私有信号量:信号量按其取值分为二元信号量:一般信号量:整型信号量设s为一个整形量,除初始化外,仅能通过P、V操作访问,P和V操作原语定义:P(s):while

s≤0

do

null

operations:=s-1;V(s):

s:=s+1;记录型信号量(1)设s为一个记录型数据结构,一个分量为整形量value,另一个为信号量队列queue,P和V操作原语定义:

P(s);将信号量s减去l,若结果小于

0,则调用P(s)的进程被置成等待信号量s的状态。

V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。记录型信号量(2)type

semaphore

=

recordvalue:integer;queue:

list

of

process;Endprocedure

P(var

s:semaphore);begins

:=

s

1;if

s

<

0

then

W(s);/*把信号量减去1

*//*若信号量小于0,则调用P(s)的进程被置成等待信号量s的状态*/end;procedure

V(var

s:semaphore);begins

:=

s

+

1;/*把信号量加1

*/if

s<=0

then

R(s);

/*若信号量小于等于0,则释放一个等待信号量s的进程*/end;记录型信号量(3)推论1:若信号量s为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数、亦等于s所代表的实际还可以使用的物理资源数推论2:若信号量s为负值,则其绝对值等于登记排列在该信号量s队列之中等待的进程个数、亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数推论3:通常,P操作意味着请求一个资源,

V操作意味着释放一个资源。在一定条件下,

P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作二元信号量(1)设s为一个记录型数据结构,一个分量为value,它仅能取值0和1,另一个分量为信号量队列queue,把二元信号量上的P、V操作记为BP和BV,BP和BV操作原语的定义如下:二元信号量(2)type

binary

semaphore=record•••value(0,1);queue:

list

of

processend;procedure

BP(vars:semaphore);

procedureBV(var

s:semaphore);beginif

s.queue

is

empty;beginif

s.value=1;••then

s.value=0;else

beginthen

s.value=1;else

begin•W(s.queue);R(s.queue);•end;end;endend3.3.3记录型信号量解决进程互斥问题s

:

semaphore;s

:=

1;cobegin……process

Pibegin……P(s);临界区;

V(s);……end;……coend;记录型信号量和PV操作解决机票问题(1)Var

A

:

ARRAY[1..m]

OF

integer;mutex

:

semaphore;mutex:=

1;cobeginprocess

Pivar

Xi:integer;beginL1:按旅客定票要求找到A[j];P(mutex)Xi

:=

A[j];if

Xi>=1then

beginXi:=Xi-1;

A[j]:=Xi;V(mutex);输出一张票;end;else

beginV(mutex);输出票已售完;end;goto

L1;end;••记录型信号量和PV操作解决机票问题(2)Var

A

:

ARRAY[1..m]

OF

integer;s

:

ARRAY[1..m]

OF

semaphore;

s[j]

:=

1;cobeginprocess

Pivar

Xi:integer;beginL1:按旅客定票要求找到A[j];P(s[j])Xi

:=

A[j];if

Xi>=1then

beginXi:=Xi-1;

A[j]:=Xi;V(s[j]);输出一张票;end;else

beginV(s[j]);输出票已售完;end;goto

L1;end;coend;•哲学家吃通心面问题(1)有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子哲学家吃通心面问题(2)哲学家吃通心面问题(3)var

forki

:array[0..4]

of

semaphore;forki

:=

1;cobegin//

i=0,1,2,3,4,process

PibeginL1:思考;P(fork[i]);P(fork[(i+1)mod

5]);吃通心面;V(fork[i]);V(fork[(i+1)mod

5]);goto

L1;end;coend;有若干种办法可避免这类死锁上述解法可能出现永远等待,有若干种办法可避免死锁:至多允许四个哲学家同时吃;奇数号先取左手边的叉子,偶数号先 取右手边的叉子;每个哲学家取到手边的两把叉子才吃, 否则一把叉子也不取。哲学家吃通心面问题的—种正确解var

forki

:array[0..4]

of

semaphore;forki

:=

1;cobegin/*

i=0,1,2,3

*/processPibeginL1:思考;P(fork[i]);/*i=4,P(fork[0])*/P(fork[i+1]

mod5)

/*i=4,P(fork[4])*/吃通心面;V(fork[i]);V(fork([i+1]mod

5);goto

L1;end;coend;生产者消费者问题①一个生产者、一个消费者共享一个缓冲区②一个生产者、一个消费者共享多个缓冲区③多个生产者、多个消费者共享多个缓冲区④多个生产者、多个消费者共享一个缓冲区⑤多个生产者、一个消费者共享多个缓冲区⑥一个生产者、多个消费者共享多个缓冲区一个生产者、一个消费者共享一个缓冲区的解/*可以使用的空缓冲区数*//*缓冲区内可以使用的产品数*//*缓冲区内允许放入一件产品*//*缓冲区内没有产品*/Produce

a

product;P(empty);B

:=

product;V(full);Goto

L1;process

consumerbeginL2:P(full);Product:=

B;;V(empty);Consume

a

product;Goto

L2;var

B

:

integer;empty:semaphore;full:semaphore;empty

:=

1;full

:=

0;cobeginProcess

producerbeginL1:•••••end;end;coend多个生产者、多个消费者、共享多个缓冲区的解/*可以使用的空缓冲区数*//*缓冲区内可以使用的产品数*//*放入/取出缓冲区指针*/L1:produce

a

product;P(empty);P(mutex);B[in]

:=

product;in:=(in+1)

mod

k;V(mutex);V(full);Goto

L1;process

consumer_jbeginL2:P(full);P(mutex);Product:=

B[out];out:=(out+1)

mod

k;V(mutex);V(empty);Consume

a

product;Goto

L2;end;

end;var

B

:

array[0..k-1]

of

item;empty:semaphore:=k;full:semaphore:=0;mutex:semaphore:=1;in

,

out:integer:=

0;cobeginprocess

producer_iBegin•••••••••coend•苹果桔子问题桌上有一只盘子,每次只能放入一只水果;爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔于(orange),一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果记录型信号量解决苹果桔子问题plate

:

integer;sp:semaphore;sg1:semaphore;sg2:semaphore;sp

:=

1;Sg1,

:=

0;sg2

:=

0;cobeginprocess

fatherbeginL1:削一个苹果;P(sp);把苹果放入plate;V(sg2);goto

L1;end;process

motherbeginend;/*盘子里可以放几个水果*//*盘子里有桔子*//*盘子里有苹果*//*盘子里允许放一个水果*//*盘子里没有桔子*//*盘子里没有苹果*/process

sonbeginL3:P(sg1);从plate中取桔子;V(sp);吃桔子;goto

L3;end;process

daughterbeginL4:P(sg2);L2:剥一个桔子;从plate中取苹果;P(sp);V(sp);把桔子放入plate;吃苹果;V(sg1);goto

L4;goto

L2;end;coend读者写者问题有两组并发进程:读者和写者,共享一个文件F,要求:允许多个读者同时执行读操作任一写者在完成写操作之前不允许其它读者或写者工作写者执行写操作前,应让已有的写者和读者全部退出记录型信号量解决读者写者问题(1)var

rc

:

integer:=0;W,R:

semaphore;Rc:=0;/*读进程计数*/W

:=

1;R

:=

1;记录型信号量解决读者写者问题(2)procedure

write;beginP(W);写文件;

V(W);end;procedure

read;beginP(R);rc

:=

rc

+

1;if

rc=1

then

P(W);V(R);读文件;P(R);rc

:=

rc

-

1;if

rc

=

0

then

V(W);V(R);end;理发师问题理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论