如何从php进程解释Linux系统上的信号量值?

时间:2014-06-19 08:35:47

标签: php linux semaphore

我的问题的基础基本上是man page of semop,它在2.6.30-gentoo-r4 Linux系统上对信号量执行操作。要调查php中有关使用信号量的问题,我正在查看semvalsemzcntsemncntsempid的值,以查找由{定义的信号量{1}}和semid=0(请参阅semctl)。这四个值由一个小C程序检查,并在其值之一发生变化时写入屏幕。这是一个示例输出,包括时间戳:

semnum=0

我的解释是,第一行表示进程1244从信号量中获取了唯一可用的资源,并在3 ms后返回。之后大约一秒钟,PID 1207的另一个进程占用了资源(将信号量值从1递减到零),并在大约100ms后返回。

但是,我也看到了以下输出:

Status at 1415851183.974700:  semval=0  semzcnt=0  semncnt=0  sempid=1244
Status at 1415851183.977678:  semval=1  semzcnt=0  semncnt=0  sempid=1244
Status at 1415851184.630576:  semval=0  semzcnt=0  semncnt=0  sempid=1207
Status at 1415851184.721588:  semval=1  semzcnt=0  semncnt=0  sempid=1207

这里似乎PID 4173的进程正在使用资源(Status at 1415851188.925930: semval=0 semzcnt=0 semncnt=0 sempid=4869 Status at 1415851188.928922: semval=1 semzcnt=0 semncnt=0 sempid=4869 Status at 1415851188.965917: semval=0 semzcnt=0 semncnt=0 sempid=4173 Status at 1415851189.046912: semval=0 semzcnt=0 semncnt=1 sempid=4173 Status at 1415851189.237873: semval=0 semzcnt=0 semncnt=2 sempid=4173 Status at 1415851189.249882: semval=0 semzcnt=0 semncnt=3 sempid=4173 Status at 1415851189.275878: semval=0 semzcnt=0 semncnt=4 sempid=4173 Status at 1415851189.311886: semval=0 semzcnt=0 semncnt=5 sempid=4173 递减到零)但没有返回资源。之后,需要相同的资源(看似通过相同的过程),但信号量阻塞,因为尚未返回第一个资源。

这里的问题是semid的semop文档声明:

semval

这不可能,但事实并非如此!因为我在PHP代码中对信号量操作进行了并行记录(其中不同的PHP进程使用相同的函数),我看到那些pid_t sempid; /* ID of process that did last op */ 对不同进程的semop进行了操作{{1} }'第我认为pid的文档不太正确,因为semop似乎表示最后成功 op的进程PID,或类似的东西。

但是,我的解释是否正确,过程4173以某种方式阻止了资源/信号量,因此阻止了所有其他想要获取资源的进程?此外,从调试sempid代码我看到php(大约时间1415851188.965917)永远不会回到sem_acquire解释器,从而阻止进程4173.但是,正如我们所见,进程4173成功地将php减少一到零,一切都应该没问题。也许这是php中的一个错误?

0 个答案:

没有答案