了解PHP中进程、线程和协程的基本概念

作者: 乘风御上者 分类: PHP 发布时间: 2020-05-06 16:10

在理解三个“程”之前,需先区分并行与并发的概念。
并行指多个事件在同一时刻发生(如多个处理器可以同时处理多个任务的能力)。
并发指多个事件在同一时间间隔发生(如一个处理器有处理多个任务的能力,不一定是同时)。

进程

进程就是二进制可执行文件在计算机内存里的一个运行实例。
进程主要包括指令集和系统资源,指令集是程序代码,系统资源则指CPU、内存、I/O等。

进程一般由程序、数据集、进程控制块三部分组成:

  1. 程序用来描述进程要完成哪些功能以及如何完成。
  2. 数据集则是程序在执行过程中所需要使用的资源。
  3. 进程控制块用来记录进程的外部特征,描述进程的执行变化过程。系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

进程的局限是创建、撤销和切换的开销比较大。

线程

线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。一个进程可以包含多个线程。
线程也叫轻量级进程,它是一个基本的CPU执行单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。

线程的优点是减少程序并发执行时的开销,提高了系统的并发性能,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
线程的缺点是没有自己的系统资源,只拥有在运行时必不可少的资源(同一进程的各线程可以共享进程所拥有的系统资源)。

进程与线程的关系

  1. 进程是资源分配的最小单位。
  2. 线程是程序执行的最小单位。
  3. 一个进程可以拥有多个线程(最少包含一个线程)。
  4. 进程结束后它拥有的所有线程都将销毁,而线程结束不会影响进程中的其他线程。
  5. 进程切换时消耗资源大,效率差,而线程则节省资源,切换效率高。
  6. 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,真正在CPU上运行的是线程。

协程

线程可以分为内核态线程、用户态线程:

  1. 内核态的线程是由操作系统来进行调度的,在切换线程上下文时,要先保存上一个线程的上下文,然后执行下一个线程,当条件满足时,切换回上一个线程,并恢复上下文。
  2. 用户态的线程不是由操作系统来调度的,而是由程序员来调度的。

协程(Coroutine)就是一种用户态的轻量级线程,又称微线程。
协程的出现就是为了解决频繁的进程上下文切换导致系统性能的降低(主要是短时执行消耗小的任务进程)。
该解决方案本质是,将任务切换的部分工作从内核转移到应用层。

PHP编程常见的进程和线程

  1. 用户每次访问Web服务器,就建立一个PHP进程,当然也会建立至少一个PHP线程
  2. PHP使用pcntl扩展来进行多进程编程
  3. PHP中使用pthreads扩展来进行多线程编程
  4. Nginx的每个进程只有一个线程,每个线程可以处理多个客户端的访问
  5. PHP-FPM使用多进程模型,每个进程只有一个线程,每个线程只能处理一个客户端访问
  6. Apache可能使用多进程模型,也可能使用多线程模型,取决于使用哪种SAPI

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复