今天面试被问到这个问题,之前看书有看到,但是书上讲的不够清楚,也没记住,所以这次认真查了资料,在这做记录,好好记住它。
首先,我们要知道一个事情,在执行read操作时,会经历2个阶段:
1.等待数据准备
2.将数据从内核拷贝到进程中
其实就是一个就绪事件,阻塞IO和非阻塞IO大家应该都很熟悉,它们的区别就在于第一步,非阻塞IO不会阻塞第一步,但是第二步还是会阻塞的。所以,阻塞IO,非阻塞IO,IO复用(select/poll/epoll)都是同步IO(这几个的概念这里就不再描述了,上面参考文章有详细的解释)。
异步IO是什么呢,就是上面的2个步骤全部交给内核去完成,然后最后得到内核通知一个完成事件,这是真正的非阻塞,这就是2者的区别。
总结起来,其实就是同步IO收到的是就绪事件(第一步完成),异步IO收到的是完成事件(第二步完成)。目前我接触过IO还都是同步IO模型,等我接触到异步IO模型后我会再做记录。