早上看到个面试题,说下BIO与NIO的区别,
我快速回想了下
BIO是同步阻塞IO,B是block的缩写,它监听请求,阻塞在那里,直到收到读或写,才继续往下执行。
NIO是可以同步非阻塞IO,N是new的缩写,它监听请求,IO的读写非阻塞,而是加入了通道(channel)这个概念。这样太形式化了,或者我换下我自已觉得舒服的白话文形式来说道。
我要获取一个IO操作,比如getIO();
BIO所谓阻塞,就是getIO这个方法一定要有IO就绪结果才返回。然后代码才能继续执行下去。
NIO所谓的非阻塞,就是getIO直接返回当时请求的结果,可能这时IO未就绪,也不管。代码不管结果如何先执行下去先。
问题来了,我就要IO操作去进行读写结果你NIO非阻塞返回一个空给我搞毛。莫慌,再去getIO一下嘛,由于是非阻塞的,getIO即刻又返回了,可能还是没有结果,那就继续get下去,总有结果的。
到这里,BIO的阻塞与NIO的非阻塞好像一样啊,我BIO就在getIO那里一直等到有读写才执行。你NIO虽然在getIO不阻塞了,但你后续还是要不断循环getIO到有读写才执行啊,不一样是阻塞了?
是的,如果硬是要获取某个请求的读写IO来说,其实是阻塞的,BIO就是阻塞一到到结果返回,NIO虽然不阻塞直接返回了,如果为空,还是要不断循环去获取,说白了还是阻塞。
他的好处是什么呢?
getIO没值的其间我可以先干点别的,过会再来getIO一下呀,就这么简单
这干点别的就到select、poll与epoll出场了。
select就是将io请求封装放在数组中,由于数组是连续的内存空间,所以占的空间不能大,只能最大1024个请求。
poll则是将io请求封装在链表中,链表嘛,不受连续空间限制,所以理论上与机器内存相关,受限于linux自身的限制最大可以6万多请求
epoll则是事件驱动,理论是可以处理无限请求。
NIO同步非阻塞底层的IO多路复用底层就是select与poll与epoll。且jdk1.5后linux环境默认的NIO多路复用就是用的epoll。
这就是目前对他们的梳理。