Featured image of post 信号量及PV操作详解

信号量及PV操作详解

无论是大部分的教材上的信号量,还是博客中的信号量,基本上解说都是类似下面这种,给出几个不同的信号量种类然后加一点说明,完全不能理解信号量的PV操作。本文基于此对信号量进行详细叙述,希望能对你有所帮助!

信号量

  • 一个特殊变量
  • 用于进程间传递信息的一个整数值

定义如下:

1
2
3
4
5
struct semaphore
{
	int count;
	quenue Type quenue;
}
  • 信号量说明:semaphore s;
  • 对信号量可以实施的操作:初始化、P和V(P、V分别是荷兰语的test(proberen)和increment(verhogen))

P、V操作定义

P(s)

1
2
3
4
5
6
7
8
9
{
	s.count --; //信号量值减一
	if(s.count<0)
	{
		该进程状态置为阻塞态;
		将该进程插入相应的等待队列s.quenue末尾;
		重新调度
	}
}

down,semwait:也代表P操作

V(s)

1
2
3
4
5
6
7
8
{
	s.ount++;
	if(s.count<=0)
	{
	唤醒相应等待队列s.queue中等待的一个进程;
	改变其状态为就绪态,并将其插入就绪队列;
	}
}

up,semsignal:也代表V操作

相关说明

  • P,V操作为原语操作
  • 在信号量上定义了三个操作 初始化(非负数)、P操作、V操作
  • 最初提出的是二元信号量(解决互斥) 之后,推广到一般信号量(多值)或技术信号量(解决同步)

用PV操作解决进程间互斥问题

  • 分析并发进程的关键活动,划定临界区
  • 设置信号量mutux,初值为1
  • 在临界区前实施P(mutux)
  • 在临界区之后实施V(mutux)

图片演示

相关解释:

  • 临界区 : 我们把并发进程中与共享变量有关的程序段称为临界区。

  • 信号量 : 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

  • 进程的互斥:是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。

  • 进程的同步:是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。

  • pv操作又称wait,signal原语。 主要是操作进程中对进程控制的信息量的加减控制。

注意:在霍尔管程中,wait操作signal操作用于被设计为两个可以中断的过程,而非原语。 在管程中,引入一种数据结构—条件变量(仅在管程中可以被访问)。 条件变量的两种操作:

  • wait()操作[阻塞调用进程]
  • signal()操作[释放/唤醒在条件变量上阻塞的进程]
  • wait用法: wait(num),num是目标参数,wait的作用是使其(信息量)减一。 如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 signal用法: signal(num),num是目标参数,signal的作用是使其(信息量)加一。 如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

本文资源来自Operating Systems 参考:操作系统P,V(wait,signal原语)操作讲解

Licensed under CC BY-NC-SA 4.0
Last updated on Mar 10, 2022 00:00 UTC
顺颂时祺,秋绥冬禧
Built with Hugo
Theme Stack designed by Jimmy