同步阻塞IO,同步非阻塞IO,异步IO,IO多路复用
同步异步是一个概念,阻塞与非阻塞是另一个概念,多路复用又是另一个概念。相互联系,但是概念不同
同步与异步
同步:当一个进程需要执行I/O操作时,如果进程需要一直等待操作结果的返回,甚至被挂起,那么这就属于同步的范畴。(php的IO基本都是同步)
异步:如果在等待I/O结果返回的过程中,进程可以执行其他代码,那么这就属于异步(JS/NodeJs的IO支持异步和同步,一般都使用异步。比如ajax
)
阻塞与非阻塞
要注意的一点是,如果一份任务采用异步模型
,那么它肯定是非阻塞的,同步模型才需要讨论阻塞与非阻塞。
阻塞:如果等待I/O的过程中,进程挂起,直到内核返回信息说I/O执行完毕,进程才继续执行接下来的代码,那么就属于阻塞
非阻塞:如果在等待I/O过程中,进程没有挂起,可以执行其他操作,但是每隔一段时间得主动去询问内核I/O执行完毕没有,那么就属于非阻塞
同步非阻塞与异步很相像,区别就在于当前进程需不需要去向内核询问I/O执行完毕了没有
多路复用
多路复用器,是在同步的IO情况下,为了通知线程就绪的IO连接。其中有select
、poll
、epoll
。
多路复用既有阻塞也有非阻塞。这里阻塞是需要挂起等待就绪的IO事件(等待就绪阶段),非阻塞是读写的时候是非阻塞的(数据处理阶段)。
在等待就绪阶段,select
、poll
、epoll
使用不同的方式。
前两种底层使用同步非阻塞的轮询;
后者epoll
使用事件驱动,但是用户进程依然处于阻塞状态,因此仍然属于同步阻塞。
由于linux下多数I/O都属于同步模型,如果遇到某个I/O执行时间过长时,会导致整个进程都被阻塞住. (这里有一点需要注意,即便是同步非阻塞模型,在I/O执行完毕拷贝到内存的过程当中,也是属于阻塞的)
为了解决这个问题,人们又提出了I/O多路复用技术,将I/O操作分离开(可以是多个I/O),利用一个线程做轮询操作,当哪个I/O操作执行完毕可以进行接下来的操作,就他通知相关的轮询函数,再由轮询函数执行接下来的操作,这就是I/O多路复用.
nginx 与 redis的多路复用
nginx:同步阻塞的epoll
。
redis:同步非阻塞的epoll
。因为是单线程的,处理等待就绪事件,还要LRU算法处理内存等。因此循环的调用epoll_wait
系统调用,在处理IO上比nginx低
技巧:
-
抓取进程中的系统调用:
strace
命令 -
/proc/进程ID/task
是线程ID为目录的结构;/proc/进程ID/fd
是文件描述符
参考:https://www.jianshu.com/p/4972e0d990f5
待阅读:
https://www.geek-share.com/detail/2491551860.html
https://www.zhihu.com/question/19732473
怎样理解阻塞非阻塞与同步异步的区别? - 大姚的回答 - 知乎 https://www.zhihu.com/question/19732473/answer/26101328
多路复用,更好的理解redis-netty-Kafka等热门技术 https://www.bilibili.com/video/BV11K4y1C7rm
- 阻塞IO 非阻塞IO IO多路复用 同步IO 异步IO
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
- 【转】IO多路复用,同步异步,阻塞和非阻塞
- 同步和异步 阻塞和非阻塞 IO多路复用和select总结
- 同步阻塞 IO、同步非阻塞 IO、多路复用IO 、 异步 IO
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
- IO五种模型(阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO)
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
- IO模式和IO多路复用(阻塞IO、非阻塞IO、同步IO、异步IO等概念)
- IO同步、异步与多路复用
- 阻塞,非阻塞IO和同步,异步IO
- linux下五种IO模型小结(阻塞IO、非阻塞IO、IO复用、信号驱动式IO、异步IO)
- 阻塞,非阻塞,IO多路复用
- 阻塞、非阻塞、多路复用、异步IO
- 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
- 深入理解非阻塞同步IO和非阻塞异步IO
- 同步阻塞、同步非阻塞、多路复用、select+事件循环+回调
- 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
- 非阻塞socket与io多路复用(没整理好)
- 阻塞,非阻塞IO和同步,异步IO