php io多路复用
1 首先说明 io多路复用只是为了在服务端上更方便更快速的读取数据
五种网络IO模型
目录
前段时间,我有个朋友因为拿快递和家里闹别扭了,今天我就借这事来讲讲五大网络模型
阻塞IO模型
第一天:
刘:今天因为拿快递被我妈骂了一顿
我:说来听听
刘:我本来在家里打扫家务,后来我妈让我去拿快递,等我到快递站的时候发现快递还没准备好,于是我就一直在那里等着啥也没干,等快递到了已经很晚了,我回到家,我妈不仅把我骂了一顿,而且还得继续干家务,我好命苦啊!
我:你没被揍都算好的了
看图说话:
我们把整个IO操作分为两阶段,等待数据准备阶段,和拷贝数据阶段
而阻塞IO模型,进行调用的时候,数据还未准备好,此时阻塞的等待数据准备,直到数据准备完成,阻塞的等数据拷贝完成,可以看到这两个阶段都是阻塞行为
什么是阻塞呢?
我们程序在执行的时候,需要挂起当前线程,等待调用结果的返回,就是阻塞
非阻塞IO模型
第二天:
刘:今天又让我取快递,咋办
我:你每隔一段时间就去看看快递准备好没有不就行了
刘:好主意啊兄弟!
看图说话:
可以看到,等待数据准备阶段是非阻塞的,而数据拷贝是阻塞的,虽然等待数据阶段变成了非阻塞,提升了时间利用率,但是频繁的调用recvfrom也是对cpu的一种消耗,而且响应的延迟增大,因为数据准备完成有可能是在两次轮询之间的任意时间完成,缺少时效性,影响了整体的吞吐量
什么是非阻塞呢?
很明显,相比阻塞行为,我们应用程序系统调用之后直接返回了结果,无需等待,此时就是非阻塞
io多路复用模型
第三天:
刘:兄弟兄弟,帮帮我,我妈让我去取50个快递!
我:莫慌,我记得有个APP可以监控所有物流的信息吗,你让他一直检查,等到物流信息变成已送达,你就去取那个快递,这不就得了
刘:哥,你也太机智了吧!
看图说话:
从阻塞行为上来看,IO多路复用模型和阻塞IO模型没有太大的区别,等待数据阶段和数据拷贝阶段都是阻塞行为,甚至还多了select函数的调用,但是IO多路复用模型的优势并不在于单个连接处理的更快,而是在于能更多的处理连接,即可达到在同一个线程内同时处理多个IO请求的目的。而阻塞IO模型中,必须通过多线程的方式才能达到这个目的。
IO多路复用模型使用了Reactor设计模式实现了这一机制,对Reactor设计模式感兴趣的可以看我的另一篇文章Netty和Redis都在用的Reactor到底是什么
而常用的IO多路复用方式有Linux上的select、poll和epoll和Java中的Selector
信号驱动IO模型
第四天:
刘:哥啊,
我:又咋了
刘:我这好累啊,你全让我阻塞了,我没法干家务了,有没有什么办法让我多干点家务
我:没问题,你可以和快递站建立个信号啊,等快递到了,让他直接给你打电话就行了
刘:???怎么不早说
看图说话:
用户线程与内核建立SIGIO的信号处理程序,这样用户线程就可以往下执行程序,等到数据准备完成的时候,向用户线程发送信号,接收到信号之后,再去进行数据的拷贝,整个过程中,等待数据阶段是非阻塞的,数据拷贝是阻塞的
不过这个信号驱动IO模型一般用在UDP中,因为TCP的信号产生的事件太多了,所以很少使用
异步IO模型
第五天:
刘:哥,你说我为啥不直接用顺丰,直接送到家,我还能继续干家务
我:聪明啊,这就是我要告诉你的最后一个办法
刘:我感觉你之前在玩我 /表情
看图说话:
应用程序调用aio_read会直接返回,此时等待数据阶段是非阻塞的,然后等到内核将数据拷贝完成,拷贝阶段也是非阻塞的,等到再次递交aio_read信号,完成响应
异步IO ,数据等待阶段和数据拷贝阶段都是非阻塞行为,全程由内核进行处理和通知
既然讲到了异步,这里说一下,除了最后一种,以上4种都是同步IO
在这里IO模型中的同步异步指的是
最后的数据拷贝阶段是系统调用完成的还是自动完成的
————————————————
版权声明:本文为CSDN博主「果咩z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pz5942/article/details/106280313
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/18978.html