您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Workerman中你必须知道的几个概念

2026/1/4 18:53:42发布36次查看
下面由workerman使用教程栏目给大家介绍关于workerman中你必须知道的几个概念,希望对需要的朋友有所帮助!
workerman是一款纯php开发的开源高性能的php socket 服务框架。它不是一个mvc框架,而是一个更底层更通用的socket服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器。
推荐:workerman教程
实际上workerman类似一个php版本的nginx,核心也是多进程+epoll+非阻塞io。workerman每个进程能维持上万并发连接。由于本身常住内存,不依赖apache、nginx、php-fpm这些容器,拥有超高的性能。
同时支持tcp、udp、unixsocket,支持长连接,支持websocket、http、wss、https等通讯协以及各种自定义协议。拥有定时器、异步socket客户端、异步mysql、异步redis、异步http、异步消息队列等众多高性能组件。
首先需要了解一下几个核心概念,1.多进程 2.epoll 3.非阻塞io
1、多进程:
首先什么是进程呢,一个进程包括了代码、数据和分配给进程的资源(内存),在计算机系统里直观地说一个进程就是一个pid。操作系统保护进程空间不受外部进程干扰,即一个进程不能访问到另一个进程的内存。
有时候进程间需要进行通信,这时可以使用操作系统提供进程间通信机制。通常情况下,执行一个可执行文件操作系统会为其创建一个进程以供它运行。
但如果该执行文件是基于多进程设计的话,操作系统会在最初的进程上创建出多个进程出来,这些进程间执行的代码是一样,但执行结果可能是一样的,也可能是不一样的。
为什么需要多进程?最直观的想法是,如果操作系统支持多核的话,那么一个执行文件可以在不同的核心上跑;即使是非多核的,在一个进程在等待i/o操作时另一个进程也可以在cpu上跑,提高cpu利用率、程序的效率。
在linux系统上可以通过fork()来在父进程中创建出子进程。一个进程调用fork()后,系统会先给新进程分配资源,例如存储数据和代码空间。然后把原来进程的所有值、状态都复制到新的进程里,只有少数的值与原来的进程不同,以区分不同的进程。
fork()函数会返回两次,一次给父进程(返回子进程的pid或者fork失败信息),一次给子进程(返回0)。至此,两个进程分道扬镳,各自运行在系统里。
2、非阻塞io:
首先什么是io,即input与output的操作。网络io的本质是socket的读取,socket在linux系统被抽象为流,io可以理解为对流的操作。对于一次io访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
所以说,当一个read操作发生时,它会经历两个阶段:
第一阶段(等待数据):等待数据准备 (waiting for the data to be ready)。
第二阶段(拷贝数据):将数据从内核拷贝到进程中 (copying the data from the kernel to the process)
对于socket流(即io)而言,
第一步:通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区。
第二步:把数据从内核缓冲区复制到应用进程缓冲区。
网络io的模型大致有如下几种:
同步模型(synchronous io)
阻塞io(bloking io)资源不可用时,io请求一直阻塞,直到反馈结果(有数据或超时)。在linux中,默认情况下所有的socket都是blocking,blocking io的特点就是在io执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。
非阻塞io(non-blocking io)资源不可用时,io请求离开返回,返回数据标识资源不可用。在linux中,如果数据还没有准备好,那么它并不会block用户进程,内核马上返回给进程,说明这个命令不能立即满足(eagain 或 ewouldblock)。因此非阻塞就是使用轮询的(polling)方式来实现。
多路复用io(multiplexing io) io multiplexing就是我们说的select,poll,epoll,有些地方也称这种io方式为event driven io。select/epoll的好处就在于单个process就可以同时处理多个网络连接的io。
它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。在io multiplexing model中,实际中,对于每一个socket,一般都设置成为non-blocking。
但是,整个用户的process其实是一直被block的。只不过process是被select这个函数block,而不是被socket io给block。所以io多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的i/o系统调用如recvfrom之上。
信号驱动式io(signal-driven io)
异步io(asynchronous io)用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。
然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。
3、epoll : epoll现在就很好理解了,epoll就是linux内核为处理大批量文件描述符而作了改进的poll,是linux下多路复用io接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率。
ps.几个需要注意的点:
1:io多路复用是同步阻塞模型还是异步阻塞模型?
同步是需要主动等待消息通知,而异步则是被动接收消息通知,通过回调、通知、状态等方式来被动获取消息。io多路复用在阻塞到select阶段时,用户进程是主动等待并调用select函数获取数据就绪状态消息,并且其进程状态为阻塞。所以,把io多路复用归为同步阻塞模式。
 2:到底什么是并发,高并发到底是一张怎么样的状态?
高并发的程序一般使用同步非阻塞方式而非多线程 + 同步阻塞方式。要理解这一点,首先要看一下并发和并行的区别。也就是说并发数是指同时进行的任务数(如同时服务的 http 请求),而并行数是可以同时工作的物理资源数量(如 cpu 核数)。
通过合理调度任务的不同阶段,并发数可以远远大于并行度,这就是区区几个 cpu 可以支持上万个用户并发请求的奥秘。在这种高并发的情况下,为每个任务(用户请求)创建一个进程或线程的开销非常大。而同步非阻塞方式可以把多个 io 请求丢到后台去,这就可以在一个进程里服务大量的并发 io 请求。
以上就是workerman中你必须知道的几个概念的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product