JAVA “NIO”浅析

关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值