1.先解释同步和异步:
同步异步是一种通信机制。
同步:调用方需要保持等待直到I/O操作完成。
异步:调用方可以不用保持等待,只需要操作系统完成I/O操作通知调用方就可以了。
2.再说说阻塞和非阻塞:
阻塞非阻塞是一种调用机制。
阻塞:调用方等待I/O操作完成后才返回,就是阻塞的。
非阻塞:调用方不需要等待IO操作完成就立即返回。非阻塞的情况下,常常需要多次调用去check,才能获得IO操作的结果。
3.
2*2的比较
同步阻塞
调用者发起I/O操作请求,等待I/O操作完成再返回。
同步非阻塞
调用者发起I/O操作请求,询问I/O操作的状态,如果未完成,则立即返回,该调用者不断主动询问操作系统是否完成I/O操作;如果完成,则返回结果.
异步阻塞
调用者发起I/O操作请求,等待I/O操作完成再返回。I/O操作的过程不需要等待,操作完成后通过通知或回调获得结果。
异步非阻塞
调用者发起I/O操作请求,询问I/O操作的状态,如果未完成,则立即返回;如果完成,则返回结果。I/O操作的过程不需要等待,操作完成后通过通知或回调获得结果。
4.Reactor的读为例:
同步I/O
应用程序注册读就需事件和相关联的事件处理器 ,事件分离器等待事件的发生, 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器, 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理。
5.Proactor的读为例:
异步I/O
应用程序初始化一个读操作,然后注册相应的事件处理器, 事件分离器等待读取操作完成事件, 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户 传递过来的缓存区中。这也是区别于Reactor,Proactor中,应用程序需要传递缓存区。 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。
总结:
两个模型的区别在于对读时间的操作者。前者是用户程序自己执行读和写,后者是用户程序把缓冲区给了交给内核,内核读或写完成以后通知应用程序。