您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页Java中阻塞IO和非阻塞IO

Java中阻塞IO和非阻塞IO

来源:百家汽车网

一、阻塞IO模型
最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核回去看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才会接触block状态。典型的阻塞IO模型的列子为:data = socket.read() 如果数据没有就绪,就会一直阻塞在read方法。
二、非阻塞IO模型
当用户线程发起一个read操作后,并不需要等待,而是马上就得到一个结果。如果结果是一个error时,他就知道数据还没有贮备好,于是可以再发送read操作。一旦内核中的数据准备好了,并且又再次收到了线程用户的请求,在非阻塞IO模型中用户线程需要不断询问内核数据是否就绪,也就是说非阻塞IO不会交出CPU,而会一直占用CPU。典型的非阻塞IO模型一般如下:
while(true){
data = socket,read();
if(data != error){
处理数据
break;
}
}
对于非阻塞IO有一个问题,那就是在while循环中需要不断地去询问内核数据是否就绪,这样就会导致COU占用率非常高,因此一般情况下很少使用while这种循环方式读取数据
三、多路复用IO模型
多路复用IO模型是目前使用比较多的模型。Java NIO实际上就是多路复用的IO。在多路复用IO模型中,会有一个线程不断去轮训多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要简历新的进程或者线程,也不必维护这些线程和进程,并且只有在真正socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。在Java NIO中,是通过selector.select()去查询每个通道是否有达到事件,如果没有事件,则一直阻塞在那里,因此这种方式导致用户线程的阻塞。多路复用IO模式,通过一个线程就可以挂历多个socket,只有当socket真正有读写事件发生才会占用资源来进行实际的读写操作。因为,多路复用IO比较适合连接比较多的情况。
另外多路复用IO为何比非阻塞IO模型的效率高是因为在非阻塞IO中,不断询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮训每个socket状态在内核进行的,这个效率比用户线程效率高的多。
不过要注意的是。多路复用IO模型是通过轮训的方式来检测是否有事件到达,并且对到达的事件注意进行响应。因此对于多路复用IO模型来说,一旦事件响应体很大,那么就会导致后续的事件迟迟得不到处理,并且会影响到新的事件轮询。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务