关于JAVA "NIO" 相关资料网上太多,如果你在网上一搜结果里一般就会说什么bio是一个线程处理一个tcp连接,什么调用read就阻塞直到有内容,而nio是通过单线程轮询方式,不会产生线程阻塞;然后就贴出一堆关于Socket ServerSocket,SocketChannel ServerSocketChannel的代码,让人感到疑惑到底什么是NIO
其实看到这些概念我是懵逼(上面说的都没有错,只不过这些都不是我想要了解的层次)
在最开始我没有明白NIO到底是JAVA独有的东西还是其他语言普遍存在的一个概念?它到底是操作系统支持的?还是通过api设计而达到的某种特性?
它到底是一个什么东西?
通过
阻塞IO与非阻塞IO_万年精魄的博客-CSDN博客_非阻塞io
https://www.cnblogs.com/binarylei/p/8933516.html#同步非阻塞-io-nonblocking-io
解开了我部分疑惑;NIO是一种网络IO模型,Linux中提出来的(windows中是否实现?如何实现?)
自然而然一上来就是各种socket代码了(JAVA中也提供了文件相关的Channel)。
Java里的NIO是New Input/Output的简称,提供了各种输入输出相关的api,包括文件IO、网络IO(多路复用IO模型的实现:ServerSocketChannel相关api,AIO模型的实现:AsynchronousSocketChannel相关api)等;
以下是我对同步 异步,阻塞 非阻塞的理解:
同步与异步指的是数据获取的行为:
同步:调用方自己去内核拷贝数据到应用内存
异步:内核把数据填充到应用内存,不需要调用方拷贝这些数据
阻塞与非阻塞说的是线程的状态:
阻塞:应用线程发起第内核api调用后,应用程序只能等待api返回
非阻塞:应用程序发起api调用后,不需要管返回值(不等待也不对返回值做处理,可能根本就没有返回值),而执行其后续代码
通过下面这张图可以比较清晰的看出JAVA api和操作系统(以linux为例)是如何配合来实现多路复用IO的
(JAVA端:客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理)
附:网络IO模型比较
over