BIONIOAIO及java中NIO 与netty的 IOCP区别联系

Posted 菠萝科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIONIOAIO及java中NIO 与netty的 IOCP区别联系相关的知识,希望对你有一定的参考价值。

1 有人能说清楚JAVA7 NIO NETTY IOCP之间的联系吗?

 原文链接:https://www.zhihu.com/question/20853629

不过这似乎是3年前的问题?

还没有找到答案吗?

那我说一下吧

iocp和poll/epoll这些是操作系统层面的东西

iocp是win,poll(linux和unix)

后者在linux上可以改成epoll,在mac或bsd上可以改成kqueue,性能更佳,使用netty的native transport特性,在vert.x最新版本中亦支持这两种优化,很爽的

nio是java或者说jvm层面的东西,说白了就是基于iocp&poll的一个统一的java接口

netty是jvm之上框架层面的东西,说白了就是一个基于nio的框架

可以看到三个层次,后者基于前者

操作系统是啥?windows,macosx,linux(其实这个是kernal,你懂的,不懂百度下就有)

jvm是虚拟机,是我们经常需要安装的这么一个东西,这个虚拟机以及开发工具(jdk)

定义了一个nio的api,封装了操作系统的这些网络接口,java是跨平台的嘛

所以在我们使用java的这些api的过程中,不需要去区分是哪个操作系统

最终暴露给java用户的,是一个统一的api,这个api就是nio

除了nio以外,还有aio以及bio,bio就是阻塞api,nio和nio2(aio)都是非阻塞api

阻塞非阻塞解释下去会有很大一段,这个写不完,有空在说了

那nio封装了操作系统的网络接口之后呢

还是不太好用,所以有一个叫做trustin lee的韩国人说,既然这么不好用,我来搞一搞

于是他封装出了一个高性能的网络库,这就是netty,netty本质上是在nio之上做了又一层的封装

因为nio的api用起来不是那么容易,相比之下netty更简单点

据说初衷是对于tomcat的api效率不满意,于是自己搞了一个

然后netty只负责处理网络io部分,后来又有一个人叫做tim fox

他到了red hat之后遇到了trustin lee,于是在trustin的指导下,他跟norman等人

将他在vmware时候制作的node.x(基于node.js原理)结合actor model等制作出了vert.x

这就是vert.x的由来,现在netty主要是在apple工作的norman主要维护

trustin已经不怎么贡献了,忙于他们韩国社交公司line的事业中去了

tim也已经从vert.x的位置上退下来,上个月刚进facebook伦敦

所以这三个东西其实是三个不同层次的东西

os(iocp&poll)->nio(jvm)->netty(lib)

后者依赖前者,加上vert.x就是

os(iocp&poll)->nio(jvm)->netty->vert.x

如果考虑netty的native transport的优化的话

os(iocp&poll/epoll&poll/kqueue)->nio(jvm)->netty->vert.x

这个仅仅是网络io,如果是硬盘io的话,vert.x会直接使用aio,而不是nio

网络io主要是netty在负责

本文转载自:https://blog.csdn.net/wabiaozia/article/details/79097761

 

 

2 BIO&NIO&AIO

 原文链接:https://zhuanlan.zhihu.com/p/28539046

3 Java NIO浅析 

https://zhuanlan.zhihu.com/p/23488863

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户端程序。最后延展到一些高级主题,如Reactor与Proactor模型的对比、Selector的唤醒、Buffer的选择等。

同步非阻塞:

美团点评技术团队(作者)回复王嘿嘿
阻塞与非阻塞指的的是当不能进行读写(网卡满时的写/网卡空的时候的读)的时候,I/O 操作立即返回还是阻塞;同步异步指的是,当数据已经ready的时候,读写操作是同步读还是异步读,阶段不同而已。

本文转载自:https://blog.csdn.net/wabiaozia/article/details/79097761

4 Java NIO 系列教程 注意看评论里 lzzzl 的总结

http://www.iteye.com/magazines/132-Java-NIO

youdianjin 2017-12-08 20:53
按照POSIX标准,IO分为同步IO和异步IO,其中同步IO包括BIO(同步阻塞) 和 NIO (同步非阻塞)。
NIO (同步非阻塞)基于事件驱动机制,实现上采用Reactor模式;
AIO(异步IO),同样采用事件驱动机制,实现上采用Proactor模式。

5 Java进阶之路--看代码和图

https://zhuanlan.zhihu.com/p/31321140

上一章所述Unix中的五种I/O模型,除信号驱动I/O外,Java对其它四种I/O模型都有所支持。其中Java最早提供的blocking I/O即是阻塞I/O,而NIO即是非阻塞I/O,同时通过NIO实现的Reactor模式即是I/O复用模型的实现,通过AIO实现的Proactor模式即是异步I/O模型的实现。????

选择器(Selector),零拷贝

Java NIO中提供的FileChannel拥有transferTo和transferFrom两个方法,可直接把FileChannel中的数据拷贝到另外一个Channel,或者直接把另外一个Channel中的数据拷贝到FileChannel。

精典Reactor模式,多工作线程Reactor模式,多Reactor

本文转载自:https://blog.csdn.net/wabiaozia/article/details/79097761​​​​​​​​​​​​​​

6 JAVA NIO 不是同步非阻塞I/O吗,为什么说JAVA NIO提供了基于Selector的异步网络I/O?

https://www.zhihu.com/question/27991975

java nio的io模型是同步非阻塞,这里的同步异步指的是真正io操作(数据内核态用户态的拷贝)是否需要进程参与。

而说java nio提供了异步处理,这个异步应该是指编程模型上的异步。基于reactor模式的事件驱动,事件处理器的注册和处理器的执行是异步的。

应用程序的一次io分成两个阶段,第一阶段是io请求,指的是应用程序通知操作系统我有io的意向,给我准备数据或者空间。第二阶段是io操作,指的是操作系统将io请求所需的数据或者空间已经准备好,可以进行真正的数据拷贝(数据在用户态内核态之间的拷贝)。

阻塞非阻塞发生在io的第一阶段io请求时,当操作系统并没有将io请求所需的数据或者空间准备好时,io请求的线程是否等待来区分。如果线程等待直到io请求所需的资源准备好那么这个就是阻塞。如果线程不等待,那么就是非阻塞,那么不等待如何知道资源已经准备好啦呢?一种方式是轮询,一种方式就是通知。

链接:https://www.zhihu.com/question/27991975/answer/71988550

7  http://tutorials.jenkov.com/java-nio/index.html

Java NIO enables you to do non-blocking IO. For instance, a thread can ask a channel to read data into a buffer. While the channel reads data into the buffer, the thread can do something else. Once data is read into the buffer, the thread can then continue processing it. The same is true for writing data to channels.

以上是关于BIONIOAIO及java中NIO 与netty的 IOCP区别联系的主要内容,如果未能解决你的问题,请参考以下文章

JAVA BIONIOAIO详解(附代码实现)以及Netty的简介

Java IO模型:BIONIOAIO

Netty系列BIONIOAIO通信差异

java nio及操作系统底层原理

java nio及操作系统底层原理

Java面试题|BIONIOAIO有什么区别?