本篇来介绍信号量与PV原语的一些知识,并介绍其在前趋图上的应用分析。本篇的知识属于操作系统部分的通用知识,在嵌入式软件开发中,同样会用到这些知识。
信号量是最早出现的用来解决进程同步与互斥问题的机制(可以把信号量视为一个加锁标志位,实现对临界资源互斥的访问)。
信号量是一个整数:
利用信号量可以实现进程的互斥与同步
P原语(申请资源,相当于wait,阻塞进程)操作的动作是:
V原语(释放资源,相当于signal,激活进行)操作的动作是:
注意:PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。
PV原语的执行顺序:
PV操作中关于信号量的计算:
某系统有n个进程,共享资源R,R是可用数为m,其中n>=m。若采用PV操作,则信号量S的取值范围是多少?
分析:
为使多个进程互斥的访问某临界资源(例如一台打印机):
semaphore mtuex = 1; //表示打印机(互斥/共享资源)
void process1() //进程1
{
//...
wait(mutx); //P操作,信号量-1
//使用打印机
signal(mutex); //V操作,信号量+1
//...
}
void process2() //进程2
{
//...
wait(mutx);//P操作,信号量-1
//使用打印机
signal(mutex);//V操作,信号量+1
//...
}
这里简单分析一下
这里先简单介绍下前趋图:
前趋图是为了描述一个程序的各部分间的依赖关系,或者是一个大的计算的各个子任务间的因果关系的图示。
进程P1~P5的前趋图如下所示,若用PV操作控制进程P1~P5并发执行的过程,需要设置5个信号量S1~S5,且信号量的初值都是0。
根据以上描述,下图中的a~e处分别该填什么:
分析,根据文字描述,对照图中信息,可先将P(S1)和P(S3)在图中标注出来,进而可推出信号量S1和S3以及V操作V(S1)和V(S3)。
然后假设P1到P3使用的信号量S3,P3到P5使用的信号量S4,P4到P5使用的信号量S5,即可推导出剩余的PV操作。
进程P1~P6的前趋图如下所示,若用PV操作控制进程P1~P6进程同步与互斥的程序如下,则呈现中中的①~⑥处分别该填什么:
分析:根据程序中的描述,对照图中信息,可先将程序中已表示的PV操作标注出来,并标注出①~⑥在图中的位置。
然后假设P1到P2使用的信号量S1,P4到P6使用的信号量S7,P5到P6使用的信号量S8,即可推导出剩余的PV操作
本篇介绍了信号量与PV原语的基础知识点,并介绍了PV操作的一些应用,实现进程互斥和实现前趋关系,前趋关系中使用前趋图来实例分析PV操作影响信号量变化的具体运行过程。