注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

Java7的异步IO 赞+1  

2011-11-05 04:29:51|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Java7的异步IO是多年以前就期待的东西了,居然拖了这么多年才正式发布。理论上说aio这样的Proactor模型的缓冲区直接由内核填充,可以比epoll这样的Reactor模型省一次内存复制,性能会更好些。但实际上Java处理一遍数据消耗的时间远远超过缓冲区的一次规整复制,所以实际上在Linux上应该看不出和nio相比的改善。当然,在Windows中新的异步IO用“完成端口”实现,和nio的实现WSAEventSelect比那是快得多了。

新的异步IO另一意义在于其API是事件的,用户能方便的编写CPS风格代码。而nio的话,除非用上netty、mina这样笨重的框架,不然用户自己写Selector神马的,还得多写几百行乏味的代码。(PS: mina和netty的作者都是同一个,代码绕来绕去,封装得也不好,API超复杂,我很不喜欢该设计。)

新的异步IO最后的好处是为各种PC操作系统提供了统一的覆盖网络和磁盘IO的高性能API,不论是服务器还是客户端编程都能使用。这也算是这几年操作系统API逐渐完善的一个标志吧。Windows方面,完成端口在Windows 9x中是没有的。Windows 2000有完成端口,但是网络方面支持不完备,仅仅只有收发两个函数支持,accept和connect都是Windows XP和Windows Server 2003中逐渐加入的。Linux方面则是2.6的某个版本才加入了,记得与epoll似乎是同一年放出来的(但开发者普遍都习惯用select/poll,更容易转到epoll上,所以没什么人用aio)。

其实我一直觉得电驴、BT和迅雷之类的软件应该要用完成端口来读写文件会比较好。完成端口除了不阻塞提交任务的线程以外,还不占用磁盘缓存,对系统的内存管理压力小,不会莫名其妙拖慢系统。电驴、BT分享文件的时候,本来内置了分块功能,只要分块和硬盘簇对齐,应用程序自己缓存就够了。

  评论这张
 
阅读(981)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018