php进阶到架构之swoole系列教程(二)进程、线程、协程深入理解

2022-10-11 20:29:59 215 0
魁首哥

目录

  • 概述
  • 学习目标
  • 进程
  • 线程
  • 进程与线程的区别
  • 进程和线程的关系
  • 进程间通信的方式
  • 多线程的缺点
  • 多线程与多进程
  • 主线程
  • 协程
  • 协程与线程的区别
  • php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之 swoole 系列学习课程:第二节:进程、线程、协程深入理解

学习目标

php进阶到架构之swoole系列教程(二)进程、线程、协程深入理解

深入了解进程、线程与协程之间的关系,从而有利于加深swoole技术的理解和深入学习

进程

进程是资源分配的最小单位。

每个进程都有独立的代码和数据空间(进程上下文)

进程间的切换会有较大的开销,

一个进程包含1–n个线程。

线程

线程属于轻量级进程,是程序的执行者。

线程是进程中执行运算的最小单位,是进程中的一个实体,

是被系统独立调度和分派的基本单位。

一个进程可以有多个线程,同一进程内的线程,可以并发执行

进程与线程的区别

(1)调度:

线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)并发性:

不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行

(3)拥有资源:

进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

(4)系统开销:

在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

进程和线程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

进程间通信的方式

(1)管道(pipe)及有名管道(named pipe):

管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

(2)信号(signal):

信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

(3)消息队列(message queue):

消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息。

(4)共享内存(shared memory):

可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

(5)信号量(semaphore):

主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段。

(6)套接字(socket):

这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

多线程的缺点

如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

更多的线程需要更多的内存空间。

线程可能会给程序带来更多“bug”,因此要小心使用。

线程的中止需要考虑其对程序运行的影响。

通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

多线程与多进程

多进程是指操作系统能同时运行多个应用(程序)。

多线程是指在同一程序中有多个顺序流在并发执行。

子进程和父进程有不同的代码和数据空间,

而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.

主线程

程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。

主线程的重要性体现在两个方面:

1、它是产生其他子线程的线程。

2、通常它必须最后完成执行,因为它执行各种关闭动作。

协程

协程比较抽象 它是程序内部的一定调度机制;

协程是轻量级线程, 协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。

协程是属于线程,协程是在线程里执行的。

协程的调度是用户手动切换的,所以又叫用户空间线程。

协程的调度策略是:协作式调度。

协程与线程区别

[Swoole]的协程在底层实现上是单线程的,因此同一时间只有一个协程在工作,协程的执行是串行的。这与线程不同,多个线程会被操作系统调度到多个CPU并行执行。

协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低,和线程不同的是协程没法利用[多核]cpu 的,想利用多核 cpu 需要依赖 Swoole 的多进程模型。

一个协程正在运行时,其他协程会停止工作。当前协程执行阻塞IO操作时会挂起,底层调度器会进入事件循环。当有IO完成事件时,底层调度器恢复事件对应的协程的执行。

对CPU多核的利用,仍然依赖于Swoole引擎的多进程机制

php7进阶到架构师相关阅读

最后,欢迎大家留言补充,讨论~~~喜欢小编的话,欢迎点赞、收藏和关注哦~~~///(^v^)\\\~~~

收藏
分享
海报
0 条评论
215
上一篇:Zend Studio 12.5 安装方法,php工具必备 下一篇:快速搭建WordPress博客站点,并内网穿透实现公网访问

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码