Post

IO模型

1
2
1、同步、异步是相对于任务来说,即一个任务的处理,是否需要等待依赖任务的处理结果,才能继续向下执行;异步的消息通知采用回调的方式,而同步没有。
2、阻塞、非阻塞相对于线程而言,即线程在调用结果返回之前,是挂起,还是继续处理其他任务,得到调用结果返回通知后继续执行。

同步

  • 一个任务的完成,需要等待所依赖任务的完成结果,才能继续向下执行。是一种可靠的任务序列

异步

  • 一个任务的完成,不需要等待所依赖任务的完成结果,就可以继续向下执行。是一种不可靠的任务序列

阻塞

  • 线程在调用结果返回之前,挂起,等到调用结果返回再继续执行

非阻塞

  • 线程在调用结果返回之前,线程进行上下文切换,继续处理其他任务

同步阻塞

  • 当前任务暂停执行,当前线程挂起
  • 效率最低

同步非阻塞

  • 当前任务暂停执行,线程频繁上下文切换,监听依赖任务的结果
  • 上下文切换开销大

异步阻塞

  • 当前任务暂停执行,依赖任务的结果回调通知。线程没有挂起。
  • 线程不是因为处理任务阻塞,而是因为等待消息阻塞

异步非阻塞

  • 当前任务暂停执行,依赖任务的结果回调通知。
  • 当前线程通过上下文切换,去处理其他任务
  • 效率最高

Linux五种IO模型

同步阻塞IO(blocking IO)

  • 用户程序发起系统调用,线程挂起
  • 直到数据从内核复制到用户空间,并返回给用户程序

同步非阻塞IO(nonblocking IO)

  • 用户程序发起系统调用,操作系统立即返回error,并开始准备数据
  • 用户程序并没有挂起,采用轮询的方式发起系统调用,检查内核数据是否准备好

IO多路复用(IO multipleing)

  • 多路:多个socket;复用:复用一个线程
  • select、poll、epoll函数可以实现多路复用
  • select阻塞用户程序,可以同时监听多个socket
  • 任何一个socket的内核完成数据复制,就会通知用户程序到用户空间读取数据

信号驱动式IO

  • 用户程序发起系统调用后立即返回
  • 系统内核准备好数据并复制到用户空间时,通过信号通知用户程序
  • 用户程序再调用recvfrom获取数据

异步非阻塞IO

  • 用户程序提交系统调用后立即返回,用户进程可以去处理其他事情
  • 内核准备数据,复制到用户空间,并将数据交个用户进程

参考

  • 同步、异步、阻塞、非阻塞:https://www.jianshu.com/p/aed6067eeac9
  • Linux IO模型:https://www.jianshu.com/p/486b0965c296
This post is licensed under CC BY 4.0 by the author.