讯号量(Semaphore),有时被称为讯号灯,是在多线程环境下使用的一种设施,是可以拿来保证两个或多个关键代码段不被并发调用。在步入一个关键代码段之前,线程必须获取一个讯号量;一旦该关键代码段完成了,这么该线程必须释放讯号量。其它想步入该关键代码段的线程必须等待直至第一个线程释放讯号量。为了完成这个过程,须要创建一个讯号量VI,之后将AcquireSemaphoreVI以及ReleaseSemaphoreVI分别放置在每位关键代码段的首末端。确认这种讯号量VI引用的是初始创建的讯号量。
讯号量特点
具象的来讲,讯号量的特点如下:讯号量是一个非负整数(车位数),所有通过它的线程/进程(汽车)就会将该整数减一(通过它其实是为了使用资源),当该整数值为零时,所有企图通过它的线程都将处于等待状态。在讯号量上我们定义两种操作:Wait(等待)和Release(释放)。当一个线程调用Wait操作时,它要么得到资源之后将讯号量减一,要么仍然等下去(指装入阻塞队列),直至讯号量小于等于一时。Release(释放)实际上是在讯号量上执行加操作,对应于汽车离开停车场,该操作之所以称作“释放”是由于释放了由讯号量守护的资源。
1965年,法国学者Dijkstra提出的讯号量(Semaphores)机制是一种卓有成效的进程同步工具。在常年且广泛的应用中unix c 信号量机制,讯号量机制又得到了很大的发展,它从整型讯号量经记录型讯号量,从而发展为“信号量集”机制。如今,讯号量机制早已被广泛地应用于单处理机和多处理机系统以及计算机网路中。
讯号量机制
讯号量机制是一种卓有成效的进程互斥同步工具。这儿只介绍记录型讯号量机制,它可以有效的解决CPU“忙等”的问题redhat linux 下载,实现互斥。
记录型讯号量机制的数据结构如下(看不懂这些字母是哪些虽然没有关系):
typesemaphore=record
value:integer;(下文传说中的S)
L:listofprocess;(排队使用的进程要待的阻塞队列)
end;
这儿须要注意记录型讯号量S的整形份量value的值的数学涵义,表示该类资源可用的数量,也可以说是执行P操作而不会被阻塞的进程的数量,通常为《=1,由于这儿是进程互斥(并且也可以小于1),等于1时,表示该资源可用,等于0时,表示该资源正在被使用,但是没有进程被阻塞,而且当期数值大于0时,其绝对值表示讯号量S的阻塞队列中的进程数。L表示进程的阻塞队列。
记录型讯号机制的实现伴随着P操作和V操作,P操作指的是测试,V操作指的是降低,不要问我为什么叫PV,我只能说来始于西班牙语。通常P操作要伴随着V操作,两者成双成对出现。
这么我们来瞧瞧P操作和V操作究竟是哪些,这么神奇:
P的谓词操作可以描述为:
procedureP(vars:semaphore);
begin
s.value:=s.value-1;(将讯号量值减1)
ifs.value《0thenblock(s.L);(若讯号量值大于0,则调用阻塞谓词阻塞自己,插入到阻塞队列中去)
end;
V的谓词操作可以描述为:
procedureP(vars:semaphore);
begin
s.value:=s.value+1;(将讯号量值加1)
ifs.value《0thenwakeup(s.L);(若讯号量值大于等于0,则调用唤起谓词从阻塞队列中唤起一个进程)
举个实际的反例:
用P,V操作实现列车互联网定票系统在上海,上海两地的两个终端卖票进程开售同一班次车票的过程。
(1)按照客户要求找到公共数据单元
(2)P(S);
(3)把Pk的值读到工作寄存器R1中;(进程的临界区)
(4)按照客户退票数更改R1;(进程的临界区)
(5)将R1的值讲到Pk中;(进程的临界区)
(6)V(S);
(7)售出客户所定的票linux虚拟机,返回;
比如上海的卖票区抢鲜执行而且步入自己的临界区,这时轮到北京区执行进程,也要求步入临界区,执行P(S),并且由于上海早已在临界区中,执行完P了,此时的讯号量S的值早已从1减为0,之后由于上海卖票执行P(S),此时P(S)的值变为-1,致使自己阻塞,直至南京之行完V(S),致使S的值变为0unix c 信号量机制,之后上海从阻塞队列中唤起,当它再度访问公共票据单元时,数据早已被背景改过了,之后就实现了互斥。