2021.11.29补充
BIO、NIO、AIO的举例
你准备下载10个文件。
BIO就是单线程下载,一个下载完了,再去下载另一个,如果某个文件卡在那里了,它也会死等。
NIO就是多线程下载,支持同时下载,哪个网络资源准备好了,就可以下载了,可以多个文件同时进行。有一个文件卡了,不影响其他线程的下载。
AIO不仅仅是多线程下载,下载完了还告诉你一声,我已经下载完了哈。
阻塞与非阻塞
资源不可用时,阻塞等待,此时不能进行其他操作,这就叫阻塞。
资源不可用时,立即返回,此时可以进行其他操作,这就叫非阻塞。
同步和异步
同步操作IO指的是,通过轮训或等待的方式,等待IO操作结果。
异步指的是,通过结果回调通知的方式,实现IO操作结果的获取。
阻塞IO(BIO)
死等。你只要不来,我就不走。
1. 等待数据可用。
2. 等待数据加载到内核缓冲区
3. 等待数据从内核缓冲区复制到用户空间。
示例:界面的模态窗,你不输入点什么,或者关闭当前窗口,休想继续下一步。
同步IO在等待资源可用,以及资源加载的过程都是同步阻塞进行的。
轮询式非阻塞IO(NIO)
一会儿问你来不来,你说不来。一会再来问问你来不来,直到你来。(一会催你一下,一会催你一下,只能接待你一个人)
示例:通过while循环的方式,等待输入为“q”的时候,控制台退出。直到等到一个条件的成立,才会结束。
非阻塞IO采用轮训的方式,检查资源的可用性,在资源复制的过程中,仍然是同步等待的。
多路复用IO
不再采用轮训的方式,查看资源的可用性,而是资源准备好后,内核主动通知到应用程序。有个哨兵负责监听资源的可用性,一旦资源可用,将通知到进程进行处理。
信号驱动IO
我跟你说个电话,你要来的话给我打电话,我再来接待你。
资源准备阶段采用信号的方式进行异步告知,资源拷贝阶段仍然是阻塞式,
异步非阻塞IO(AIO)
我找个人来等你,接待完了再跟我说一声。
资源的可用性阶段和资源拷贝阶段都是异步的。