在进入主题之前,我们先要理解一些名词。

  • 进程
  • 线程
  • 主进程
  • 子进程
  • 主线程
  • 子线程

名词理解

  • 进程

    当一个程序被运行,操作系统就会为这个程序生成一个进程,以管理该程序运行过程中内存和系统资源的分配。
    进程是程序被执行时,操作系统的管理单元,并且,进程也是操作系统分配资源的最小单元。

  • 线程

    线程是比进程更小的单元,它是cpu的最小执行单元(当然,现在还有协程)。一个进程,至少包含一个或多个线程。

  • 主进程和子进程

    程序运行之后,有些复杂的任务一个进程是无法完成的,这时候就有了多进程的概念。多进程中,便有了主进程和子进程。
    主进程是程序运行的中枢,它负责统筹安排。
    而子进程则通常负责具体的事务。
    比如php-fpm的设计,它就有一个主进程,当fpm被运行的时候,会有一条主进程长时间运行,而当有具体的请求到达服务器时,主进程会开启一些子进程去专门处理请求。

  • 主线程和子线程

    同样,既然一个进程能够被拆分成多个线程,那么,线程也是有主次之分的。
    比如,一个进程,初始化的时候,通常是一个线程在运行的,而当需要处理一些耗时长的任务时(比如IO操作),就会让开启一条子线程,让子线程去做这个事情,然后主线程继续执行接下去的任务。
    这便是多线程。

单线程和多线程

单线程的进程,有一个特性就是顺序执行,当遇到比较耗时的任务时,还未执行的任务就会处于等待状态,一定要等到前面的任务完成了,才会往后执行。

PHP就是典型的单线程,它一定是顺序执行的,前面不执行完,后面执行不了

当然,swoole除外

多线程在软件层面,可以说是多个线程同时执行,但在物理层面,cpu如果是单核,那多个线程之间就总得有个先后(这涉及到cpu的线程调度、时间片轮转知识)

多线程比起单线程,可以提高cpu利用率,多个线程同时执行,不会因为一个线程卡住而导致所有线程都要等待。

但是多线程并非完全是好事,它也可能带来一些副作用,比如线程多了吃内存、多线程之间需要协调共享资源等

多进程和多线程

多进程的程序有php-fpm。

多进程比起多线程,是将执行单元,放大到了进程上面,也就是不论是资源分配的单元,还是执行的单元,都以进程为主。

你可以把耗时的任务分配到子进程进行,而主进程继续执行。其实说起来,这也就是多线程,一个进程对应一个线程,那么多个进程同时进行是否等于多个线程同时进行。

当然,从这个角度这么理解是可以,但实际上多进程和多线程还是有很多差别,比如资源分配不一样,进程调度和线程调度也是两种策略。

多线程则在资源分配上按进程来,执行上按线程来,以线程执行的特性来提高cpu利用率,从而达到提升程序运行效率。

但据说,有IBM的人专门在unix和windows上做过实验,在unix,多进程的设计性能比多线程更好,而windows上,多线程的设计性能比多进程更好。——这个我没求证,未必可信。