5大IO模型 |
|
1.阻塞式IO模型(blocking i/o) |
用户空间一直等待内核处理,不做其他事情 老师一次只能解答一个同学的问题 1)创建socket 2)监听socket变化,看是否有可以使用的 stream_socket_accept 3)处理信息 4)关闭连接 https://github.com/Deng12/swoole/blob/master/src/Blocking/Worker.php |
2.非阻塞式I/O模型(non-blocking i/o) |
一边做其他的,然后再每隔一段时间看次内核是否处理完 轮询 定时去问有没有解决 缺点:不断地轮询内核,占用大量的cpu时间,资源利用率低,web服务器不适用这种模型 |
3.I/O复用模型 / 多路复用 |
本质是基于非阻塞模型而延伸的,在服务端中建立一个socket池,存放连接的socket select, poll, epoll 都是I/O多路复用的具体的实现 认识多个老师(随便逮住哪个就哪个) 异步表现在哪里? 不影响开始,结束代码的执行(用户空间),阻塞在于内核(内核空间) 复用的理解: 不会断开连接,还是会回复 stream_select 可以检测客户端与服务端连接之后的socket是否可用 $sosckets = [ ]; 记录着很多的socket stream_select($sockets)返回出$read存的内容为可用的socket连接 常见报错: 1)socket超标 ulimit 2)超出了检查上限个数 |
4.信号驱动式I/O模型 |
QQ的弹窗的操作,收到消息才会触发 用户空间角度,完成某件事之后给我一个信号(用户空间发送一个留言(信号),等内核处理完之后再处理,其他时间做别的) 可以设置多个信号 pcntl_signal 准备信号 posix_kill 安装信号 pcntl_signal_dispatch 分发 缺点: 1)大量的信号,会导致信号队列溢出 2)需要配合多线程使用 好处: 非阻塞 |
5.异步I/O模型 |
在某一个节点做某个事情 (预约 xx点不见不散,事先说好的) 在用户空间设置一个事件,内核只要到这个事件点就会触发;类似于web前端jquery点击,利用了linux事件event epoll Event Event在同一个文件不能嵌套定义,而需要转为引用式的嵌套,有可能存在覆盖的问题;需要额外定义一个类,完了需要移除 1)$eventBase = new EventBase(); 2)自定义事件 3)事件添加到库(入库) $event1->add() 4)执行 $eventBase->loop(); |
异步IO != reactor,因为异步IO有多种方法 reactor = 异步IO |
|
信号驱动 && 异步 区别 |
信号驱动: 用户空间完成后给我一个信号 异步: 某个节点做某个事情 |
阻塞的长链接测试 |
1) blocking阻塞模型(会阻塞) 2) IO多路复用(优先考虑) Stream_select 创建与客户端的连接 / 发送信息 实际上也会阻塞,单线程,一次只能完成一件事,串行 |
|
swoole( 网络IO 六)
猜你喜欢
转载自blog.csdn.net/converoscar/article/details/104258807
今日推荐
周排行