swoole( 网络IO 六)

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

创建与客户端的连接 / 发送信息

实际上也会阻塞,单线程,一次只能完成一件事,串行

 

发布了66 篇原创文章 · 获赞 2 · 访问量 4658

猜你喜欢

转载自blog.csdn.net/converoscar/article/details/104258807
今日推荐