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