I/O模型概述

1. 什么是I/O

  • I/O就是计算机内存与外部设备之间拷贝数据的过程
  • 比如从内存、从网络中、从硬盘

2. 什么是I/O模型

  • 当你的程序通过CPU发起读请求,外部数据从外部设备拷贝到内存需要一定的时间,此时你的程序是继续等待还是直接返回后一直询问数据是否准备好
  • I/O模型就是解决上述问题

2.1 以网络读取为例理解5种I/O模型

  • 情景:当用户线程发起I/O操作时,网络数据读取操作会经历两个步骤
    • 用户线程等待内核将数据从网卡拷贝到内核空间
    • 内核将数据从内核空间拷贝到用户空间

2.1.1 同步阻塞I/0

  • 用户线程发起read调用后阻塞,让出CPU
  • 内核等待网卡数据到来,把数据从网卡拷贝到内核空间,再从内核空间拷贝到用户空间,接着把用户线程唤醒

2.1.2 同步非阻塞I/O

  • 用户不断的发起read调用,数据没到内核空间时,每次都返回失败。
  • 直到数据到了内核空间,这一次read调用后,在等待数据从内核空间拷贝到用户空间这段时间里,线程还是阻塞的。等数据到了用户空间后,再把线程唤醒

2.1.3 I/O多路复用

  • 用户线程的读取操作分为两步;线程先发起select调用,目的询问内核数据准备好了吗?等内核把数据准备好了,用户线程再发起read调用
  • 在等待数据从内核空间拷贝到用户空间这段时间,线程还是阻塞的(这么看来后面和同步非阻塞很类似)
  • 不同点在于一次select调用可以向内核查多个数据通道的状况,也就是说一个线程可以处理多个I/O

2.1.4 信号驱动I/O

2.1.5 异步I/O

  • 用户线程发起read调用的同时注册一个函数,read立即返回
  • 等内核将数据准备好后,再调用指定的回调函数完成处理
  • 这个过程中,用户线程一直没有阻塞

3. 同步与异步;阻塞与非阻塞

3.1 阻塞与非阻塞

  • 发起读取请求时,当数据还没准备好时,是继续等待还是立即返回

3.2 同步和异步

  • 如果请求方从发起请求到数据最后完成这一段都需要自己参与,就是同步;反之如果应用发送完指令就不再参与过程,只等待最终完成结果的通知就是异步
posted @ 2020-11-16 14:42  coderrrrrrr  阅读(169)  评论(0)    收藏  举报