接上节我们来了解了解多进程的一些基础进程 / 线程 / 多进程 / 父进程 / 子进程 / 会话 / 控制终端等

多进程的一些基础

定义

进程/父进程/子进程

  • 进程是资源调度和分配的一个独立单元
  • 进程是由线程组成 即等于 一个进程 = 一个线程.
  • 进程是由另一个进程创建 (系统进程 init进程除外) 所以会出现父子进程. 创建一方为父进程 被创建一方为子进程

线程

  • 线程是cpu调度的基本单元 可以理解为是一个进程中的一个线程工作 整个资源是可以共享 线程也是由另一个线程创建的
  • 最开始的我们可以理解为就是进程本身 他开始创建一个线程1 线程1再去创建线程11 线程1就是线程11的父线程

会话/进程组/控制终端

  • 进程组是一个或多个进程的集合
  • 会话是一个或多个进程组的集合.系统调用函数getsid()用来获取某个进程的会话ID(SID)
  • 控制终端可以简单理解就是咱们ssh终端(黑窗口)或cmd那种
  • 一个会话可以有一个控制终端,建立于控制终端相连接的会话首进程被称为控制进程.
  • 一个会话中的几个进程组可被分为一个前台进程组和几个后台进程组,如果一个会话有一个控制终端,则他有一个前台进程组.
  • 无论何时键入终端的中断键,都会将中断信ID发送给前台进程组的所有会话;无论何时键入终端的退出键,都会将退出信ID发送给前台进程组的所有会话.

知识点及代码讲解

重点讲解父进程和子进程, 其他往后放放或大家抽空多去搜索一波!

  • 子进程与父进程共享程序正文段
  • 子进程拥有父进程的数据空间和堆、栈的副本,注意是副本,不是共享
<?php

$i = 0;  

$pid = pcntl_fork();

if ($pid > 0 ) {
        // 父进程
        $i ++;
        echo "parent's i= $i\n"; //1
} else if ($pid == 0) {
        // 子进程
        $i ++;
        echo "son's i=$i\n";  //1
} else {
        // fork error
        echo "fork error\n";
}

// 1 说明父进程能共享$i
// 1 说明子进程能共享$i
// 父进程/子进程都是1 说明子进程不能共享父进程的数据
  • 父进程和子进程将继续执行fork之后的程序代码

fork之后,是父进程先执行还是子进程先执行无法确认,取决于系统调度

<?php

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

    $pid = pcntl_fork();

    switch($pid) {

            case 0:
            // 子进程
            echo "I am son\n";
            break;

            case -1:
            // fork error
            echo "I am err\n";
            break;

            default:
            // 父进程
            echo "I am parent\n";
            break;
    }

}
// 父进程/子进程出现7次, 说明fork完后会继续执行后续的代码逻辑
// 父进程/子进程打印出现乱序, 说明优先执行父进程还是子进程无法确认

====
进程fork完后如果没有主动退出会继续执行后续的代码逻辑!!!

本作品采用《CC 协议》,转载必须注明作者和本文链接
taozywu
讨论数量: 1
taozywu

感谢阅览!希望可以多交流交流!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!