惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
WordPress大学
WordPress大学
爱范儿
爱范儿
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
博客园_首页
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
MyScale Blog
MyScale Blog
IT之家
IT之家
H
Help Net Security
Blog — PlanetScale
Blog — PlanetScale
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 4-2 编写中断信号处理程序 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-4进程调度 3-3进程exec 3-2进程退出和回收 3-1进程标识与fork 2-3解释器文件 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇
3-5多进程编写
王二 · 2022-03-07 · via WangDeer

多进程编写需要清楚的几个问题

  1. 创建了几个进程?

  2. 每个进程 $count 是多少?

  3. 每个进程从哪个地方开始运行代码的?

  4. fork 之后,每个进程的变量 $i, $count 的值是多少 ?

  5. 每个进程运行到哪一行语句结束?

示例一:

代码

<?php

$count = 10;

for ($i = 0; $i < 2; $i++){

    $pid = pcntl_fork();
    // step1-1  parent           创建子进程 child-1: count = 10, i = 0
    // step3-1  cpu 调度 parent  创建子进程 child-2: count = 100, i = 1
    // step5-1  cpu 调度 child-1 创建子进程 child-3: count = 11,  i = 1

    if ($pid == 0){

        $count += 1;
        // step1-2 child-1 执行:count = 11,   i = 1
        // step4   child-2 执行: count = 101,  i = 2
        //         child-2 最终结果:count = 101
        // step6   child-3 执行:count = 12,   i = 2 

    } else {

        $count *= 10;
        // step2   cpu 调度 parent:count = 100,   i = 1
        // step3-2 cpu 调度 parent:count = 1000,  i = 2     for循环退出
        //         parent 最终结果:count = 1000
        // step5-2 cpu 调度 child-1:count = 110,    i = 2
        //         child-1 最终结果:count = 110

    }

}

while(1){

    fprintf(STDOUT, "pid=%d,count=%d\n", posix_getpid(), $count);
    sleep(3);

}

分析:

  • step1-1 parent 创建子进程 child-1:count = 10, i = 0

  • step1-2 child-1 执行:count = 11, i = 1

  • step2 cpu 调度 parent:count = 100, i = 1

  • step3-1 cpu 调度 parent 创建子进程 child-2: count = 100, i = 1

  • step3-2 cpu 调度 parent:count = 1000, i = 2 for循环退出

    parent 最终结果:count=1000

  • step4 child-2 执行: count = 101, i = 2

    child-2 最终结果:count = 101

  • step5-1 cpu 调度 child-1 创建子进程 child-3: count = 11, i = 1

  • step5-2 cpu 调度 child-1:count = 110, i = 2

    child-1 最终结果:count = 110

  • step6 child-3 执行:count = 12, i = 2

运行结果:


pid=1801,count=1000
pid=1803,count=101
pid=1802,count=110
pid=1804,count=12

...

进程间关系:

    ├─bash,80
    │   └─php,1801 demo9.php
    │       ├─php,1802 demo9.php
    │       │   └─php,1804 demo9.php
    │       └─php,1803 demo9.php

示例二

代码

<?php

$count = 10;

for ($i = 0; $i < 2; $i++){

    $pid = pcntl_fork();
    // step1-1  parent           创建子进程 child-1: count = 10, i = 0
    // step3-1 cpu 调度 child-1  创建子进程 child-2: count = 11,   i = 1

    if ($pid == 0){

        $count += 1;
        // step1-2 child-1 执行:count = 11,   i = 1
        // step4   cpu 调度 child-2 创建子进程 child-2: count = 12,   i = 2

    } else {

        $count *= 10;
        break;
        // step2   cpu 调度 parent:count = 100, i = 0  break 跳出循环
        //         parent 最终结果:count = 100

        // step3-2 cpu 调度 child-1:count = 110, i = 2  break 跳出循环
        //         parent 最终结果:count = 110

    }

}

while(1){

    fprintf(STDOUT, "pid=%d,count=%d\n", posix_getpid(), $count);
    sleep(3);

}

分析

  • step1-1 parent 创建子进程 child-1: count = 10, i = 0

  • step1-2 child-1 执行:count = 11, i = 1

  • step2 cpu 调度 parent:count = 100, i = 0 break 跳出循环

    parent 最终结果:count = 100

  • step3-1 cpu 调度 child-1 创建子进程 child-2: count = 11, i = 1

  • step3-2 cpu 调度 child-1:count = 110, i = 2 break 跳出循环

    parent 最终结果:count = 110

  • step4 cpu 调度 child-2 创建子进程 child-2: count = 12, i = 2

运行结果

pid=1962,count=100
pid=1963,count=110
pid=1964,count=12

进程间关系

  ├─bash,80
  │   └─php,1962 demo9.php
  │       └─php,1963 demo9.php
  │           └─php,1964 demo9.php