首先,我们来熟悉一下基本知识,再回顾前几篇文章!
1:阻塞/非阻塞–这两个概念是针对 IO 过程中进程的状态来说的
阻塞 IO 是指调用结果返回之前,当前线程会被挂起
非阻塞指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回
2:同步/异步–这两个概念是针对调用返回结果来说的
同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回
当一个异步过程调用发出后,调用者不能立刻得到结果,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
3:多路复用(IO/Multiplexing)
为了提高数据信息在网络通信线路中传输的效率,在一条物理通信线路上建立多条逻辑通信信道,同时传输若干路信号的技术就叫做多路复用技术。
对于 Socket 来说,应该说能同时处理多个连接的模型都应该被称为多路复用,目前比较常用的有 select/poll/epoll/kqueue 这些 IO 模型.
4:惊群效应
惊群问题是由于系统中有多个进程在等待同一个资源,当资源可用的时候,系统会唤醒所有或部分处于休眠状态的进程去争抢资源,但是最终只会有一个进程能够成功的响应请求并获得资源,但在这个过程中由于系统要对全部的进程唤醒,导致了需要对这些进程进行不必要的切换,从而会产生系统资源的浪费.
更多资料可参考如下链接
http://wenda.workerman.net/?/question/179
https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
我们接着回顾下前几篇文章的思绪
单进程阻塞模型,一次只能处理一个连接,效率极低!
多进程阻塞模型,一个进程处理一个连接!
socket服务的模型以及实现(3)–单进程IO复用select
单进程IO复用(select),同时处理的连接数不受限于进程数!
socket服务的模型以及实现(4)–单进程IO复用libevent
单进程IO复用(libevent),同时处理的连接数比select要好很多!
socket服务的模型以及实现(5)–多进程IO复用libevent
多进程IO复用(libevent),可以更好的利用多核!
socket服务的模型以及实现(6)–多进程IO复用libevent–端口复用技术
增加了端口复用技术,性能更好!
通过几上几篇文章,对于我们用PHP写个socket服务有了基本的服务模型认识!