pv原语法和加锁法实现进程间互斥的区别

pv原语法和加锁法实现进程间互斥的区别,第1张

加锁法是对临界区加锁以实现互斥。当某个进程进入临界区后,就锁定临界区直到它退出临界区,其他进程要进入时,须要不断测试临界区是否被用着,直到临界区空着是才能进入。这会影响系统的可靠性和执行效率。

P,V原语操作能改变信号量的数值,信号量(sem)可代表管理相应临界区公共资源的实体。当sem>=0时,表示可供并发进程使用的资源实体数,当sem<0是时,表示正在等待使用临界区的进程数。而一次P操作使得sem减1,一次V操作使得sem加1。

P,V操作中进程不需要象加锁时要不断的测试,而是在队列里等待其他进程执行V操作时,就可以进入临界区了。这样P,V操作比加锁更简单,且表达能力强,但P,V相对来说不安全,会出现死锁,遇到复杂的同步互斥问题时会更复杂。

解释:PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。

信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。有两种实现方式:1)semaphore的取值必须大于或等于0。0表示当前已没有空闲资源,而正数表示当前空闲资源的数量;2) semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数。

信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问。初始化可指定一个非负整数,即空闲资源总数。

P原语操作的动作是:

(1) sem减1

(2) 若sem减1后仍大于或等于零,则进程继续执行

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

V原语操作的动作是:

(1) sem加1

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

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

PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用.在PV原语执行期间不允许有中断的发生.

那不是PV编程时PV原语,伪代码:

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

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

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

PA:

P(sem)

<S>

V(sem)

PB:

P(sem)

<S>

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/177067.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-27
下一篇2023-03-27

发表评论

登录后才能评论

评论列表(0条)

    保存