欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NIO前世今生

程序员文章站 2022-03-07 19:20:49
...
发展:

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可以随意读。

相关标签: NIO BIO 零拷贝