个人关于NIO的理解

一、同步、异步、阻塞、非阻塞的联系和区别

同步和异步是针对于应用程序和内核的交互而言的,阻塞和非阻塞是针对用户进程访问数据而言的。

同步:用户进程触发IO操作后,就一直等待或者轮询直到IO操作完成。

异步:用户进程触发IO操作后,就可以开始做自己的事,等到IO完成后会收到一个通知。

阻塞:读取数据时,如果没有数据可读,就一直等待知道有数据可以读取。

非阻塞:读取数据时,没有数据可读,就立刻返回。

 

二、NIO的产生

刚刚我们阐述了同步、异步、阻塞、非阻塞。这是理解IO与NIO的基础。

IO是一个同步阻塞的IO。由于同步阻塞,则在IO操作时,我们也不能做其他事情。很浪费资源。而且,传统IO是针对链接的,而NIO可以针对事件(因为传统IO么有select函数)。针对链接,意味着,一个链接要对应一个线程,链接中的事情没做完,线程不退出,100个链接就有100个线程维护着。考虑用线程池可以减少线程创建与销毁咯。但是如果线程池支持的最大连接数是100,那101个请求过来的时候,就没法接受啊,因为面向链接的力度太大了,很多事情都在要一个链接里完成,那么这个链接肯定非常耗时。比如一个连接里有链接、读取、写入操作吧。这个连接的创建到结束的周期肯定很长。

那如果用NIO,有select,所以可以针对事件处理,就相当于把一个链接拆成好几个等分,那处理每个等分的时间肯定相对于要少一点。如上例,可以把一个连接拆成链接、读取、写入操作。那么针对这些细力度的事件,处理时间肯定较少了,使线程的职责更加单一简单。你是想让100个吃饭,另外200个人就看着。还是让300个人轮流着一人吃一点呢?

 

三、NIO的核心要素与IO的区别。

首先说一下IO与NIO的区别

IO

NIO

面向流

面向缓冲

阻塞

非阻塞

选择器

 

接下来说一下NIO的核心:

Channel

buffer

select

NIO的所有读写都需先读写到Buffer里,而buffer里是由capacity、limit、postion三个位置指针维护,有这三个指针可以对buffer做很多操作,使处理更加灵活。而IO面向流,一次读取一个字符或一个字节,直到读完。其次,IO流是单向的,所以有inputStream和outputStream,而NIO是使用channel对缓冲进行读写,这个channel是双向的。最后NIO有选择器,选择器的优势就不谈了。在NIO的产生里说得很清楚了。

 

四、Reactor和Proactor

 

Reactor的基础是NIO,Proactor的基础是AIO。所以Reactor更关注与事件的产生,而Proactor更关注事件的完成。例如前者收到一个读取事件,则在程序中维护读取事件的全过程。而Proactor则收到一个读取完成时间,只要维护读取完成后的操作即可。数据的读取是先由硬盘读到缓存的,再由缓存读到程序。那Reactor则维护了全过程,Proactor只需要维护读取到缓存后的工作即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值