当前位置: 首页 > 工具软件 > 异步式 I/O > 使用案例 >

同步I/O(阻塞I/O),异步I/O(非阻塞)

翟元凯
2023-12-01
异步io设计,是指设计者在通知内核进行io操作后,不会等待io动作完成,而是转而去完成其他工作,内核在io完成后再发信号告知调用者io已经完成,设计目的是提高效率。
同步io设计,是指设计者必须确认io是否已经完成(不用管是成功的还是不成功的),再此基础上才能继续往下执行其他工作。
显然,异步io设计不会显式调用read,write,select等,因为这些工作是由内核完成并告知你的。也就是说,在异步设计中,讨论采用阻塞还是非阻塞是毫无意义的。
而同步io就不一样了,设计者必须确认io的结果后才能继续下面的工作。如果调用阻塞式io,则调用者会一直等到条件符号(或被信号中断),阻塞式函数返回。

如果调用非阻塞式io,则不管条件是否成立其立即返回。调用者依据其io结果(成功/失败等),进行下步工作(再进行io或执行其他工作)。



按照常规,同步IO分成阻塞(block)和非阻塞(non-blocking)。
同步非阻塞IO和异步IO的区别是什么?
非阻塞IO是应用直接到kernel(linux)的buffer取数据,如果buffer是空的,就直接返回了。
异步IO的取数据(如aio_read),根本不是到kernel的buffer取数据,他只是发一个指令(一般带一个应用层的buffer)到kernel,告诉kernel我要读数据,让kernel读到的数据到放应用层的buffer。调用者不干具体事情,读数据,放数据到buffer是kernel帮忙搞定。


同步,异步的概念本来是通信领域的, 很难解释清楚, 但我肯定他跟阻塞非阻塞完全没有任何关系。
在这里的同步异步, 我个人的理解是函数调用的时候的同步异步。
其实同步方式很好理解, 例如你调用一个function,   当这个function执行完后, 这个方法实现的功能已经完成。这里往往会跟阻塞混淆,其实是因为你采用了同步方式执行代码,才阻塞了你的thread或者process,而不是因为阻塞,才叫同步。
异步方式就不提供这种保证, 当你用异步方式调用一个function的时候,这个方法会马上返回,事实上多数情况
下这种function call只是向某个任务执行体提交一个任务而已。 而你的主thread可以继续执行其他的事情, 不必等待(阻塞), 而当那个任务执行体执行完你提交的这个任务后,它会通过某种方法callback给你的thread, 告诉你,你的这个任务已经完成。
实际上,在目前的应用中, 很少有真正实现异步IO的(AIO), 听说(Windows 完成端口跟bsd kqueue实现了, 只是听说而已), 而通过select/poll等实现的不能算是AIO,只能说是个类似的或者是假冒的。
因为用select/poll实现的情况下,他们多半都是把调用thread作为执行体thread的。

 类似资料: