长春照顾独居老人保姆:信号量以及他们的pv操作

来源:百度文库 编辑:中财网 时间:2024/05/08 08:09:23

信号量机制

信号量

1965年,荷兰学者Dijkstra提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。

信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。 

PV操作

操作系统里进程之间通信信号量的两种操作:PV操作

P,V原语理论

p操作和v操作是不可中断的程序段,称为原语。P,V原语中P是荷兰语的Passeren,相当于英文的pass, V是荷兰语的Verhoog,相当于英文中的incremnet需要注意的是P、V操作对于每一个进程来说,都只能进行一次。而且必须成对使用。且在P,V愿语执行期间不允许有中断的发生。

P原语操作的动作是:

1)       sem1

2)       若sem1后仍大于或等于零,则进程继续执行;

3)       若sem1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

V原语操作的动作是:

1)       sem1

2)       若相加结果大于零,则进程继续执行;

3)       若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。

对于具体的实现,方法非常多,可以用硬件实现,也可以用软件实现。我们采用如下的定义:

   procedure p(var s:samephore); 

     { 

       s.value=s.value-1;

       if (s.value<0) asleep(s.queue); 

     } 

  procedure v(var s:samephore); 

     { 

       s.value=s.value+1;

       if (s.value<=0) wakeup(s.queue); 

     } 

其中用到两个标准过程:

 asleep(s.queue);执行此操作的进程控制块进入s.queue尾部,进程变成等待状态

 wakeup(s.queue);s.queue头进程唤醒插入就绪队列

对于这个过程,s.value初值为1时,用来实现进程的互斥

P,V原语的应用

1)用P V原语实现进程互斥

把临界区置于P(sem) V(sem)之间。当一个进程想要进入临界区时,它必须先执行P原语操作以将信号量sem1,在进程完成对临界区的操作后,它必须执行V原语操作以释放它所占用的临界区。从而就实现了进程的互斥:

具体的过程我们可以简单的描述如下:

PA:

P(sem)

;

V(sem)

PB:

P(sem)

;

V(sem)

(2) P V原语实现进程同步

进程同步问题的解决同样可以采用这种操作来解决,我们假设两个进程需要同步进行,一个进程是计算进程,另一个进程是打印进程,那么这个时候两个进程的定义可以表示为:

PC(表示计算进程)

A: local buf

     repeat 

buf=buf

     until buf=

     计算

      得到计算结果

      buf=计算结果

      goto A 

PP:(表示打印进程)

B: local pri

     repeat

     pri=buf

     until pri!=

     打印buf中的数据

     清除buf中的数据

     goto B

相应用P,V原语的实现过程为:

PA: deposit(data)

Begin local x

P(bufempty)

FIFO方式选择一个空缓冲区buf(x)

buf(x)=data

buf(x)置满标记

V(buffull)

end

PB:remove(data)

Begin local x

P(buffull)

FIFO方式选择一个装满

数据的缓冲区buf(x)

data=buf(x)

buf(x)置空标记

V(bufempty)

end

3)用P V原语实现进程通信

我们以邮箱通信为例说明问题:

邮箱通信满足的条件是:

<1>;发送进程发送消息的时候,邮箱中至少要有一个空格能存放该消息。

<2>;接收进程接收消息时,邮箱中至少要有一个消息存在。

发送进程和接收进程我们可以进行如下的描述:

Deposit(m)为发送进程,接收进程是remove(m). Fromnum为发送进程的私用信号量,信箱空格数nmesnum为接收进程的私用信号量,初值为0.

Deposit(m):

Begin local x

P(fromnum)

选择空格x

将消息m放入空格x

置格x的标志为满

V(mesnum)

end

Remove(m)

Begin local x

P(mesnum)

选择满格x

把满格x中的消息取出放m

置格x标志为空

V(fromnum)

end

笔者仅从最基本的进程问题上论述P,V原语的应用。当然关于这一部分的应用是十分广泛的。比如操作系统文化史上非常经典的哲学家就餐问题,生产-消费问题,读者-写者问题,理发师问题等等。大家不妨尝试一下用信号量的方法进行实现。