1、关于异步:
java中异步请求就是*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
2、阻塞式I/O模型:默认情况下,所有套接字都是阻塞的。
一个输入操作通常包括两个不同阶段:
(1)等待数据准备好;
(2)从内核向进程复制数据。
3、非阻塞式I/O: 进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把进程投入睡眠,而是返回一个错误。看看非阻塞的套接字的recvfrom操作如何进行
就是IO不阻塞即使没有数据可读,或者空间可写时。异步IO都返回,不管如何情况。简单点的意思就是进程不会阻塞在你读写调用异步IO系统调用的时候。所以你的执行流可以去做其它的事情,当你确实要确认数据读写成功的时候,你在用aio_return这个函数去判断读写成功了吗。如果你想耗费cpu那你就一值调用aio_return轮询结果。如果想睡眠等待读写完成,那么你调用aio_suspend这个函数,你就会睡眠,当读写完成时,内核会发信号给你,这时,就会执行信号处理函数,并唤醒此进程。要充分理解异步IO,最好把信号和异步通知一起搞懂。如果会写驱动的话,最好自己去实现IO的这些功能,比如阻塞IO,非阻塞IO,轮询,异步通知,异步IO等等,其中又涉及到并发和竞争的问题。
以套接字为例,在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。
对于UDP协议而言,由于UDP没有发送缓存,因此所有UDP协议即使在阻塞模式下也不会发生阻塞。
对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。
姓 名:
联系电话:
留言备注:
我要留言(留言后专人第一时间快速对接)
已有 1826 企业通过我们找到了合作项目