• 图解I/O模型


      本文带你鸟瞰I/O模型全貌,希望可以让你对I/O模型有一个直观的认识

    什么是I/O?I/O的过程?同步阻塞 I/O同步非阻塞 I/OI/O多路复用异步I/O

    什么是I/O?

      I/O就是计算机内存和外部设备之间拷贝数据的过程。
      那么I/O模型主要解决的问题是什么呢?程序通过CPU,请求外部设备上的数据。而数据拷贝到内存里需要一定的时间,在这个时间里,程序是主动让出CPU时间?还是让CPU不断的去查数据是否是到了?
      I/O模型就是用来解决这个决策问题。

    I/O的过程?

      首先我们要明白。I/O通讯涉及到两个非常重要的对象。
      1.程序执行时的用户线程
      2.操作系统内核
      操作系统将进程的地址空间分为用户空间内核空间,用户线程是没有办法从内核空间直接获取数据,需要将数据从内核空间拷贝到用户空间,再获取用户空间的数据。
      所以任何I/O模型,网路数据的读取都可以分为2部分。
      1.用户线程等待内核将网卡中的数据,拷贝到内核空间
      2.内核将数据从内核空间拷贝到用户空间。
      各个I/O模型的区别就是实现这两个步骤的方法不同

    同步阻塞 I/O

      用户线程发起read请求后就阻塞了,让出CPU,内核会等待网卡数据的到来,然后吧数据拷贝到内核空间,从内核空间拷贝到用户空间,再唤醒用户线程。

    同步非阻塞 I/O

      用户线程不断发起read请求,数据没到内核空间时,每次都返回失败,直到数据到了内核空间,此时再调用read会阻塞,等待内核将内核空间的数据拷贝到用户空间,再唤醒用户线程。

    I/O多路复用

      这里把用户线程的读取操作分为了2步,线程先发送select调用,问内核是否将数据准备好了,等数据准备好了,用户线程再发起read调用,在等待数据从内核空间拷贝到用户空间这段时间里,线程仍是阻塞的,一次select请求可以向内核查询多个数据通道(channel)的状态,所以才叫多路复用

    异步I/O

      用户发起的read调用,会注册一个回调函数,read立即返回,等到内核将数据准备好后,调用回调函数完成处理,整个过程中,用户线程一直没有被阻塞

      最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!

  • 相关阅读:
    HAproxy 1.5 dev14 发布
    IBM/DW 使用 Java 测试网络连通性的几种方法
    Skype 4.1 Linux 发布,支持微软帐号登录
    Dorado 7.1.20 发布,Ajax的Web开发平台
    Aspose.Slides for Java 3.0 发布
    开发版本 Wine 1.5.18 发布
    BitNami Rubystack 开始支持 Ruby 2.0
    XWiki 4.3 正式版发布
    Silverlight实例教程 Out of Browser的Debug和Notifications窗口
    Silverlight实例教程 Out of Browser与Office的互操作
  • 原文地址:https://www.cnblogs.com/nedulee/p/12563063.html
Copyright © 2020-2023  润新知