Perl 中的 IPC::Semaphore 信号量的操作

什么是信号量? 信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。 注意,信号量的值仅能由PV操作来改变。    一般来说,信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。 PV操作的含义 PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),这些操作会对对信号量进行相关的操作 具体定义如下:      假设有信号量 S. 然后我们分别来讲 P 和 V 操作. P(S):    将信号量S的值减1,即S=S-1;    如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。      V(S):   将信号量S的值加1,即S=S+1;   如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。 互斥时,进程的用户实现互斥需要成对出现, 默认互斥信号量的初值一般为1。 我们来看看 Perl 模块有关信号量的模块. 创建信号量 这个地方, 我们需要引入二个模块, IPC::SysV 是专门用来引入这种信号量操作的常量, 由  IPC::Semaphore 来操作信号量, 如果我们还要多进程共享,可能还需要引入 IPC::SysV::ftok 这个模块来对本地文件进行操作. use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT); use IPC::Semaphore; $sem = IPC::Semaphore->new(IPC_PRIVATE, […]

文章来源:

Author:扶 凯
link:http://www.php-oa.com/2015/02/10/perl-ipc-semaphore.html