我的问题的基础基本上是man page of semop,它在2.6.30-gentoo-r4
Linux系统上对信号量执行操作。要调查php中有关使用信号量的问题,我正在查看semval
,semzcnt
,semncnt
和sempid
的值,以查找由{定义的信号量{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中的一个错误?