JAVA “NIO”之我解

关于JAVA "NIO" 相关资料网上太多,如果你在网上一搜结果里一般就会说什么bio是一个线程处理一个tcp连接,什么调用read就阻塞直到有内容,而nio是通过单线程轮询方式,不会产生线程阻塞;然后就贴出一堆关于Socket ServerSocket,SocketChannel ServerSocketChannel的代码,让人感到疑惑到底什么是NIO

其实看到这些概念我是懵逼(上面说的都没有错,只不过这些都不是我想要了解的层次)

在最开始我没有明白NIO到底是JAVA独有的东西还是其他语言普遍存在的一个概念?它到底是操作系统支持的?还是通过api设计而达到的某种特性?

它到底是一个什么东西?

通过 

https://blog.csdn.net/qq_34638435/article/details/81878301

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后线程不阻塞,可继续做其他事情

阻塞:内核接收到调用后,依次完成

                   1、从网络中获取到数据

                   2、将数据从内核内存拷贝到应用内存过程后返回返回值

非阻塞:内核收到调用后,根据实际情况返回返回值(有数据就返回数据,没有数据也返回一个标记)

 

通过下面这张图可以比较清晰的看出JAVA api和操作系统(以linux为例)是如何配合来实现多路复用IO的

(JAVA端:客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理)

 

附:网络IO模型比较

over

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章