zoukankan      html  css  js  c++  java
  • php io多路复用

    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


    如果遇到什么不懂的地方直接关注公众号留言(本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。)
    作者:newmiracle
    出处:https://www.cnblogs.com/newmiracle/

     
  • 相关阅读:
    前端提示“页面正在载入”的功能实现
    JSON那些事
    如何让nodejs同步操作
    nodejs的一些局限
    《javascript高级程序设计》读书笔记——作用域
    svn教程
    从雷军谈小米中的一些思考
    云Vps安全设置
    不同服务器数据库之间的数据操作
    C#语言的Excel文件导入导出
  • 原文地址:https://www.cnblogs.com/newmiracle/p/14489411.html
Copyright © 2011-2022 走看看