由BIO与NIO的区别到select、poll、epoll的粗浅理解

早上看到个面试题,说下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。

这就是目前对他们的梳理。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值