• 五种网络IO模型


    一:概述

           在网络编程中,阻塞、非阻塞、同步、异步经常被提到,下面谈一下I/O在生活中的钓鱼场景(纯属虚构,如有雷同,纯属巧合)。

           1.阻塞式I/O:开始钓鱼,眼睛一直盯着,鱼儿上钩拉杆。

           2.非阻塞式I/O:开始钓鱼,你一直怀疑鱼儿在偷吃鱼饵,一直拉杆,没有鱼,然后重复放杆拉杆,直到有钓上鱼。

           3.I/O复用:开始钓鱼,但是你同时放了多条鱼竿,然后开始眼睛不断查看多条鱼竿,直到叼上鱼。

           4.信号驱动:开始钓鱼,但是你的鱼竿很特殊,鱼儿上钩会发出声音通知你,你可以同时干别的事。

           5.异步I/O:姜太公钓鱼升级版,鱼儿不仅愿者上钩而且还会自己跳到装鱼的容器中,连拉杆都省了。

    二:网络IO模型

    1.阻塞I/0

                  

                     应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。

    2.非阻塞I/O

                   

                   当系统请求的I/O操作无法完成时,不要将进程/线程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。

    3.I/O复用

                 

                    I/O复用模型会用到select、poll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

    4.事件(信号)驱动I/O

               

                   首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

                   水平触发的事件驱动机制;内核通知进程来读取数据,进程没来读取数据,内核需要一次一次的通知进程;

                   边缘触发的事件驱动机制;内核只通知一次让进程来读取数据,进程可以在超时时间之内随时来读取数据。

                   nginx就采用了边缘触发的事件驱动机制,这就是为什么nginx的并发性比apache好,当然nginx的性能比apache好,还有其它方面,如nginx支持异步I/O,mmap(内存映射)等等

    5.异步I/O

               

                   当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。

                   

  • 相关阅读:
    sass和compass的配置
    MAC apache配置
    js库
    Tomcat7 配置 ssl
    同一对象内的嵌套方法调用AOP失效原因分析
    Spring Boot文件无法下载问题排查过程记录
    Apache、Spring、Cglib的beancopy效率对比
    使用in作为查询条件优化SQL并使用set筛选结果集
    Java使用foreach遍历集和时不能add/remove的原因剖析
    Python爬虫实践——爬取网站文章
  • 原文地址:https://www.cnblogs.com/dyg0826/p/11386084.html
Copyright © 2020-2023  润新知