对nio的初步理解

敲代码的小小酥 敲代码的小小酥     2022-10-21     308

关键词:

前言

项目中简单用到了Netty,因此特意对NIO进行了一些了解。发现NIO和Netty篇幅庞大,不是几天可以熟悉掌握的,因此打算后面特意花时间好好学习一下,这里先记录一下已经学习的,对NIO的一些简单理解。

BIO

说NIO之前,首先了解BIO。BIO是阻塞IO,是面向流的。对于面向流的理解,就是从socket中读取字节流或者写入字节流。阻塞如何理解呢?主要表现为两方面:
①若一个服务器启动就绪,那么主线程就一直在等待着客户端的连接,这个等待过程中主线程就一直在阻塞。
②在连接建立之后,在读取到 socket 信息之前,线程也是一直在等待,一直处于阻塞的状态下的。

对于第一点的理解,即服务器启动了一个服务,就阻塞线程不往后执行,直到第一个客户端连接它,代码才往后执行。
对于第二点的理解,即调用accept()后,只要监听到一个客户端的连接,那么只有等这个客户端发送消息后,才会监听到第二个客户端的连接,如果第一个accept了第一个客户端,而这个客户端迟迟不发消息,那么线程就一直阻塞,第二个客户端此时就无法进入服务端的accept方法,第二个客户端也无法发送消息,只有等第一个客户端发送消息之后,第二个客户端才能发送。

可见,BIO的阻塞是多个socket连接同一个服务时,socket之间造成了相互阻塞。为了解决阻塞问题,一般使用线程池去accept监听,一个客户端创建一个线程,来避免多个socket之间带来的阻塞。但是当客户端连接多的情况下,线程池可扩展性就变得差了起来。于是就出现了NIO。

NIO

面向缓冲
所谓的缓冲,是NIO自己创建的一块儿缓冲空间,应用程序读数据或者写数据,都直接和缓冲空间进行交互。缓冲空间再和底层操作系统进行交互。而在面向流的BIO中,字节流是直接和操作系统进行交互的。因此,在NIO中,多了一个缓冲区,在这个缓冲区中,数据的处理就更加灵活,可以前后移动指针来选择数据进行处理。

非阻塞IO
Java NIO 的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
线程通常将非阻塞 IO 的空闲时间用于在其它通道上执行 IO 操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)

三大核心组件
NIO 有三大核心组件:Selector 选择器、Channel 管道、buffer 缓冲区。这里先简单了解一下这三个角色的作用。NIO使用的是Reactor模式,后面再详细学习这个模式。
Selector是选择器,用来注册Channel和Channel感兴趣的IO事件(连接、读、写等)。Selector可以理解成一个负载均衡的功能,IO事件发生后,Selector去查找注册在它这里的channel,选择对应的channel来处理相应的IO事件。

Channel通道,被建立的一个应用程序和操作系统交互事件、传递内容的渠道(注意是连接到操作系统)。那么既然是和操作系统进行内容的传递,那么说明应用程序可以通过通道读取数据,也可以通过通道向操作系统写数据,而且可以同时进行读写。所以,channel本质是对socket的有一层封装。在BIO里直接使用socket对操作系统进行读写数据,而在NIO中使用channel对操作系统进行读写数据。

buffer缓冲区就是面向缓冲的缓冲区,用于和 NIO 通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存(其实就是数组)。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。

这里只谈一下对NIO的理解。具体的API使用暂不进行研究,后面单独进行研究。

NIO理解
由上述介绍可知,NIO与BIO的区别就是面向流与面向缓冲的区别、阻塞与非阻塞的区别。NIO是在应用程序与底层操作系统交换数据时做了一系列操作。而底层操作系统对网络的读写事件都是一样的,是不受NIO影响的。因此,NIO是在应用程序和操作系统之间读写数据而做出的优化。当网络不佳或者操作系统级别的IO传输有问题时,NIO也爱莫能助。

应用场景
NIO适用于大量连接,大量IO事件的场景。非阻塞提高了性能。如果业务场景里连接客户端不多,IO事件也不多,使用BIO也可以满足需求。

最后

更多内容学习后面单独学习,包括AIO、Netty等网络传输知识。

对yield的初步理解

1defgo():2whileTrue:3data=14r=yielddata#data是返回值,r是接收值5print("data",data)6print("A1",r)7data+=189r=yielddata10print("data",data)11r+=r12print("A2",r)13data+=11415r=yielddata16print("data",data)17print 查看详情

对nio和bio的进一步理解

疑问在之前的学习中,只提到BIO是阻塞IO,在建立连接和读写事件时会阻塞线程。NIO是非阻塞IO,基于事件注册,通过Selector进行切换Channel,不会阻塞线程。对于这种解释,还是带有一些疑问的。Selector进行... 查看详情

java:nio初步了解

简介:JavaNIO(NewIO)是一个可以替代标准JavaIOAPI的IOAPI(从Java1.4开始),JavaNIO提供了与标准IO不同的IO工作方式。JavaNIO:ChannelsandBuffers(通道和缓冲区)标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Bu... 查看详情

lucenenumericrangequery的初步理解

...umericRangeQuery,首先需要理解Lucene是如何存储数值类型.文本初步探讨了Int和Float两种数值类型在Lucene中的存储实现,数值类型的分词原理, 最后给出NumericRangeQuery的简单理解.Lucene最初设计是实现全文检索功能,即只处理字符串.因此... 查看详情

makefile学习----初步理解

一.我对makefile的理解:经过一段时间对makefile的学习,我理解的makefile就是将程序员手动编译源文件的过程用一个脚本执行,这对于小型项目来说,程序员手动执行和用makefile来执行感官上可能没有大的差异,但是对于中大型项目... 查看详情

对quartz定时任务的初步认识

今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看代码是如何实现的,首先有两种实现的方式,一... 查看详情

数据结构导论初步理解

   如今已经来到了大数据的时代,所以我们对数据的了解要更加的深刻。才可以更加理解数据这个词所代表的含义。   watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Cen 查看详情

对nio和bio的进一步理解

...换,是否阻塞线程呢?带着这种疑问,进一步理解了NIO知识,下面记录一下。BIO的阻塞应用程序采用BIO方式调用read()方法后,底层调用Linux系统的read方法,从内核缓冲区读取数据,如果内核缓冲区没有... 查看详情

深入理解nio(代码片段)

...列在看完前面两个系列之后,相信大家对NIO也有了一定的理解,接下来我们就来深入源码去解读它,我这里的是OpenJDK-8u60版本,建议大家也下一份放ide里和我一起看会比较好理解。(这里主要介绍Selector,Buffer第一篇有提到一点... 查看详情

jndi的初步理解

1.JDNI是什么意思?答:JNDI是javanaminganddirectoryinterface的缩写,是j2ee开发中的一种重要的规范 2.JNDI有什么用?答:如果没有JNDI,那使用JAVA连接数据库的时候是这样的(如下),如果数据库名称,用户名,密码改变需要对JAVA源代码进行... 查看详情

卷积神经网络的初步理解lenet-5(转)

深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功。本人在多年之前也曾接触过神经网络。本系列文章主要记录自己对深度神经网络的一些学习心得。  第二篇,讲讲经典的卷积神经网络。我不打算详细... 查看详情

面试官:谈谈你对io流和nio的理解(代码片段)

一、概念NIO即NewIO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在JavaAPI中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。... 查看详情

现在的状态——软件思路初步成型

  知道想要做什么,可是找不到头绪。  不是那么清楚想做,有一个模糊的印象。大体是软件方面组织好了,自身价值增长,应该有足够的信心去找一些工作,或者发现一些生活中的事情。  现在对软件的思考达到了一个... 查看详情

深入理解java中的nio

前言:传统的IO流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致CPU使用效率大大降低。所以,jdk1.4发布了NIO包,NIO的文件读写设计颠覆了传统IO的设计,采用通道+缓存区使得新式的IO操作直接面向缓存区,... 查看详情

js数据类型的初步理解

1、js中的类型字符串、数字、布尔、数组、对象、Null、Undefined①基本数据类型null、undefined、boolean、number、stringconsole.log(typeof1);//numberconsole.log(typeof"a");//stringconsole.log(typeofnull);//objectconsole.log(typeofundefined 查看详情

call的初步理解

首先说下call的本质是一个函数模拟下:Function.prototype.call=function(context){  //this表示某函数,函数里面的this先被替换成context,然后再执行  this.bind(context);  this();}然后理解这个Function.prototype.call.call(context);//相当于this.bind(context 查看详情

邹传伟:对人民银行dc/ep的初步分析

http://opinion.caixin.com/2019-11-01/101477903.html【财新网】(专栏作家邹传伟)2019年10月24日,习总书记在中央政治局第十八次集体学习中指出“区块链技术应用已延伸到数字金融”。理解数字金融的关键,是理解人民银行DC/EP(Dig... 查看详情

css初步理解

  近期在学习牛腩的时候遇到了网页的制作。挺新奇的。其中涉及到了有关CSS的知识,于是乎自己也就花费两个小时的时间。找了本浅显易懂的书来看了一遍,从宏观上来了解CSS的相关内容。有关CSS的基础知识详见下链接... 查看详情