如果调用非阻塞式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的。