swoole的进程/线程结构

结构图如下:

swoole主要由Master进程(主进程)和Manager进程配合使用完成其功能。

Master进程

是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。

Manager进程

管理worker/task进程。worker/task进程都是由Manager进程Fork并管理的。

Reactor线程

主线程(Master进程)在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。

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

Work进程

类似与php-fpm进程。

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

TaskWorker进程

异步处理其他任务的进程,使用方方式类似与Gearman。

  • 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
  • 处理任务,并将结果数据返回(swoole_server->finish)给Worker进程
  • TaskWorker以多进程的方式运行

关系

可以理解为Reactor就是nginxWorker就是php-fpmReactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理(在回调函数中处理)。ReactorWorker间通过UnixSocket进行通信。

事件处理流程

了解swoole事件处理流程,先了解两种网络事件处理模式。

Reactor模式

它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程/进程(逻辑单元)。除此之外,主线程不做任何其他工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

Proactor模式

两种实现

使用I/O异步模型实现Proactor模式。原理:将所有I/O操作都交给主线程,主线程配合和内核来处理,业务逻辑操作就交给逻辑单元。例如使用aio_read来实现。

工作流程:

  1. 主线程调用aio_read函数向内核注册socket上的读完成事件。
  2. 主线程继续处理其他I/O事件。
  3. 当socket上的数据被读入用户缓冲区后,内核向应用程序(逻辑单元)发送一个信号,通知应用程序数据可用。
  4. 应用程序读取数据(客户端的请求),处理完后,调用aio_write函数向内核注册socket上的写事件。
  5. 主线程继续处理其他逻辑。
  6. 当用户缓冲区的数据写入socket后,内核向应用程序发送一个信号,通知应用程序数据发送完毕。
  7. 应用程序预先定义好的信号处理函数来处理善后处理,比如关闭socket.

使用I/O同步模型实现Proactor模式。原理:主线程执行I/O事件数据的读写操作,业务逻辑操作就交给逻辑单元。例如使用epoll来实现。

工作流程:

  1. 主线程往epoll内核事件表中注册socket上的读就绪事件。
  2. 主线程调用epoll_wait等待socket上有数据可读。
  3. epoll_wait有返回后,主线程从socket上读取数据,然后将读取到的数据封装成一个请求对象(客户端的请求),并插入请求队列。
  4. 于是队列的消费者线程处理请求对象,然后在epoll内核事件表中注册socket上的写就绪事件。
  5. 主线程调用epoll_wait等待socket可写。
  6. 当socket可写时,epoll_wait通知主线程。主线程往socket写入请求结果。

swoole事件架构图

从图可以看出,如果我们把Reactor线程和Work进程组合起来,看成工作线程的话,swoole使用的是reactor事件处理模式。

一个请求经历的步骤如下:

1. 服务器主线程等待客户端连接。

2. Reactor线程处理接连socket,读取socket上的请求数据(Receive),将请求封装好后投递给work进程。

3. Work进程就是逻辑单元,处理业务数据。

4. Work进程结果返回给Reactor线程。

5. Reactor线程将结果写回socket(Send)。

每个模块的工作请回顾上面的结构介绍。

swoole架构分析的更多相关文章

  1. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  2. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  3. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...

  4. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  5. NopCommerce架构分析(转载)

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  6. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  7. tomcat架构分析-索引

    出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...

  8. [转载] 关于“淘宝应对"双11"的技术架构分析”

    微博上一篇最新的关于“淘宝应对"双11"的技术架构分析”.数据产品的一个最大特点是数据的非实时写入.

  9. apache kafka系列之性能优化架构分析

    apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

随机推荐

  1. nodejs+express+socket.io

    其实官网文档清楚了  https://socket.io/get-started/chat/ 但是因为之前写的是nodejs+express, socket.io是后加的, 还是有小坑 服务器端: 官 ...

  2. 4 - BFS & Topological Algorithm

    615. Course Schedule https://www.lintcode.com/problem/course-schedule/description?_from=ladder&& ...

  3. (2)OSi模型

    osi七层模型 #(应用层,表示层,会话层) => 应用层 => 表达一个数据信息 # 传输层 port(端口) tcp/udp协议 硬件设备:四层交换机 四层路由器 # 网络层 ip协议 ...

  4. [名词解释 ] transparent

    1.材质,效果透明. 2.思想透明,容易获取(思维简单,单纯) 3.后台静默(of a process or interface) functioning without the user being ...

  5. Xshell利用lrzsz工具上传下载

    直接安装这个lrzsz工具 yum install lrzsz 上传 rz 下载 sz

  6. <a> 标签详解

    一.<a> 标签的样式 在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接带有下划线而且是红色的 我们可以使用CSS伪 ...

  7. git连接不上远程仓库---visualstudio提交代码报错:no upstream configured for branch 'master'

    1,新建文件夹,在文件下下鼠标右键git bush--->git init,初始化仓库: 2,设置gitthub仓库地址:git remote add origin https://github ...

  8. 2015-10-28 C#4

    五.继承 5.1 父类又称(基类,超类)是被继承的类,子类又称派生类. 5.2 A:B,A就叫子类,B叫父类,B里面所有的成员(字段,方法)都会被A继承. B里面的私有成员,A也是继承下来了的,只是没 ...

  9. js 如何判断数组元素是否存在重复项

    1.如何判断数组元素是否存在重复项 1)定义测试数组 //定义测试的数组(1个没有重复元素,1个有重复元素) var arr1 = new Array("111","33 ...

  10. NullPointerException空指针异常——没有事先加载布局文件到acitivy——缺少:setContentView(R.layout.activity_setup_over);

    空指针异常: 04-27 01:13:57.270: E/AndroidRuntime(4942): FATAL EXCEPTION: main04-27 01:13:57.270: E/Androi ...