【参考文章】:如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?
【参考文章】:【NIO系列】——之IO模型
1. 阻塞和非阻塞 , 同步和异步
1.1 阻塞和非阻塞
调用方是否需要等待直到调用返回。
阻塞:指的是调用方进行调用之后一直等待别的事情什么都不做。
非阻塞:指的是调用方调用之后先去忙别的事情。
1.2 同步和异步
调用结果的获取方式。
同步:进程自己负责IO操作,将数据从系统内核拷贝到用户程序的缓冲区;
异步:操作系统负责IO操作,将数据从系统内核拷贝到用户程序的缓冲区,并通知程序。
2. Linux下五种IO模型
一个IO操作一般分为两部分:
- 进程进行系统调用 recvfrom,等待返回数据;
- 数据返回后,系统内核将数据拷贝到进程空间。
2.1 阻塞式IO
IO调用后,等待数据返回后,将数据从内核拷贝到缓冲区;
拷贝数据的过程是阻塞的。
2.2 非阻塞式IO
在IO调用后,一直去轮询结果。只能监听一个 socket。
拷贝数据的过程是阻塞的。
2.3 多路复用IO
在IO调用后,一直去轮询结果。一个 select 可以监听多个 socket ,有一个 socket 的 结果返回即可返回调用。
拷贝数据的过程是阻塞的。
2.4 信号驱动式IO
调用之后,当数据准备好后,系统通知程序,然后再拷贝数据。监听一个 socket。
拷贝数据的过程是阻塞的。
2.5 异步IO
调用后立即返回,数据准备好后系统将数据拷贝到进程的空间,然后通知程序。
拷贝数据的过程不会阻塞。