发展:
BIO -> NIO -> AIO
BIO就是我们传统意义上的IO,它的特点是阻塞的。例如以前我们进行网络编程时,一个客户端使用一个线程来进行处理。这样会导致一个问题:服务器的线程数是有限制的,而不是每个客户端时时都有数据进行传输的。所以大量空的线程占了位置,但是又不工作,导致服务器的性能受限。
这会涉及到4次上下文切换和4次拷贝。
第一次切换:从用户态切换到内核态,将数据读取到内核
第二次切换:从内核态切换到用户态,读取返回
第三次切换:从用户态切换到内核态,将数据拷贝到内核
第四次切换:从内核态切换到用户态,写完返回
四次拷贝:
1.通过DMA将数据从硬件拷贝到内核
2.通过CPU将数据从内核拷贝到用户缓冲
3.通过CPU将数据从用户缓冲拷贝到内核
4.从内核写入到硬件
NIO:一个请求对应一个线程,解决BIO高并发的问题。
会涉及到3次拷贝,2次切换:
第一次拷贝:从硬件到内核空间
第二次拷贝:从内核空间到socket buffer
第三次拷贝:从socket buffer到protocol engine
第一次切换:从用户态切换到内核态,数据通过DMA将数据拷贝到内核
第二次切换:数据写完到硬件后返回,从内核态切换到用户态
BIO和NIO对比:
BIO基于流,而NIO基于 Buffer. BIO 只能按照顺序读,而NIO可以随意读。
感谢支持,我会更加努力分享,喜欢的朋友可以关注下专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。最后针对高频常问面试题我还总结出了适合于1-5年以上开发经验的java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。免费获取方式:加入Java进阶之路:[878249276]
网友评论