java中的io与nio主要区别在于阻塞上
io采用的是阻塞
nio可自定义
阻塞与非阻塞到底有什么不同?其底层是怎么实现的呢?
从内核的角度来理解,就是进程的阻塞 运行状态的切换
阻塞实际上是进程在等待资源,而资源没有就绪(如网卡数据没到来),那么进程就进入阻塞状态。
这个进程什么时候再投入运行呢 ---- 等网卡数据到来时即可继续运行了
阻塞IO的缺点是占用了一个进程,却让这个进程在阻塞队列中睡大觉
好比我请了一个工人干活却因为水泥没到,只好让工人傻等着,还得管吃管住,白白浪费资源
阻塞式IO数量比较少的时候问题不明显,并发稍微大一些系统就吃不消了,如有1000个进程都在阻塞,那么你的机器估计什么都干不了了,资源全浪费了
那位大哥问了,浪费的是什么资源?
是这样的,系统能够创建的进程是有上限的 最大几千个吧
如果有1000个处在阻塞中是不是一种浪费呢
另外就是进程调度,这么多的阻塞进程参与进程调度,会浪费一些时间
======================================
非阻塞进程是怎么工作的呢?
非阻塞进程去读取网卡数据,如果数据没来 则立即返回而不是在那儿傻等
返回后进程可以继续干别的事情,等网卡的数据来了会主动通知进程的
这样就使进程化被动为主动了
非阻塞IO的威力在于作为Server端,接收客户端高并发请求时
只需要启动一个进程即可处理成千上万的客户端请求,充分利用了资源
======================================
[color=red]网上很多人都说nio提高性能,我个人不太认同
nio只是数据读写的方式与以往不同,数据的传输速度没有任何变化,处理速度也没有变化
如有一个网络数据包在12:00到达网卡,那么它不会因为采用了IO或NIO而改变到达时间
这个数据包处理需要20ms,同样它不会因为采用了IO或NIO而缩短处理时间
NIO只是提高了资源的利用率[/color]
io采用的是阻塞
nio可自定义
阻塞与非阻塞到底有什么不同?其底层是怎么实现的呢?
从内核的角度来理解,就是进程的阻塞 运行状态的切换
阻塞实际上是进程在等待资源,而资源没有就绪(如网卡数据没到来),那么进程就进入阻塞状态。
这个进程什么时候再投入运行呢 ---- 等网卡数据到来时即可继续运行了
阻塞IO的缺点是占用了一个进程,却让这个进程在阻塞队列中睡大觉
好比我请了一个工人干活却因为水泥没到,只好让工人傻等着,还得管吃管住,白白浪费资源
阻塞式IO数量比较少的时候问题不明显,并发稍微大一些系统就吃不消了,如有1000个进程都在阻塞,那么你的机器估计什么都干不了了,资源全浪费了
那位大哥问了,浪费的是什么资源?
是这样的,系统能够创建的进程是有上限的 最大几千个吧
如果有1000个处在阻塞中是不是一种浪费呢
另外就是进程调度,这么多的阻塞进程参与进程调度,会浪费一些时间
======================================
非阻塞进程是怎么工作的呢?
非阻塞进程去读取网卡数据,如果数据没来 则立即返回而不是在那儿傻等
返回后进程可以继续干别的事情,等网卡的数据来了会主动通知进程的
这样就使进程化被动为主动了
非阻塞IO的威力在于作为Server端,接收客户端高并发请求时
只需要启动一个进程即可处理成千上万的客户端请求,充分利用了资源
======================================
[color=red]网上很多人都说nio提高性能,我个人不太认同
nio只是数据读写的方式与以往不同,数据的传输速度没有任何变化,处理速度也没有变化
如有一个网络数据包在12:00到达网卡,那么它不会因为采用了IO或NIO而改变到达时间
这个数据包处理需要20ms,同样它不会因为采用了IO或NIO而缩短处理时间
NIO只是提高了资源的利用率[/color]