swoole结构图

swoole前言

一.关于进程

1.进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体 (百度百科描述)

简而言之:一个进程就是一个运行的程序。

2.子进程和父进程

父进程子进程派生图示
关于进程需要注意点:

  • 子进程复制父进程的内存和上下文环境,复制后父进程和子进程内存空间各自独立,相互之前没有影响。
  • 修改某个子进程的内存空间不会影响父进程和其他子进程的内存空间。
  • 子进程会复制父进程的IO句柄(fd描述符 )

【例如父进程通过fopen打开一个文件fopen的到一个—fd,子进程复制后同样会有这个fd,如果父进程和子进程同时对一个文件进行操作的话会造成文件混乱,需要加互斥锁】

举例:例如父进程中的变量a = 1,父进程派生子进程后子进程中的的变量a = 1,修改子进程中的变量a,对父进程没有影响。

二.共享内存

1.共享内存

共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。有关信号量的更多内容,可以查阅我的另一篇文章:Linux进程间通信——使用信号量。Linux进程间通信——使用共享内存

图示如下:
父进程子进程派生图示

关于共享内存注意点:

  • 共享内存不属于任何一个进程
  • 在共享内存中分配的内存空间可以被任何进程访问
  • 及时进程关闭,共享内存中的内容可以继续保留
  • 可以通过ipcs -m查看共享内存 (ipcs详解


------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 163840 wangjiangf 600 393216 2 dest
0x00000000 196609 wangjiangf 600 393216 2 dest
0x00000000 229378 wangjiangf 600 393216 2 dest
0x00000000 262147 wangjiangf 600 393216 2 dest
0x00000000 294916 wangjiangf 600 393216 2 dest
0x00000000 327685 wangjiangf 600 393216 2 dest
0x00000000 360454 wangjiangf 600 393216 2 dest
0x00000000 393223 wangjiangf 600 393216 2 dest
0x00000000 425992 wangjiangf 600 393216 2 dest
0x00000000 458761 wangjiangf 600 393216 2 dest
0x00000000 491530 wangjiangf 600 393216 2 dest
0x00000000 688139 wangjiangf 600 393216 2 dest
0x00000000 557068 wangjiangf 600 393216 2 dest
0x00000000 589837 wangjiangf 600 393216 2 dest
0x00000000 622606 wangjiangf 600 393216 2 dest
0x00000000 655375 wangjiangf 600 393216 2 dest
0x00000000 3932176 root 600 524288 3 dest
0x00000000 4849681 root 600 524288 4 dest
0x00000000 4915218 wangjiangf 600 393216 2 dest
0x00000000 4947987 wangjiangf 600 393216 2 dest

swoole

swoole结构

1. swoole图示
  1. swoole结构图
    swoole结构图

  2. swoole流程图
    swoole流程图

  3. swoole详细流程图
    详细流程图

    • Master:处理核心事件驱动(主进程)
    • Reactor:
      处理TCP连接,收发数据的线程。Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。,

      1. 负责维护客户端TCP连接、处理网络IO、处理协议、收发数据
      2. 完全是异步非阻塞的模式
      3. 全部为C代码,除Start/Shudown事件回调外,不执行任何PHP代码
      4. 将TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
      5. Reactor以多线程的方式运行
    • Manager进程:

      1. swoole中worker/task进程都是由Manager进程Fork并管理的。
      2. 子进程结束运行时,manager进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程
      3. 服务器关闭时,manager进程将发送信号给所有子进程,通知子进程关闭服务
      4. 服务器reload时,manager进程会逐个关闭/重启子进程
    • Worker进程:处理客户端请求

      1. 接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
      2. 生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
      3. 可以是异步非阻塞模式,也可以是同步阻塞模式
      4. Worker以多进程的方式运行
    • Task进程:异步工作进程

      1. 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
      2. 处理任务,并将结果数据返回(swoole_server->finish)给Worker进程
      3. 完全是同步阻塞模式
      4. TaskWorker以多进程的方式运行

Reactor、Worker、TaskWorker的关系:

可以理解为Reactor就是nginx,Worker就是php-fpm。Reactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理。Reactor和Worker间通过UnixSocket进行通信。

在php-fpm的应用中,经常会将一个任务异步投递到Redis等队列中,并在后台启动一些php进程异步地处理这些任务。Swoole提供的Worker是一套更完整的方案,将任务的投递、队列、php任务处理进程管理合为一体。通过底层提供的API可以非常简单地实现异步任务的处理。另外TaskWorker还可以在任务执行完成后,再返回一个结果反馈到Worker。

Swoole的Reactor、Worker、TaskWorker之间可以紧密的结合起来,提供更高级的使用方式。

一个更通俗的比喻,假设Server就是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干些杂事,让Worker专心工作。

底层会为Worker进程、TaskWorker进程分配一个唯一的ID
不同的Worker和TaskWorker进程之间可以通过sendMessage接口进行通信

2. Task进程

Task流程图
task进程流程图

  • Task和Worker进程的通信通过unix socket进行
  • Task数据传递大小小于8K直接管道传递,大于8K写入临时文件传递
  • Task传递对象 i.可以通过序列化传递一个对象的拷贝(非应用)ii.Task对象的改变不会反应到worker中(连个进程中是独立的)iii.数据库连接,网络连接对象不可传递
  • Task的Onfinish的回调会传递给调用给该task方法的worker进程(原路返回可寻)

Task 用途:
模拟Mysql连接池

3. Timer定时器

task进程流程图

  • Timer基于epoll的timeout机制实现
  • 使用堆存放Timer,提高检索效率

参考资料:
爱敲代码的喵的视频
swoole官方wiki

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值