【NIO】之IO和NIO的区别

在Java1.4之前的版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临以下几个问题:

1、没有数据缓存区,I/O性能存在问题

2、没有C/C++通道的概念,输入和输出流是相互独立的不能复用

3、同步阻塞式I/O通信(BIO),造成线程资源被长时间阻塞(致命缺陷)

4、硬件可移植性差,支持的字符集编码有限

根据UNIX网络编程的概念,I/O模型有五种

详情请查看这篇文章

UNIX五种网络I/O模型

在没有JavaNIO之前呢,基于Java的所有的所有的Socket通信都采用了同步阻塞式模型(BIO)这种请求<->应答的通信模式降低了开发难度,但是在性能和可靠性方面存在巨大缺陷,因此大型应用服务器都是C/C++语言开发,因为他们可以直接操作系统提供的异步的I/O或者是AIO能力。当并发访问量增大,响应时间延迟增大之后,采用JavaBIO开发的服务器只能通过硬件扩容来满足高并发和低延时,极大增加了企业成本。

正是由于JavaBIO的不足,Java1.4版本之后提供了新的NIO库,支持非阻塞式I/O操作。

JavaNIO提供了很多的异步I/O开发和API类库,主要的类和接口如下:

进行异步I/O操作的缓存区ByteBuffer

进行异步I/O操作的管道Pipe

进行各种I/O操作(异步或者同步)的Channel,包括ServerSocketChannel和SocketChannel

多种字符集编码能力和解码能力

实现非阻塞I/O操作的选择器Selector

基于流行Perl实现的正则表达式库

 

 了解NIO必须先了解几个概念

什么是同步
什么是异步
什么是阻塞
什么是非阻塞
什么是同步阻塞
什么是同步非阻塞
什么是异步阻塞
什么是异步非阻塞

 

 

 

 

 

 

 

 

技术语言解释:

 同步:当一个进程去访问另一个进程时,必须得到一个结果(指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪)

异步:当一个进行访问另一个进程时时,不用立刻给结果,我会告诉你一个信息,你把结果放在这里,通知我即可(异步I/O就是Java将I/O读写操作委托给操作系统,告诉操作系统将数据放到哪个缓存区,数据大小)

阻塞:当一个进程去操作某个资源时发现这个资源不在或者暂时不可操作,那么这个进程就一直等,等可以操作

非阻塞:当进程发现没有资源可操作的时候立刻返回读写函数,而不会等待

生活中的例子:

同步:比如电话好友,那么无论打通还是打不通,都会得到回应,(用户接通了,用户正在通话,用户已关机等信息)

异步:比如叫餐,我们APP下单之后就可以做其他的事情,你只需要告诉地址,电话,食物到了送餐员会打电话通知你

阻塞:比如收费站堵车,这个就最能代表阻塞,你只能等着啥干不了

非阻塞:比如到银行排队办理业务,那么我们会拿一张排号小票,就可以去做其他事情,到号就会叫你!

网上有一个例子

同步阻塞:到饭店吃饭点餐,在那里等着不停的问,菜好了吗?菜好了吗?

同步非阻塞:点完餐,直接去打球,不过你需要隔一段时间来问一次,菜好了吗?

异步阻塞:菜做好饭店打电话给你让你亲自去拿。

异步非阻塞:菜做好,饭店直接送到球场

所以我们归纳:

同步和异步是针对应用程序和内核的交互而言的,

1、同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,

2、异步是指用户进程触发I/O操作以后便开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。

阻塞和非阻塞是针对于进程在访问数据的时候,根据I/O操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,

1、阻塞方式下读取或者写入函数将一直等待

2、而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 

所以,I/O操作可以分为3类:同步阻塞(即早期的I/O操作)、同步非阻塞(NIO)、异步(AIO)。 

 

BIO

在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。

NIO

在Java里的由来,在JDK1.4及以后版本中提供了一套API来专门操作非阻塞I/O,我们可以在java.nio包及其子包中找到相关的类和接口。由于这套API是JDK新提供的I/O API,因此,也叫New I/O,这就是包名nio的由来。这套API由三个主要的部分组成:缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。在理解NIO的时候,需要区分,说的是New I/O还是非阻塞IO,New I/O是Java的包,NIO是非阻塞IO概念。这里讲的是后面一种。

NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。

NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。
也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

AIO

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:

AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

 

转载于:https://www.cnblogs.com/gyjx2016/p/7219983.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mono环境下访问SSL

由于MONO没有CA证书&#xff0c;所以访问SSL链接&#xff08;HTTPS&#xff09;就会出错&#xff0c;这时候只要强制访问就可以。 using System.Net.Security;using System.Security.Authentication;using System.Security.Cryptography.X509Certificates; private static bool…

JavaOne 2012:使用HTML5和Java构建移动应用程序

我返回了Parc 55 &#xff08;任务会议室&#xff09;&#xff0c;观看Max Katz的&#xff08; Exadel开发人员关系&#xff09;“用HTML5和Java构建移动应用程序” Bird-of-Feather&#xff08;BoF&#xff09;演示。 具体来说&#xff0c;Katz在Tiggzi &#xff08;基于云的应…

HDU 2602.Bone Collector-动态规划0-1背包

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 85530 Accepted Submission(s): 35381 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

java线程实现排序_【多线程实现快速排序】

快速排序算法实现文件QuickSort.javapackage quick.sort;import java.util.concurrent.Callable;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class QuickSort implements Callable{private int[] array;private final in…

使用Gitolite搭建Gitserver

Gitolite是一款Perl语言开发的Git服务管理工具。通过公钥对用户进行认证。并可以通过配置文件对些操作进行基于分支和路径的精细控制。Gitolite採用的是SSH协议而且使用SSH公钥认证。因此不管是管理员还是普通用户。都须要对SSH有所了解。Gitolite的官网是&#xff1a;https://…

java任务分支和合并_合并/分支战略

我会给出与Adarsh Shah相同的建议&#xff0c;因为在大多数情况下&#xff0c;2个分支(MAIN&#xff0c;RELEASE)就足够了&#xff0c;并且使用feature branches用于你不想立即提交到MAIN的东西&#xff0c;因为它需要一段时间才能完全准备好测试 . 通过RELEASE&#xff0c;我指…

Spring安全:防止暴力攻击

Spring Security可以为您做很多事情。 帐户被封锁&#xff0c;密码盐。 但是蛮力阻断剂呢&#xff1f; 那是你必须自己做的。 幸运的是&#xff0c;Spring是一个非常灵活的框架&#xff0c;因此对其进行配置并不是什么大问题。 让我向您展示一些如何针对Grails应用程序执行…

NopCommerce计划任务

NopCommerce计划任务转载于:https://www.cnblogs.com/chenjz/p/6293210.html

简单谈谈js中的MVC

MVC是什么&#xff1f; MVC是一种架构模式&#xff0c;它将应用抽象为3个部分&#xff1a;模型&#xff08;数据&#xff09;、视图、控制器&#xff08;分发器&#xff09;。 本文将用一个经典的例子todoList来展开&#xff08;代码在最后&#xff09;。 一个事件发生的过程&a…

BTrace:Java开发人员工具箱中的隐藏宝石

这篇文章是关于BTrace的 &#xff0c;我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全&#xff0c;动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序&#xff08;类似于DTrace&#xff0c;适用于OpenSolaris应用程序和OS&#xff09;。 不久&am…

python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频

要注意&#xff1a;1. 图片传视频要自己设置帧率和分辨率2.读取图片后分辨率要resize为和视频分辨率一样才可以3.写完.avi视频后视频比较大&#xff0c;用ffmpeg将avi视频压缩为mp4import cv2from cv2 import VideoWriter, VideoWriter_fourcc, imread, resizeimport osfrom su…

门面模式

门面模式的定义 门面模式&#xff08;Facade Pattern&#xff09;也叫做外观模式&#xff0c;是一种比较常用的封装模式&#xff0c;其定义如 下&#xff1a; Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface tha…

Mysql数据库申请

前段时间大部门下新成立了一个推广百度OCR、文字识别、图像识别等科技能力在金融领域应用的子部门。因为部门刚成立&#xff0c;基础设施和人力都是欠缺的。当时分到我们部门的任务是抽调一个人做新部门主站前端开发工作。本来说的是只负责页面的开发工作。当我参加过需求品审会…

Spring–添加SpringMVC –第2部分

在上一部分中&#xff0c;我们为经理和员工实现了控制器。 既然我们知道了解决方法&#xff0c;我们将做很少&#xff08;但仅做很少&#xff09;更复杂的事情–任务和时间表的控制器。 因此&#xff0c;让我们从org.timesheet.web开始。 TaskController 。 首先创建一个类&…

php 正则分隔_探讨PHP函数split()如何使用正则表达式切割字符串

对于初学者来说&#xff0c;掌握PHP中常用函数的用法&#xff0c;是其继续学习的基础。今天我们就为大家详细介绍有关PHP函数split()的一些使用方法&#xff0c;希望大家能通过这篇文章介绍的内容增加自己的知识库。说明array split ( string $pattern, string $string [, int …

通用的ProtostuffSerializer for Java

以前使用 protobuf或protostuff的时候觉得很麻烦&#xff0c;每个类都要单独定制&#xff0c;于是封装了一个类。 同事测试过&#xff0c;性能和压缩率都很好&#xff0c;尤其是相比json的序列化。 需注意&#xff1a;只支持Pojo类&#xff08;即需要有get/set方法&#xff09;…

SAS笔记(6) PROC MEANS和PROC FREQ

PROC MEANS和PRC FREQ在做描述性分析的时候很常用&#xff0c;用法也比较简单&#xff0c;不过这两个过程步的某些选项容易忘记&#xff0c;本文就梳理一下。 在进入正文前&#xff0c;我们先创建所需的数据集TEST_SCORES&#xff1a; DATA TEST_SCORES; INPUT COUNTY : $9. SC…

休眠:保存vs持久并保存或更新

save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题&#xff0c;就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save &#xff0c; saveOrUpdate和persist等方法将对象保存到数据库中的方法。…

php搜索数据库设计,PHP数据库搜索功能设计

其实搜索功能的设计很简单&#xff0c;几行代码就可以完成。下面是form表单。从表单发出的数据名为search&#xff0c;然后发送到../admin/article_SearchResult.php这个文件处理。下面讲下article_SearchResult.php这个文件如何实现搜索。$searchs $_POST[‘search‘];?>…

2016 Android Top 10 Library

过去的 2016 年&#xff0c;开源社区异常活跃&#xff0c;很多个人与公司争相开源自己的项目&#xff0c;让人眼花缭乱&#xff0c;然而有些项目只是昙花一现&#xff0c;有些项目却持久创造价值&#xff0c;为开发者提供了极大的便利&#xff0c;这些终究由时间来判断。今天&a…