锁定老帖子 主题:JAVA NIO 简介
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-09
楼主的文章写的真不错,很容易理解,谢了!
|
|
返回顶楼 | |
发表时间:2010-12-10
很基础 如果能够深入点就更好了。nio的东西还是蛮多的。 需要细细研究
|
|
返回顶楼 | |
发表时间:2010-12-15
nice!正在看这方便的,你讲的很好。谢谢了
|
|
返回顶楼 | |
发表时间:2011-01-17
我还是有许多疑惑。
加入某一个线程在执行read方法而阻塞的时候,他是仍然占用CPU执行时间,还是立刻转让执行权,还是转让执行权并且进入阻塞队列里? |
|
返回顶楼 | |
发表时间:2011-01-17
明白了。。至少没有进入阻塞队列。
|
|
返回顶楼 | |
发表时间:2011-01-19
xiaojiaqiao 写道 NIO在实现上还是同步的,有些概念性的东西要说明一下。所谓同步就是io操作时还是会阻塞进程,所谓异步是io操作由操作系统内核完成后把结果返回给你。阻塞与非阻塞就是在发起io操作之后,是否会一直阻塞到完成io操作,是就是阻塞,反之是非阻塞。同步/异步与阻塞/非阻塞是两个概念。
在NIO中,selector返回触发注册事件的selectionkeys之后,还需要调用channel的方法去完成io操作,所以NIO是同步非阻塞的。在JAVA7中实现了AIO,NIO2.0,开始提供异步io的api。 我也有相同的疑问。表面上看线程是不阻塞了,但是其实里头还是有阻塞的,只不过是对通知进行阻塞,交到了selector去统一管理而已。 这跟操作系统上的IO模型基本是一致的,只不过是select模型而已,并不是IO重叠。这种方式有局限性,LINUX上的select模型其实是通过对FD进行轮训,而默认的配置是最多1024. 关于IO的文章,大家可以看看这里:http://www.ibm.com/developerworks/cn/linux/l-async/ 这篇文章写得很棒。AIO相当于windows上的IOCP吧 |
|
返回顶楼 | |
发表时间:2011-01-20
最后修改:2011-01-20
按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
上面是引用 dennis_zane 写的一篇文章里的关于IO分类的描述。 我觉得楼主连一些基本概念都没搞清,就在这里扯淡。 |
|
返回顶楼 | |
发表时间:2011-01-23
zy8643954 写道 按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。 上面是引用 dennis_zane 写的一篇文章里的关于IO分类的描述。 我觉得楼主连一些基本概念都没搞清,就在这里扯淡。 你好!谢谢你的严谨!关于阻塞和非阻塞及异步IO的概念理解有些不妥,异步IO这块确实是java7里才提供支持,本处这个概念块我会尽快修改。 关于这块IO的概念,本账号里另外一个作者已经做了较明确的定义,请参考http://alicsd.iteye.com/admin/blogs/868702 (深入浅出异步IO模型) |
|
返回顶楼 | |
发表时间:2011-01-23
记录一下,很好。
|
|
返回顶楼 | |
发表时间:2011-01-24
zy8643954 写道 按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO服用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。 上面是引用 dennis_zane 写的一篇文章里的关于IO分类的描述。 我觉得楼主连一些基本概念都没搞清,就在这里扯淡。 你这个理解也是有误的,不能照本宣科。同步异步,阻塞非阻塞是可以自由组合的。 |
|
返回顶楼 | |