进程基本概念

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

对于一个进程来说,它最核心的内容可以分为两个部分。第一个是它的内存,另一个部分是它的上下文环境。

在操作系统当中,是可以运行多个进程的。对于一个进程来说,它可以调用系统函数来创建子进程。如下图所示:

\1.PNG

需要注意的是:

  • 子进程会复制父进程的内存空间和上下文环境

  • 修改某个子进程的内存空间,不会修改父进程或其他子进程的内存空间

Swoole本身也是一个多进程的模型,它有多个worker进程和自己的master进程,多个worker进程之间创建的变量是不会通用的。

进程间通讯

进程间通讯的方式有很多种,其中一种是共享内存。共享内存是操作系统当中一种比较特殊的内存,它并不属于任何进程,也不需要依赖于进程而存在。可以调用系统函数来创建一片共享内存,并指定它的索引,通过索引,任何一个进程都可以在这片内存空间申请内存空间并在储存一定值。

要点:

  • 共享内存不属于任何一个进程

  • 在共享内存中分配的内存空间可以被任何进程访问

  • 即使进程关闭,共享内存仍然可以继续保留

提示:可以使用命令ipcs -m来查看共享内存

Swoole 结构

在过去用PHP写web应用,是需要依赖于nginx这样的web服务器和php-fpm解析的。php-fpm同样也是一个多进程的php解析器,当一个请求过来的时候,php-fpm会创建一个新的进程来处理这个请求,这样很大程度上系统开销是用于创建和销毁进程,导致整个程序的响应效率并不是非常的高。swoole和php-fpm采用了完全不同的架构,如下图所示:

\2.PNG

整个swoole扩展可分为三层。第一层master进程,这个进程是swoole的主进程。这个进程是用于处理swoole核心的时间驱动的。在这个进程当中拥有若干个reactor线程,在每一个子线程当中都运行了epoll函数的实例,swoole所有的对于事件的监听都会在这些线程当中实现。
第二层是manager进程,这是一个管理进程,用于创建管理下一次的woker进程和task worker进程。
第三层是工作进程,分为两个类型,一类是worker进程,这是主逻辑进程,用于处理来自客户端的请求。另一类是task worker进程,是异步工作进程,主要用于处理一些耗时较长的同步任务。

整个响应的流程如下:
当一个新的客户端连接来到时,首先会被main reactor接收到,然后将这个连接的读写操作监听注册到对应的reactor线程当中,并通知worker进程处理对应onConnect的回调。
当客户端发送数据之后,reactor线程会收到这些数据,并通过管道发送给worker进行处理。
worker进程如果需要投递任务,它就会通过管道或者消息队列(可以配置)发送给task worker进程。task worker进程处理完成之后,返回给worker,worker通知reactor线程发送数据给客户端。
当worker进程出现意外,或者处理一定次数的请求关闭后,manager进程会重新创建一个新的worker进程,保证整个系统当中worker进程的数目是固定的。


参考网站:



登陆发表评论