pcntl_fork中意外的核心同步()

问题描述:

我正在研究PHP中的多核心优化功能。我的测试程序分成4个过程,每个过程运行两次。 代码是:pcntl_fork中意外的核心同步()

$iters = 20000000; 

for ($c = 0; $c < 4; $c++) { 

    $pid = pcntl_fork(); 

    if ($pid == 0) { 

     for ($i=0; $i < $iters * (pow(2,$c)); $i++) 
      $x = $i << 2; 

     exit(0); 
    } 
} 

现在看看CPU内核负载图形之后,我注意到,有2个核心完成的工作几乎在同一时间: enter image description here 有时甚至是3芯尝试同步及其负载降低约在同一时间。

问题是 - 根据PHP测试脚本,为什么每个核心都没有完成工作,之前的核心需要两倍的时间?为什么两个内核几乎同时完成工作?

机器规格(lscpu output)

CPU(一个或多个):4

在线CPU(s)列表:0-3

螺纹(S)每个核心:2

每个插座的核心数:2

套接字:1

难道这个效应与测试机器只有2个真实核心有关,所以不知何故这种效应与超线程有关?

我有机会在4个物理内核的机器上重复实验。 lscpu输出大约机CPU规格:

CPU(一个或多个):4

在线CPU(s)列表:0-3

螺纹(S)每核心:1

每个插槽

核心(或多个):4

插座(S):1

而且我已经运行实验时,得到了这样的CPU负载图: enter image description here

因此,可以看出,在这种情况下,不存在交叉核心同步每个内核装载有大约两倍的工作,为前一。 证实上述效应与测试机有4个虚拟核心(2个物理x 2超线程)而不仅仅是4个物理核心有关。