zoukankan      html  css  js  c++  java
  • 【TCP】tcp协议通信中io

    阻塞IO

    recv,接收数据,若没有,将阻塞,

    当对方发数据来后,linux内核缓冲区得到数据,

    内核数据复制到recv()调用所在的用户空间,

    阻塞解除,进行下一步处理,

    非阻塞IO

    轮询调用recv函数接收数据,

    没有数据,立即返回,然后继续调用,

    根据返回值来判定时候读到数据,

    这种方式大量消耗CPU,应用范围小,一般和selectIO复用配合使用,

    IO复用

    select机制,可以轮询多个fd的状态变化,

    进而决定recv是否要进行数据的读,而不致像上面两种极端,

    但是所轮询的多个fd都没有状态变化,也将阻塞,

    同时select也可以设置等待时间,避免干等,

    信号驱动IO

    建立一个信号,当有数据到来的时候,通知上层应用去读取数据,

    这种模型用的较少,信号发送有延迟,处理数据有延迟,内核数据也可能发生变化,

      为什么说信号驱动的延迟大呢?

      因为有数据了,得发送一个信号去通知上层应用,

      通知之后,不一定马上来读取,

      有机会读取了,还得跑过来读

    异步IO

    异步IO,上层应用提供了一个应用层的缓冲区,

    有数据了,内核会主动,,的把数据塞到应用层提供的这个缓冲区,而不用像上面那样有那么的工序去主动地读,不过这个复杂工序你暂时没办法了解很深入,但是可以肯定的是,主动读肯定涉及到很多过程处理,

  • 相关阅读:
    Django-ORM和MySQL事务及三大范式介绍
    django-视图层与模板层
    django初步--+urls解析
    django前戏
    python web开发中跨域问题的解决思路
    MySQL显示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)解决方法
    xpath
    HTTP请求方法
    JavaScript 对象
    JavaScript 关键字
  • 原文地址:https://www.cnblogs.com/itplay/p/11375441.html
Copyright © 2011-2022 走看看