IO模型
1
2
1、同步、异步是相对于任务来说,即一个任务的处理,是否需要等待依赖任务的处理结果,才能继续向下执行;异步的消息通知采用回调的方式,而同步没有。
2、阻塞、非阻塞相对于线程而言,即线程在调用结果返回之前,是挂起,还是继续处理其他任务,得到调用结果返回通知后继续执行。
同步
- 一个任务的完成,需要等待所依赖任务的完成结果,才能继续向下执行。是一种可靠的任务序列
异步
- 一个任务的完成,不需要等待所依赖任务的完成结果,就可以继续向下执行。是一种不可靠的任务序列
阻塞
- 线程在调用结果返回之前,挂起,等到调用结果返回再继续执行
非阻塞
- 线程在调用结果返回之前,线程进行上下文切换,继续处理其他任务
同步阻塞
- 当前任务暂停执行,当前线程挂起
- 效率最低
同步非阻塞
- 当前任务暂停执行,线程频繁上下文切换,监听依赖任务的结果
- 上下文切换开销大
异步阻塞
- 当前任务暂停执行,依赖任务的结果回调通知。线程没有挂起。
- 线程不是因为处理任务阻塞,而是因为等待消息阻塞
异步非阻塞
- 当前任务暂停执行,依赖任务的结果回调通知。
- 当前线程通过上下文切换,去处理其他任务
- 效率最高
Linux五种IO模型
同步阻塞IO(blocking IO)
同步非阻塞IO(nonblocking IO)
IO多路复用(IO multipleing)
- 多路:多个socket;复用:复用一个线程
- select、poll、epoll函数可以实现多路复用
- select阻塞用户程序,可以同时监听多个socket
- 任何一个socket的内核完成数据复制,就会通知用户程序到用户空间读取数据
信号驱动式IO
异步非阻塞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.