2.2Android调研

来源:互联网 发布:淘宝菜鸟驿站 编辑:程序博客网 时间:2024/06/05 06:49

经常看到这个东西,称在调研,就看看。先极力推荐个帖子https://zhuanlan.zhihu.com/p/23488863,没看多少,感觉感触良多。总结下呗。

问题来源,也就是我现在用的,来一个客户端,我要开2个线程(一个负责发,一个负责收),客户端一多,1000个咋办,

1:像Java的线程栈一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半;

2:线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。

3:线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高(系统负载)、CPU sy(sy 内核空间占用CPU百分比)使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

4:容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

因此有了NIO。

然后先是提了Reactor模式,推荐这个链接的理解http://daimojingdeyu.iteye.com/blog/828696。假如没理解错的话,比喻得挺到位的。

优点都在说,缺点的话,我觉得不适合传大东西吧,因为他不开多线程,传大东西的时候,其他响应就慢了吧。

推荐:http://blog.csdn.net/u010168160/article/details/53019039。原理上差不多理解,但是这个代码,依旧不是很理解。

提到了Proactor,http://blog.csdn.net/caiwenfeng_for_23/article/details/8458299,评论里说对IO的讲解有问题,以我现在的水平,还是不太理解。。慢慢再深入吧。


最后,NIO存在的问题

使用NIO != 高性能,当连接数<1000,并发程度不高或者局域网环境下NIO并没有显著的性能优势。

NIO并没有完全屏蔽平台差异,它仍然是基于各个操作系统的I/O系统实现的,差异仍然存在。使用NIO做网络编程构建事件驱动模型并不容易,陷阱重重。

推荐大家使用成熟的NIO框架,如Netty,MINA等。解决了很多NIO的陷阱,并屏蔽了操作系统的差异,有较好的性能和编程模型。

总结

最后总结一下到底NIO给我们带来了些什么:

事件驱动模型
避免多线程
单线程处理多任务
非阻塞I/O,I/O读写不再阻塞,而是返回0
基于block的传输,通常比基于流的传输更高效
更高级的IO函数,zero-copy
IO多路复用大大提高了Java网络应用的可伸缩性和实用性


也是,一开始的理解,大多会模糊点,看后期的项目考验了。